Prometheus Exemplars:メトリクスとトレースの「断絶」を破壊せよ
「スパイクだ。原因を調べろ」。
深夜3時のアラートで叩き起こされ、Grafanaのグラフを眺める。99パーセンタイル値が跳ね上がっている。しかし、そこから先が地獄だ。ログを漁り、トレースIDを探し、Jaegerの検索画面を開く。この「コンテキストの切り替え」にどれだけの時間を浪費している?
オブザーバビリティの本質は「問いに対する答えを得るまでの時間を最小化すること」にある。Prometheus 2.26で導入されたExemplar(エグゼンプラー)は、その時間を秒単位に短縮する、我々エンジニアにとっての「特急券」だ。
今日は、単なる機能説明ではない。現場で確実に勝つための、Exemplarの魂の組み込み方を伝授する。
—
1. Exemplarとは何か?:メトリクスに「顔」を与える
従来のPrometheusメトリクスは、数百万のリクエストを「平均」や「ヒストグラムのバケット」という抽象的な数字に押し込めていた。これでは「なぜ遅いのか」という具体的な個別の事象は消え去ってしまう。
Exemplarは、「そのバケットに入ったリクエストのうち、代表的なトレースID」をメトリクスの中にメタデータとして直接埋め込む技術だ。
なぜこれが革命的なのか
- ゼロ・コンテキストスイッチ: グラフ上のスパイクをポチッと押すだけで、その瞬間のトレースに飛べる。
- 確実な因果関係: 「平均値」ではなく「実際にその遅延を引き起こしたリクエスト」を直接解析できる。
—
2. 実践:OpenTelemetryを活用した最短実装
Exemplarを有効にするには、Prometheus側での有効化と、アプリケーション側での計装が必要だ。
Prometheus側の設定(prometheus.yml)
まずはPrometheusがExemplarを受け入れられるようにする。これがないと始まらない。
prometheus.yml
global:
scrape_interval: 15s
TSDB設定でExemplarを有効化(デフォルトは有効だが明示推奨)
storage:
tsdb:
enable_exemplar_storage: true
# 保持期間。長すぎるとディスクを圧迫するので注意(現場では1-2日程度が妥当)
max_exemplars: 100000
アプリケーション側の実装(OpenTelemetry Goの例)
OpenTelemetryを使用しているなら、`Histogram`に自動的にトレースコンテキストが付与される。重要なのは「TraceIDがサンプリングされていること」だ。
// メトリクスへの登録例
// OpenTelemetry SDKを使っていれば、Contextから自動的にTraceIDを拾い上げる
histogram.Record(ctx, duration, attribute.String(“env”, “prod”))
—
3. Grafanaで「神速」の遷移を実現する
設定が完了したら、Grafanaで可視化だ。ここが最も重要な「現場のテクニック」である。
Grafanaのパネル設定
1. パネルの「Query」設定を開く。
2. 「Exemplars」セクションにある `Exemplar` のトグルをONにする。
3. Data Link を設定する。これが、グラフの点からトレースへ飛ぶための魔法の橋だ。
Data Link設定例:
- URL: `/explore?orgId=1&left=%5B%22now-1h%22,%22now%22,%22Tempo%22,%7B%22traceID%22:%22${__value.trace_id}%22%7D%5D`
- これで、グラフのドットをクリックするだけで、Tempo/Jaegerへ直接TraceID付きでジャンプできる。
—
4. テックリードとしての「現場の極意」
① 「全部」にTraceIDを入れない
全てのメトリクスにExemplarを入れると、メモリ消費量が跳ね上がる。「レイテンシ」と「エラーレート」のヒストグラムだけに絞ること。これが守備範囲を最適化するコツだ。
② チームで共有すべき「ラベルの命名規則」
チーム間でTraceIDの付与ルールがバラバラだと、Data Linkが壊れる。
- `trace_id` という名前で固定する。
- OpenTelemetryのSemantic Conventionsに従うこと。これだけで、他チームが作ったダッシュボードも即座に再利用可能になる。
③ 隠しコマンド(キーボードショートカット)
Grafanaで調査中、`shift + p` を押すとパネルの詳細設定が開く。ここでExemplarの表示設定を素早く切り替えるのが、デバッグ時のプロの所作だ。
—
5. 結論:オブザーバビリティは「つなぐ」力
Exemplarは単なる機能ではない。それは、メトリクスの「統計的な抽象」と、トレースの「個別の現実」を地続きにするためのアーキテクチャだ。
障害対応の現場において、「平均値」を眺めて溜息をつく時間はもう終わりだ。Exemplarを導入し、グラフのスパイクから直接「戦犯のリクエスト」を特定する。そのスピードこそが、サービスの信頼性を支える最強の武器になる。
さあ、今すぐ Prometheus を再起動し、Grafanaに魔法をかけよう。君のチームの平均対応時間(MTTR)は、今日から劇的に短くなるはずだ。
—
追伸:もし特定の言語フレームワークでの実装に詰まったら、いつでも聞いてくれ。アーキテクトとして、君のコードに最適な計装術を叩き込んでやる。