Prometheusは、カウンター、ゲージ、ヒストグラム、サマリーの4種類のメトリックをサポートしています。
カウンターは、増加するかリセットされるのみのメトリック値です。つまり、値は以前の値より減少することはありません。リクエスト数、エラー数などのメトリックに使用できます。
クエリバーに以下のクエリを入力して実行をクリックしてください。
go_gc_duration_seconds_count
PromQLのrate()関数は、一定期間にわたるメトリックの履歴を取り、値が1秒あたりどれだけ速く増加しているかを計算します。Rateはカウンター値のみに適用可能です。
rate(go_gc_duration_seconds_count[5m])
ゲージは、増減する数値です。クラスタ内のポッド数、キュー内のイベント数などのメトリックに使用できます。
max_over_time
、min_over_time
、avg_over_time
などのPromQL関数は、ゲージメトリックで使用できます。
ヒストグラムは、前の2つと比較してより複雑なメトリックの種類です。ヒストグラムは、バケット値に基づいてカウントされる任意の計算値に使用できます。バケットの境界は開発者が設定できます。一般的な例としては、リクエストへの応答にかかる時間(レイテンシ)があります。
例:APIリクエストの処理にかかる時間を監視したいとします。各リクエストのリクエスト時間を保存する代わりに、ヒストグラムを使用すると、バケットに保存できます。たとえば、0.3以下
、0.5以下
、0.7以下
、1以下
、1.2以下
などの時間にかかるバケットを定義します。これらがバケットであり、リクエストにかかった時間が計算されると、測定値よりも高いバケット境界を持つすべてのバケットのカウントに追加されます。
エンドポイント「/ping」のリクエスト1が0.25秒かかったとします。バケットのカウント値は次のようになります。
/ping
バケット | カウント |
---|---|
0 - 0.3 | 1 |
0 - 0.5 | 1 |
0 - 0.7 | 1 |
0 - 1 | 1 |
0 - 1.2 | 1 |
0 - +Inf | 1 |
注:+Infバケットはデフォルトで追加されます。
(ヒストグラムは累積頻度であるため、値よりも大きいすべてのバケットに1が追加されます)
エンドポイント「/ping」のリクエスト2が0.4秒かかった場合、バケットのカウント値は次のようになります。
/ping
バケット | カウント |
---|---|
0 - 0.3 | 1 |
0 - 0.5 | 2 |
0 - 0.7 | 2 |
0 - 1 | 2 |
0 - 1.2 | 2 |
0 - +Inf | 2 |
0.4は0.5未満であるため、その境界までのすべてのバケットのカウントが増加します。
Prometheus UIからヒストグラムメトリックを調べ、いくつかの関数を適用してみましょう。
prometheus_http_request_duration_seconds_bucket{handler="/graph"}
histogram_quantile()
関数は、ヒストグラムから分位数を計算するために使用できます。
histogram_quantile(0.9,prometheus_http_request_duration_seconds_bucket{handler="/graph"})
グラフは、90パーセンタイルが0.09であることを示しています。過去5分間のhistogram_quantileを見つけるには、rate()と時間枠を使用できます。
histogram_quantile(0.9, rate(prometheus_http_request_duration_seconds_bucket{handler="/graph"}[5m]))
サマリーもイベントを測定し、ヒストグラムの代替手段です。より安価ですが、より多くのデータが失われます。アプリケーションレベルで計算されるため、同じプロセスの複数のインスタンスからのメトリックの集計はできません。メトリックのバケットが事前に不明な場合に使用されますが、可能な限りヒストグラムをサマリーよりも使用することを強くお勧めします。
このチュートリアルでは、メトリックの種類と、rate、histogram_quantileなどのいくつかのPromQL演算について詳しく説明しました。
このドキュメントはオープンソースです。問題やプルリクエストを提出して、改善にご協力ください。