PromQL@メトリクス¶
はじめに¶
本サイトにつきまして、以下をご認識のほど宜しくお願いいたします。
01. 要素¶
データ型¶
▼ Instant vector¶
特定の時点の時系列データのこと。
▼ Range vector¶
特定の期間の時系列データのこと。
▼ Scalar¶
浮動小数点の数値型データのこと。
▼ String¶
文字列型データのこと。
演算子¶
▼ ワイルドカード¶
=~
演算子を使用して正規表現マッチングを有効化し、.*
演算子や$
演算子でワイルドカードを適用する。
# 前方一致
resource.labels.pod_name=~"foo-pod-.*"
# 後方一致
resource.labels.pod_name=~"pod$"
# 部分一致
resource.labels.pod_name=~".*pod.*"
関数¶
▼ by¶
同じ種類のデータポイントをラベル単位で集約する。
sum(<メトリクス名>) by (<ラベル>)
例
直近1時間に関して、Istioのistio-proxy
コンテナの受信リクエストのテータポイント数を、コンテナの種類ごとに集約する。
sum(idelta(istio_requests_total[1h])) by (destination_app)
# 結果
{destination_app="foo-container"} <算出値>
例
任意の期間内に関して、Istioのistio-proxy
コンテナの受信リクエストのテータポイント数の増加量を算出する。
sum(increase(istio_requests_total{destination_workload_namespace="default"}[$__range:])) by (destination_service)
例
任意の期間内に関して、Istioのistio-proxy
コンテナの処理時間の一番高い値を算出する。
max(max_over_time(rate(istio_request_duration_milliseconds_sum{destination_service_namespace="default"}[$__rate_interval])[$__range:])) by (destination_service)
例
任意の期間内に関して、Istioのistio-proxy
コンテナの処理時間の平均を算出する。
avg(avg_over_time(rate(istio_request_duration_milliseconds_sum{destination_service_namespace="default"}[$__rate_interval])[$__range:])) by (destination_service)
例
複数の種類で集約することもできる。
直近1時間に関して、Istioのistio-proxy
コンテナで収集したレスポンスの補足メッセージ (%RESPONSE_FLAGS%
変数) を、Pod名、変数値、の種類ごとに集約する。
sum(idelta(istio_requests_total{response_flags!="-"}[1h])) by (pod_name, response_flags)
# 結果
{pod_name="ingressgateway-pod", response_flags="DC"} <算出値>
{pod_name="ingressgateway-pod", response_flags="DPE"} <算出値>
{pod_name="ingressgateway-pod", response_flags="URX"} <算出値>
{pod_name="foo-pod", response_flags="DC"} <算出値>
{pod_name="foo-pod", response_flags="DPE"} <算出値>
{pod_name="foo-pod", response_flags="URX"} <算出値>
...
▼ count¶
期間内の合計数を算出する。
▼ increase¶
rate関数のラッパーであり、rate関数の結果 (平均増加率) に、期間を自動的に掛けた数値 (期間当たりの増加数) を算出する。
*例*
rate関数に期間 (今回は5m) を自動的に掛けた数値を算出する。
increase(<メトリクス名>[5m])
# メトリクスの平均増加率 (%/秒) を集計する。
= rate(<メトリクス名>[1h]) * 5 * 60
▼ rate¶
平均増加率 (%/秒) を算出する。
常に同じ割合で増加していく場合、横一直線のグラフになる。
例
直近1時間に関して、メトリクスの平均増加率 (%/秒) を集計する。
rate(<メトリクス名>[1h])
▼ []
(ウィンドウ)¶
直近、何時間 (分、秒) のデータポイントを集計するかを設定する。数値を大きくするほど、なだらかになる。
例
直近5分に関して、メトリクスの平均増加率 (%/秒) を集計する。
rate(<メトリクス名>[5m])
- https://www.scsk.jp/sp/sysdig/blog/container_monitoring/promql_1.html
- https://christina04.hatenablog.com/entry/prometheus-rate
- https://qiita.com/t_nakayama0714/items/1231751e72804d52c20a#3-0-range-vector%E3%81%A8instant-vector>
- https://gavin-zhou.medium.com/victoriametrics%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%82%88%E3%82%8A%E3%82%88%E3%81%84prometheus-rate-%E9%96%A2%E6%95%B0-6a69c36cee8f
02. データポイントの有無¶
コンテナが起動/停止しているか¶
Prometheusでデータポイントを収集できるか否かで、コンテナの起動/停止を表す。
absent(container_tasks_state{name="<コンテナ名>",state="running"}) == 1
03. データポイントの各種数値の算出¶
データポイントの平均サイズ (KB/秒) の増加率¶
Prometheusで収集されたデータポイントの平均サイズ (KB/秒) の増加率を表す。
rate(prometheus_tsdb_compaction_chunk_size_bytes_sum[1h]) /
rate(prometheus_tsdb_compaction_chunk_samples_sum[1h])
# 結果
{container="prometheus", endpoint="web", instance="*.*.*.*:9090", job="foo-prometheus", namespace="prometheus", pod="foo-prometheus-pod", service="oo-prometheus-service"} <算出値>
データポイントの合計数 (個/秒) の増加率¶
Prometheusで収集されたデータポイントの合計数 (個/秒) の増加率を表す。
rate(prometheus_tsdb_head_samples_appended_total[1h])
# 結果
{container="prometheus", endpoint="web", instance="*.*.*.*:9090", job="foo-prometheus", namespace="prometheus", pod="foo-prometheus-pod", service="oo-prometheus-service"} <算出値>
データポイントの合計サイズ (KB/秒) の増加率¶
Prometheusで収集されたデータポイントの合計サイズ (KB/秒) の増加率を表す。
計算式からもわかるように、データポイントの収集の間隔を長くすることにより、データポイント数が減るため、合計のサイズを小さくできる。
rate(prometheus_tsdb_compaction_chunk_size_bytes_sum[1h]) /
rate(prometheus_tsdb_compaction_chunk_samples_sum[1h]) *
rate(prometheus_tsdb_head_samples_appended_total[1h])
# 結果
{container="prometheus", endpoint="web", instance="*.*.*.*:9090", job="foo-prometheus", namespace="prometheus", pod="foo-prometheus-pod", service="oo-prometheus-service"} <算出値>
データポイントの合計サイズ (KB/日) の推移¶
Prometheusで収集されたデータポイントの合計サイズ (KB/日) の推移を表す。
rate(prometheus_tsdb_compaction_chunk_size_bytes_sum[1h]) /
rate(prometheus_tsdb_compaction_chunk_samples_sum[1h]) *
rate(prometheus_tsdb_head_samples_appended_total[1h]) *
60 * 60 * 24
# 結果
{container="prometheus", endpoint="web", instance="*.*.*.*:9090", job="foo-prometheus", namespace="prometheus", pod="foo-prometheus-pod", service="oo-prometheus-service"} <算出値>
04. ストレージの各種数値の算出¶
ローカルストレージ¶
▼ 必要データサイズ (KB/日)¶
データポイントの合計サイズ (KB/日) とローカルストレージの部品ファイルの合計を表す。
ローカルストレージの部品ファイル分で、20
%のサイズが必要になる。
この結果から、ローカルストレージの必要データサイズを推測できる。
rate(prometheus_tsdb_compaction_chunk_size_bytes_sum[1h]) /
rate(prometheus_tsdb_compaction_chunk_samples_sum[1h]) *
rate(prometheus_tsdb_head_samples_appended_total[1h]) *
60 * 60 * 24 *
1.2
# 結果
{container="prometheus", endpoint="web", instance="*.*.*.*:9090", job="foo-prometheus", namespace="prometheus", pod="foo-prometheus-pod", service="foo-prometheus-service"} <算出値>
リモートストレージ¶
▼ 必要データサイズ (KB/日)¶
Prometheusで収集されたデータポイントの全サイズうち、リモートストレージに実際に送信しているサイズ (KB/日) を表す。
リモート書き込みサイズではなく、送信サイズであるため、書き込みに成功していない可能性があることに注意する。
この結果から、リモートストレージの必要データサイズを推測できる。
補足として、リモートストレージが送信された全てのデータを保管できるとは限らないため、リモートストレージ側で必要データサイズを確認する方がより正確である。
rate(prometheus_remote_storage_bytes_total[1h]) *
60 * 60 * 24
# 結果
{container="prometheus", endpoint="web", instance="*.*.*.*:9090", job="foo-prometheus", namespace="prometheus", pod="foo-prometheus-pod", remote_name="victoria-metrics", service="oo-prometheus-service", url="https://*.*.*.*:8248/api/v1/write"} <算出値>
▼ 送信メタデータサイズ¶
リモートストレージに送信したメタデータのうち、送信に失敗してリトライしたサンプル数の合計を表す。
prometheus_remote_storage_metadata_retried_total[1h]) *
60 * 60 * 24
▼ 送信データサイズ¶
リモートストレージに送信したデータのうち、送信に失敗してリトライしたサンプル数の合計を表す。
rate(prometheus_remote_storage_samples_retries_total[1h]) *
60 * 60 * 24
▼ リモート送信シャード数¶
リモート送信処理のシャード数を表す。
rate(prometheus_remote_storage_shards[1h]) *
60 * 60 * 24