Skip to main content
All quickstarts
オブザーバビリティOSS

前提条件

作成するもの

OpenTelemetry では、すべてのトレーススパンに リソース属性 のセットが含まれます。これは、テレメトリーを生成した対象 (サービス名、ホスト、クラウドリージョン、Kubernetes ポッドなど) を表すキー・バリューのメタデータです。キーのセットはサービスや環境によって異なるため、これは ClickHouse の Map 型に適しています。キーは動的でアプリケーション固有ですが、通常は 1 行あたり数個しか含まれません。 このクイックスタートでは、clickhouse-local を使って CSVファイル から実際の OTel トレースデータを Map(LowCardinality(String), String) カラムを持つテーブルに読み込み、Map データのクエリ、フィルタリング、集計、最適化の方法を学びます。
1

サンプルデータをダウンロード

このデータセットには、デモ用マイクロサービスアプリケーションからエクスポートされた 6,120 件の OTel トレーススパンが含まれています。各行には、動的なキー・バリューのペアを JSON map として格納した ResourceAttributes カラムと SpanAttributes カラムが含まれます。 ファイルは、たとえば ~/data/data-otel-traces.csv のように、簡単に参照できるディレクトリに保存してください。data-otel-traces.csv をダウンロード (2.9 MB)1 行分のデータは次のようになります。
2

テーブルを作成してデータを読み込む

clickhouse-local を起動し、CSV に対応するスキーマで次のテーブルを作成します。 重要なカラムは ResourceAttributes Map(LowCardinality(String), String) です。OTel の属性キーは、比較的少数の同じ値が繰り返し現れるため、キー型に LowCardinality を使用しています。
次に、file テーブルエンジンを使って CSV を読み込みます。パスは、ファイルを保存した場所に合わせて調整してください。
データが読み込まれていることを確認します:
6,120行が表示されるはずです。
3

データをクエリする

特定のキーにアクセスする — 角括弧構文を使って、map から値を取り出します。行にそのキーが存在しない場合は、値の型の既定値が返されます (String の場合は空文字列) :
Mapの値でフィルタリング — 特定のサービス名に一致するすべてのスパンを見つけます:
キーが存在するか確認する — すべてのスパンに Kubernetes のメタデータが付いているわけではありません。mapContains を使うと、どのスパンに含まれているかを確認できます:
データセット全体で使われているすべてのキーを確認する — どのインストルメンテーションがデータを生成しているかを把握するのに役立ちます。
ARRAY JOINでMapを行に展開 — 各キー・バリューのペアを1行ずつに展開します。属性の一覧を作成したり、ダッシュボードにデータを渡したりするのに便利です。
mapFilter で Map をフィルタリング — 各スパンから Kubernetes 関連の属性のみを抽出します:
エラースパンとそのリソースのコンテキストを特定する — 通常のカラムフィルターとマップアクセスを組み合わせます:
4

-Map combinator を使って Map をキーごとに集計する

ClickHouse の -Map 集約コンビネータを使うと、任意の集約関数を Map カラムに適用し、各キーごとに独立して集計できます。結果も Map となり、キーごとに 1 つのエントリと、その集計済みの値が格納されます。これは、カウンターや Gauge が Map の値として保存される OTel メトリクスで特に有用です。これを確認するために、各行に HTTP ステータスコードごとの件数を Map(String, UInt64) として記録する小さなメトリクス テーブルを作成します。
次に、sumMap を使って、各サービスについてステータスコードごとの件数を合計します。
-Map 接尾辞は任意の集約関数と組み合わせて使えるため、minMapmaxMapavgMap も同様に簡単に使えます:
これを他の combinator と組み合わせることもできます。たとえば、sumMapIf を使うと条件付きで集計できます。ここでは、サービスですでにエラーが発生していた分単位のウィンドウだけを合計します。
OTel でこれが重要な理由: OTel collector が 1 分ごとのステータスコードの内訳を ClickHouse に書き込む場合、sumMap を使えば、それらを 1 回のクエリで時間単位や日単位の totals に集計できます。ARRAY JOIN も unpivot も不要で、キーの全体集合を事前に把握しておく必要もありません。どの行に現れたキーも、自動的に結果に含まれます。
5

頻繁にクエリするキー向けに最適化する

同じ Map キーで繰り返し絞り込みを行う場合 — host.name はその代表例です — それをマテリアライズドカラムとして抽出できます。こうすることで、クエリのたびに Map 全体を線形走査せずに済みます。
既存データに対しては、カラムをバックフィルします:
これで WHERE HostName = 'prod-cart-01' は、マップ全体ではなく、そのために用意された単一のカラムだけを読み取るようになります。これは、頻繁にクエリするあらゆる attribute について、OTel の ClickHouse スキーマで推奨されるパターンです。

要点

  • Map(LowCardinality(String), String) は OTel の属性に適した定番の型です。キー集合が変化しても柔軟に扱え、LowCardinality によってキーの保存効率も高く保てます。
  • ブラケット構文 (map['key']) は値にアクセスする最も一般的な方法ですが、線形走査になる点には注意してください。キーが数十個の map であれば問題ありませんが、数百個になると最適とはいえません。
  • マテリアライズドカラム は有効な手段です。map のキーが頻繁にフィルタ条件の対象になる場合は、それを実カラムに昇格させることで、索引付きの列指向アクセスが可能になります。
  • mapContains, mapKeys, mapValues, mapFilterARRAY JOIN を使えば、SQL の中だけで map データを調べたり変換したりできる、豊富な手段が得られます。
  • -Map aggregate combinator (sumMap, avgMap, maxMap など) は、行をまたいで各キーを個別に集計します。キー集合を事前に把握していなくても OTel メトリクスのカウンターを集約するのに最適で、ほかの集約関数コンビネータと組み合わせることもできます (たとえば sumMapIf) 。

次のステップ

次は、以下のクイックスタートをご覧ください。 また、リファレンスドキュメントでさらに詳しく確認することもできます。
ClickHouse Academy — Master ClickHouse with expert-designed training for every skill level

Check out the ClickHouse academy for on-demand and live training

最終更新日 2026年8月28日