[OpenTelemetry 検証5] Grafana を使ってメトリクスを見てみる
はじめに
[OpenTelemetry検証4] Prometheus UI を使用してメトリクスを見てみる の続きです。
前回の記事 では Prometheus UI を使って PromQL によるメトリクスの検索・分析を実践しましたが、今回は同じクエリを Grafana Explore で実行し、グラフとして可視化していきたいと思います。
内容
早速見ていきます。
http://localhost:3000 にアクセスし、データソースを Prometheus に指定しておきます。

クエリの作成は Builder 形式ではなく、Code形式でいきます。※最近ではAIがその辺りのコードも作成してくれるためそっちのが早い
まずは、前回同様 article_views_total で、記事の閲覧数から見ていきます。
うまくデータが取れていると以下のような出力になるかと思います。

Prometheus UI の場合、Graph タブで同じように可視化することができるが、リアルタイムのデータがないとうまく表示されないですが、Grafana は時間範囲を指定するだけで過去データも合わせて確認できるのが便利です。
また、Grafana の場合はタイムゾーンの設定も自由に変更できるため、こちらも使い勝手がいいです。※もしかしたら Prometheus UI でもできるのかもしれないけどパッと見わからなかった
このグラフから読み取れることを整理すると以下です。
| 時間帯 | 出来事 |
|---|---|
| 〜21:25 | 累計 20 件前後で横ばい (アクセスなし) |
| 21:25〜21:30 | 累計 40 件に急増 (記事が閲覧された) |
| 21:35〜 | 累計 80 件に急増 (さらに記事が閲覧された) |
| 21:35〜22:10 | 横ばい (アクセスなし) |
各記事毎の累計値については以下のような見方になります。
| article_id | 累計 |
|---|---|
article-001 | 83 |
test-001 | 80 |
not-found | 77 |
また、グラフ上でより変動が大きい場所をマウスドラッグしながら指定することで簡単に詳細なグラフを表示することができます。

よく使うクエリをグラフで確認する
リクエストレートの推移
記事 ID ごとのアクセス数の増減をリアルタイムでグラフに表示できます。
rate(article_views_total[1m])
このグラフを表示しながら、以下で継続的にリクエストを投げてみると以下のようにリクエストがリアルタイムで反映されていることを確認できます。
for i in $(seq 1 60); do
curl -s http://localhost:8080/articles/article-001 > /dev/null
curl -s http://localhost:8080/articles/test-001 > /dev/null
curl -s http://localhost:8080/articles/not-found > /dev/null
sleep 1
done


このグラフからは以下が読み取れます。
| 時間帯 | 状況 |
|---|---|
| 22:28〜22:29 | 0.5〜0.7 のレートでアクセスが集中していた |
| 22:29〜22:30 | レートが急落 (アクセスが止まった) |
| 22:30〜22:31 | 再びレートが上昇 (アクセスが再開した) |
| 22:31〜22:32 | 再び急落し横ばい (アクセスが止まった) |
ホバー時の値
| article_id | rate | 意味 |
|---|---|---|
article-001 | 0.380 | 約 2.6 秒に 1 アクセス |
ステータス別の件数
記事作成APIの結果を、success / error / validation_error の 3系列を積み上げてステータス毎の構成比を確認できます。
グラフは Lines ではなく、Stacked bars に変更して見てみます。
sum by(status) (article_create_duration_count)

このグラフからは以下が読み取れます。
| status | 現在の累計 | 傾向 |
|---|---|---|
success | 177 | 最も多く、22:30 頃に急増 |
error | 28 | 横ばいで推移 |
validation_error | 20 | 22:30 頃から増加し始めた |
p95, p99 レイテンシの推移
記事作成処理の 95 パーセンタイルレイテンシを時系列グラフで表示してみます。
前回同様、アプリケーション側にランダムに遅延ロジックを入れているため、それらが発動した際にグラフが跳ね上がる様子を確認します。
histogram_quantile(0.95, rate(article_create_duration_bucket[5m]))

| status | p95 レイテンシ | 意味 |
|---|---|---|
error | 0.675s | リクエストの 95% が 0.675 秒以内に完了 |
success | 0.550s | リクエストの 95% が 0.550 秒以内に完了 |
validation_error | 0.095s | リクエストの 95% が 0.095 秒以内に完了 |
histogram_quantile(0.99, rate(article_create_duration_bucket[5m]))

| status | p99 レイテンシ | 意味 |
|---|---|---|
error | 0.935s | リクエストの 99% が 0.935 秒以内に完了 |
success | 0.910s | リクエストの 99% が 0.910 秒以内に完了 |
validation_error | 0.099s | リクエストの 99% が 0.099 秒以内に完了 |
Tips
過去に実行したクエリは以下のように履歴から再度実行することも可能です。※わりと使います

おわりに
今回は Grafana Explore を使って Prometheus のメトリクスをグラフで可視化しました。
Prometheus UI で実行したクエリをそのまま Grafana でも使えることが確認でき、過去データも含めて安定してグラフ表示できる点はとても便利でした。
次回はダッシュボードを作成し、レイテンシ・リクエストレート・エラー率を 1画面にまとめていくような取り組みをしたいと思います。