collector の役割
- エージェント - エージェント インスタンスは、サーバーや Kubernetes ノード上などのエッジでデータを収集するほか、OpenTelemetry SDK でインストルメントされたアプリケーションからイベントを直接受信することもできます。後者の場合、エージェント インスタンスはアプリケーションとともに、またはアプリケーションと同じホスト上で (サイドカーやデーモンセットなどとして) 実行されます。エージェントは、データを ClickHouse に直接送信することも、ゲートウェイ インスタンスに送信することもできます。前者は Agent deployment pattern と呼ばれます。
- ゲートウェイ - ゲートウェイ インスタンスは、独立したサービス (たとえば Kubernetes 上のデプロイメント) として提供され、通常はクラスターごと、データセンターごと、またはリージョンごとに配置されます。これらは、単一の OTLP エンドポイントを介して、アプリケーション (またはエージェントとして動作する他の collector) からイベントを受信します。通常は複数のゲートウェイ インスタンスをデプロイし、それらの間で負荷を分散するために標準のロードバランサーを使用します。すべてのエージェントとアプリケーションがこの単一のエンドポイントにシグナルを送信する場合、これは Gateway deployment pattern と呼ばれることがよくあります。
collectorのデプロイ
- Managed ClickStack
- オープンソース版 ClickStack
Managed ClickStack へ送信する際は、可能であればゲートウェイロールに collector の公式 ClickStack ディストリビューションの使用を推奨します。独自の collector を使用する場合は、ClickHouse エクスポーターが含まれていることを確認してください。collector は、Helm (Kubernetes 環境での使用を推奨) または Docker を使用してデプロイできます。公式の ClickStack Helm チャート は、ClickStack のディストリビューションイメージをあらかじめ設定した状態で、上流の OpenTelemetry Collector Helm チャート をサブチャートとして組み込んでいます。HyperDX を含むフルスタック全体をインストールする場合は、ClickStack Helm デプロイメントガイド を参照してください。standalone の collector デプロイメントの場合は、以下に示すように、上流のチャートを ClickStack イメージと直接組み合わせて使用できます。対象の ClickHouse インスタンスは、環境変数 ClickStack 版の OTel collector では、カスタム設定ファイルをマウントし、環境変数を設定することで、ベース設定を拡張できます。カスタムの receiver、プロセッサ、またはパイプラインを追加するには、次の手順に従います。スタンドアロン collector を使用してデプロイする:より複雑な設定については、デフォルトの ClickStack collector 設定およびClickHouse exporter のドキュメントを参照してください。
- Helm
- Docker
OpenTelemetry のアップストリーム Helm リポジトリを追加します。ClickStack イメージと Managed ClickStack の認証情報を設定する チャートをインストールします。本番環境へのデプロイでは、
values.yaml を作成します。CLICKHOUSE_PASSWORD の値を直接埋め込むのではなく、Kubernetes Secret に保存して extraEnvsFrom 経由で参照することを推奨します。CLICKHOUSE_ENDPOINT、CLICKHOUSE_USERNAME、CLICKHOUSE_PASSWORD を使用して設定します。CLICKHOUSE_ENDPOINT には、プロトコルとポートを含む完全な ClickHouse Cloud HTTP エンドポイントを指定してください (例: https://99rr6dm6v3.us-central1.gcp.clickhouse.cloud:8443) 。Managed ClickStack の認証情報の取得方法については、こちらを参照してください。本番環境用ユーザー本番環境では、適切な認証情報を持つユーザーを使用してください。
設定の変更
Managed ClickStack インスタンスの設定
OpenTelemetry collectorは、環境変数CLICKHOUSE_ENDPOINT、CLICKHOUSE_USERNAME、CLICKHOUSE_PASSWORD を通じて、Managed ClickStack インスタンスを使用するよう設定できます。これらの設定方法は、デプロイメント方法によって異なります。- Helm
- Docker
values.yaml の extraEnvs で該当するエントリを上書きしてから、リリースをアップグレードします。collector の設定を拡張する
- 追加設定を含むカスタム設定ファイルを作成します
- ファイルを
/etc/otelcol-contrib/custom.config.yamlにマウントします - 環境変数
CUSTOM_OTELCOL_CONFIG_FILE=/etc/otelcol-contrib/custom.config.yamlを設定します
カスタム設定では、新しい receiver、プロセッサ、パイプラインのみを定義します。ベースのプロセッサ (
memory_limiter、batch) と exporter (clickhouse) はすでに定義されているため、名前を指定して参照してください。カスタム設定はベース設定にマージされるため、既存のコンポーネントを上書きすることはできません。設定構造
receivers、operators、processors など、OTel collector の設定方法の詳細については、OpenTelemetry collector の公式ドキュメントを参照することを推奨します。Docker Compose
Docker Composeを使用する場合は、上記と同じ環境変数を使用してcollectorのconfigurationを変更します。collector の保護
- Managed ClickStack
- オープンソース版 ClickStack
デフォルトでは、ClickStack OpenTelemetry collector は、オープンソース版以外でデプロイした場合は保護されておらず、OTLP ポートでの認証も不要です。インジェストを保護するには、collector のデプロイ時に 本番環境では、あわせて、以下も推奨します。これは、collector がデータベース
OTLP_AUTH_TOKEN 環境変数で認証トークンを指定します。設定方法はデプロイ方法によって異なります。- Helm
- Docker
values.yaml の extraEnvs に OTLP_AUTH_TOKEN を追加し、その後リリースをアップグレードします。OTLP_AUTH_TOKEN と CLICKHOUSE_PASSWORD を Kubernetes Secret に保存し、extraEnvsFrom 経由で参照することを推奨します。- collector が ClickHouse と HTTPS 経由で通信するよう設定する。
- 権限を限定した、インジェスト専用のユーザーを作成する。詳細は以下を参照してください。
- SDK/agent と collector 間の通信を暗号化するため、OTLP エンドポイントで TLS を有効にする。これは custom collector configuration で設定できます。
インジェスト用ユーザーの作成
Managed ClickStack にインジェストするために、OTel collector 専用のデータベースとユーザーを作成することを推奨します。このユーザーには、ClickStack が作成して使用するテーブル を作成し、それらに insert できる権限を付与してください。otel を使用するように設定されていることを前提としています。これは環境変数 HYPERDX_OTEL_EXPORTER_CLICKHOUSE_DATABASE で制御できます。ほかの環境変数と同様に、これを collector に渡してください。処理 - フィルタリング、変換、エンリッチ
- フィルタリングや処理を行う独自の OTel collector をデプロイし、イベントを OTLP 経由で ClickStack collector に送信して ClickHouse に取り込む。
- 独自の OTel collector をデプロイし、ClickHouse exporter を使用してイベントを ClickHouse に直接送信する。
-
プロセッサ - プロセッサは、receiver が収集したデータを変更または変換し、エクスポーターに送信する前に処理します。プロセッサは、collector 構成の
processorsセクションで設定された順序どおりに適用されます。これらは任意ですが、最小限のセットを使うことが通常は推奨されています。ClickHouse とともに OTel collector を使用する場合、プロセッサは次のものに限定することを推奨します。 - memory_limiter は、collector でメモリ不足が発生するのを防ぐために使用します。推奨事項については、Estimating Resources を参照してください。
- コンテキストに基づくエンリッチを行うプロセッサ。たとえば、Kubernetes Attributes Processor を使うと、spans、メトリクス、logs の resource attributes を k8s メタデータで自動的に設定できます。たとえば、イベントに送信元ポッドの id を付与できます。
- traces に必要な場合の Tail or head sampling。
- Basic filtering - operator 経由で実施できない場合に、不要なイベントを破棄します (以下を参照) 。
- Batching - ClickHouse を扱う際には、データをバッチで送信するために不可欠です。「Optimizing inserts」 を参照してください。
- 演算子 - Operators は、receiver で利用できる最も基本的な処理単位です。基本的なパースがサポートされており、Severity や Timestamp などのフィールドを設定できます。ここでは JSON や regex のパースに加えて、イベントのフィルタリングや基本的な変換もサポートされています。イベントのフィルタリングはここで行うことを推奨します。
例
regex_parser) やイベントをフィルタリングする演算子に加えて、イベントをバッチ化し、メモリ使用量を制限する プロセッサ を使用している点に注目してください。
file=code_snippets/ClickStack/config-unstructured-logs-with-processor.yaml
挿入の最適化
バッチ化
- (1) データを受信するノードに問題がある場合、INSERT クエリは timeout するか、より具体的な error を返し、確認応答は返されません。
- (2) ノードがデータを書き込めたとしても、ネットワークの中断によって確認応答をクエリの送信元に返せない場合、送信元は timeout またはネットワーク error を受け取ります。
timeout に達する前に batches を flush するため、pipeline 全体の end-to-end latency を低く保ちつつ、batches のサイズも一定に保てます。
非同期挿入を使用する
timeout に達すると小さなバッチが送信されます。これは問題の原因になることがあり、そのような場合に非同期挿入が必要になります。なお、ゲートウェイとして動作する ClickStack collector にデータを送信している場合、この問題が発生することはまれです。collector が集約ポイントとして機能し、この問題を緩和するためです。詳しくは collector の役割 を参照してください。
大きなバッチを確実に用意できない場合は、Asynchronous Inserts を使って、バッチ化を ClickHouse に委ねることができます。非同期挿入では、データはいったんバッファに挿入され、その後、データベースストレージに書き込まれます。
非同期挿入を有効化すると、ClickHouse ① が INSERT クエリを受信した時点で、クエリのデータはまず ② メモリ内バッファに即座に書き込まれます。③ 次回のバッファ flush が行われると、バッファ内のデータはソートされ、part としてデータベースストレージに書き込まれます。なお、データはデータベースストレージに flush されるまで、クエリから検索できません。バッファ flush は設定可能です。
collector で非同期挿入を有効にするには、接続文字列に async_insert=1 を追加します。配信保証を得るため、wait_for_async_insert=1 (既定値) を使用することを推奨します。詳細は こちら を参照してください。
非同期 INSERT のデータは、ClickHouse のバッファが flush されると挿入されます。これは、async_insert_max_data_size を超過した後、または最初の INSERT クエリから async_insert_busy_timeout_ms ミリ秒が経過した後のいずれかで発生します。async_insert_stale_timeout_ms が 0 以外の値に設定されている場合は、最後のクエリから async_insert_stale_timeout_ms ミリ秒後にデータが挿入されます。これらの設定を調整することで、パイプラインのエンドツーエンドのレイテンシを制御できます。バッファ flush の調整に使用できるその他の設定は こちら に記載されています。一般には、既定値のままで十分です。
適応型非同期挿入も検討してください使用する エージェント の数が少なく、スループットは低い一方で、エンドツーエンドのレイテンシ要件が厳しい場合は、adaptive asynchronous inserts が役立つことがあります。一般に、ClickHouse で見られるような高スループットのオブザーバビリティのユースケースには適していません。
async_insert_deduplicate を参照してください。
この機能の設定に関する詳細は、ドキュメントページ または、より詳しい ブログ記事 を参照してください。
スケーリング
Kafka の追加
OTel collector の設定ClickStack OpenTelemetry collector ディストリビューションは、collector のカスタム設定 を使って Kafka に対応するよう構成できます。
リソースの見積もり
| ログ出力レート | collector エージェント に必要なリソース |
|---|---|
| 1k/秒 | 0.2CPU, 0.2GiB |
| 5k/秒 | 0.5 CPU, 0.5GiB |
| 10k/秒 | 1 CPU, 1GiB |
スキーマの選択: Map vs JSON
Map(LowCardinality(String), String) カラムに格納するテーブルを作成します。これはオブザーバビリティのワークロードに推奨されるスキーマです。JSON 型のスキーマは、属性キーのセットが小さく安定しているワークロードで評価できるよう、ベータ版として提供されています。
詳細な比較、各方式が適しているケース、JSON 型スキーマを有効にするために必要な env vars、ならびに移行手順については、Map vs JSON type を参照してください。