オブザーバビリティの世界へようこそ。
システムが巨大化し、マイクロサービスが複雑に絡み合う現代において、多くのエンジニアが陥る「呪い」があります。それは「グラフで異常は見つけたが、その詳細を知る術がない」という呪いです。
ダッシュボードでレイテンシのスパイクを見つけ、そこからログを必死に検索し、分散トレーシングの画面を開き直して…そんな「迷路のような調査」に時間を溶かすのはもう終わりにしましょう。
今日は、Prometheusの奥義「Exemplar(エグゼンプラー)」について解説します。これを知れば、グラフ上の点からトレースIDへ、瞬時にワープできるようになります。
—
1. Exemplarとは何か?:メトリクスとトレースの「架け橋」
通常、Prometheusのメトリクス(ヒストグラムなど)は「統計情報」です。「1秒間に何件のリクエストがあり、平均レイテンシはどれくらいか」はわかりますが、「あの異常なスパイクを引き起こした『たった一つの具体的なリクエスト』はどれか?」は分かりません。
Exemplarは、メトリクスの中に「特定のトレースID(TraceID)」を埋め込む仕組みです。
- メトリクス: 全体の傾向(森を見る)
- トレース: 個別の実行経路(木を見る)
Exemplarは、この二つを紐付けるための「座標」です。
—
2. さあ、実装しよう:最小構成のセットアップ
Prometheus 2.26以降であれば、特別なプラグインは不要です。最も重要なのは、アプリケーション側で「トレースIDをPrometheusに送る」ことです。
手順①:Prometheusの設定
`prometheus.yml` でExemplar機能を有効にします。
prometheus.yml
global:
scrape_interval: 15s
scrape_configs:
- job_name: ‘my-app’
# Exemplarの受信を許可(重要)
scrape_protocols: [PrometheusProto, OpenMetricsText1.0.0]
static_configs:
- targets: [‘localhost:8080’]
手順②:アプリケーション側の実装(例:Go)
OpenTelemetryを利用している場合、非常にシンプルに記述できます。重要なのは、`Histogram`に`TraceID`をアタッチすることです。
// 擬似コード:OpenTelemetry SDKを用いた例
observer, _ := meter.Float64Histogram(“http_request_duration_seconds”)
// 特定のリクエストのコンテキストからTraceIDを取得し、値と共に記録
observer.Record(ctx, duration,
metric.WithAttributes(attribute.String(“endpoint”, “/api/v1/data”)),
metric.WithExemplar(attribute.String(“trace_id”, currentTraceID)), // ここが肝!
)
—
3. なぜこれが「現場で震えるほど」役立つのか
設定が終わると、Grafanaの景色が変わります。
1. グラフ上に「点」が現れる:
Prometheusのヒストグラムグラフに、小さな星印(Exemplar)が表示されます。
2. ワンクリック・ジャンプ:
その星印をクリックすると、ツールチップに`TraceID`が表示されます。
3. 解決への直行:
設定しておけば、Grafanaのリンク機能により、そのIDでJaegerやTempoの画面が直接開き、「なぜそのリクエストだけが遅かったのか」という真実が、1秒で見えるようになります。
これまでログ検索に費やしていた30分が、たったの3秒に短縮されるのです。
—
4. 運用のための「極限の知見」:注意点とコツ
この機能を使いこなすための、プロのヒントを授けます。
- カーディナリティに注意:
Exemplarはすべてのサンプルに付けるものではありません。ヒストグラムのバケット内で「代表的なサンプル」を間引いて保持するイメージです。IDが多すぎるとメモリを圧迫するため、異常値(高レイテンシ)に絞って送るのが賢い設計です。
- サンプリングとの組み合わせ:
すべてをトレースするのはコストの無駄です。頭の良いアーキテクトは「エラー時」や「レイテンシの閾値を超えた時」にだけExemplarを付与するように制御します。
- GrafanaのData Link設定:
Grafanaのパネル設定で `Data Links` を開き、以下のURLスキームを設定してください。
`https://your-jaeger-url/trace/${__value.labels.trace_id}`
これで、クリックした瞬間にトレースの詳細画面が目の前に現れます。
—
最後に:オブザーバビリティの本質
オブザーバビリティとは、単にツールを導入することではありません。「未知の障害に対して、どれだけ早く問いを立て、答えに辿り着けるか」という、エンジニアの知的生産性の戦いです。
Exemplarを導入するということは、システムの「統計的な顔」の裏側に、常に「生きたリクエストの鼓動」を繋いでおくということです。
これを設定したその日から、あなたの夜間障害対応は「暗闇での手探り」から「地図を持った冒険」に変わります。さあ、今すぐコードにトレースIDを忍ばせてみてください。あなたのプロダクトの透明度が、劇的に変わるはずです。