[OpenTelemetry 検証5] Grafana を使ってメトリクスを見てみる の続きです。
前回は Grafana Explore を使って Prometheus のメトリクスをグラフで可視化して遊んでみましたが、今回はそれらを応用してダッシュボードを作成し、複数のパネルを 1 画面にまとめて監視できる状態にしていきたいと思います。
また、Grafana はダッシュボードを UI から手動で作成するだけでなく、JSON ファイルをあらかじめ配置しておくことで起動時に自動読み込みする仕組み (プロビジョニング) をサポートしています。
本番運用中は基本的には手動で作成、変更することが多いのですが、今回はある程度再現性を持たせながら実装をしたいので、このプロビジョニングを利用しながら実装していきたいと思います。
ダッシュボードの設定に関しては以下に配置しています。
なお最初からここに配置してダッシュボードを作成するとかなり効率が悪いので、ある程度UI上で操作して内容が固まり次第ここに配置する順番が良いと思います。
❯ tree ./_docker/grafana/
./_docker/grafana/
├── grafana.ini
├── provisioning
│ ├── dashboards
│ │ ├── article-server.json // ダッシュボードの詳細な定義
│ │ └── dashboards.yaml // Grafana 起動時に JSON ファイルから自動的にダッシュボードを読み込む設定
│ └── datasources
│ └── datasources.yaml
└── setup.sh
4 directories, 5 files
以下設定内容の詳細です
こちらを設定して Grafana を起動すると以下のようなダッシュボードになります。

全て解説すると長くなるので、1つ目のダッシュボード、「HTTP Request Latency (Percentiles)」についてのみ触れます。
こちらは HTTP レイテンシ・リクエストレート・エラー率などを監視する用途で設定しており、p50 / p95 / p99 の 3 本の線を 1 つのグラフに重ねて表示するような設定にしています。
histogram_quantile(0.5, sum(rate(http_server_request_duration_seconds_bucket[5m])) by (le))
histogram_quantile(0.95, sum(rate(http_server_request_duration_seconds_bucket[5m])) by (le))
histogram_quantile(0.99, sum(rate(http_server_request_duration_seconds_bucket[5m])) by (le))

このグラフから以下が読み取れるかと思います。
まとめると、このグラフは 「大多数は高速だが、一部が極端に遅い」という偏った分布になっており、仮に p50 だけを監視していると問題を見逃すケースがあることを教えてくれるようなグラフになっています。
グラフの編集は簡単です。以下の画面から編集できます。

入力フォームに先ほどの promql をそれぞれ設定するようなイメージになります。

なお、現在のダッシュボードは、グラフからトレースなどの情報にアクセスできるような状態になっていないため、その設定をやってみたいと思います。
URLには以下のように設定します。
/explore?left={"datasource":"tempo","queries":[{"refId":"A","queryType":"traceql","query":"{}"}],"range":{"from":"${__from}","to":"${__to}"}}

備考:
article-server.json に設定を反映させる必要があります。dashboards.yaml に updateIntervalSeconds: 10 を設定しておくと、コンテナの再起動なども不要で json を変更して10秒後にブラウザをリロードすると設定が反映されているかと思います。設定が反映されると以下のように、ダッシュボードから Tempo のトレース画面に遷移することができます。


今回はプロビジョニング機能を使って Grafana ダッシュボードを自動読み込みし、HTTP レイテンシとリクエストレートを 1 画面で確認できる状態を作成してみました。
また、データリンクを設定することでメトリクスのグラフから Tempo のトレースの画面へ直接遷移できるようにする設定も行いました。ダッシュボードが洗練されていくと運用もかなり楽になるため、非常に強力な機能であると認識しました。
なお、ダッシュボードは一度作成して終わりではありません。運用を続けていくと色々な気づきが出てくるため、日々変化する事象にどれだけ気づいてダッシュボードに反映できるかが重要です。
次回はアプリケーション側を少し改修したいと思います。
具体的には、PostgreSQL のドライバである pgx にカスタムトレーサーを実装し、SQL クエリの実行を span として自動記録するような構成にしてみたいと思います。
OpenTelemetryで収集したメトリクスをGrafana Exploreで可視化する方法を解説。PromQLクエリを使用して記事閲覧数、リクエストレート、ステータス別件数、レイテンシを時系列グラフで分析。Prometheus UIより過去データ確認やタイムゾーン設定が便利な点を紹介。
OpenTelemetryのローカル検証環境をdocker-composeで構築。Go APIサーバーからOTLP経由でGrafana Alloyにテレメトリを送信し、Tempo/Prometheus/Lokiで収集・保存、Grafanaで可視化する構成を実装。各サービスの起動確認まで完了。
Prometheus UIを使用してOpenTelemetryで収集したメトリクスを検証する方法を解説。PromQLを用いた閲覧数集計、ステータス別集計、リクエストレート、レイテンシ分析など、実践的なクエリ例を紹介している。
Grafana × Alloy × Tempoを使用したOpenTelemetryのトレース検証。Grafanaで15件のリクエストから生成されたトレースを確認し、http-server、ArticleUsecase、ArticleRepositoryの3つのspanの階層構造と処理時間の内訳を分析。DB処理3%、usecase処理15%、HTTP処理82%の結果から、ボトルネック特定の有効性を実証。
Grafana × Loki を使用してログ検索・表示方法を解説。LogQL でのログ検索、ログ詳細表示、Trace との相互遷移機能を紹介。Log と Trace を組み合わせることで問題切り分けが効率化される利点を説明。