コンテンツにスキップ

メトリクス@Prometheus

はじめに

本サイトにつきまして、以下をご認識のほど宜しくお願いいたします。


01. メトリクス

メトリクス型

▼ メトリクス型の確認

Prometheusのダッシュボードでメトリクスをクエリすると、検索結果に表示される。

▼ Counter

累計で常に増加するメトリクス (例:リクエスト数) が所属する。

メトリクス型がCounterの場合はrate関数を使用できる。

rate関数で秒当たりの差分し、これをsum関数で合計すると累計だったメトリクスを現在の増減で表現できる。

Counterはrate関数で秒当たりの増減で集計することが多いため、Grafanaダッシュボード上では、Counterのメトリクスの単位を『〇〇/秒』とする。

rate関数を使用しない場合、メトリクスの単位は『累計〇〇』になる。

▼ Gauge

動的に増減するメトリクス (例:CPU使用率、Pod数) が所属する。

メトリクス型がGaugeであるとrate関数は使用できない。

Gaugeはそれ自体が増減であるため、Grafanaダッシュボード上では、メトリクスの単位を『〇〇 (元のメトリクスそのまま) 』とすることがほとんどである。

▼ Histogram

時間の範囲を単位とするメトリクス (例:レスポンスタイム) が所属する。

▼ Summary

統計的な分位数を単位とするメトリクス


メタデータ

Prometheusのメトリクスには、メタデータとして『ラベル』を付与できる。


02. Prometheus自身のメトリクス

命名規則

# Prometheusサーバー
prometheus_notifications_total
# process-exporter
process_cpu_seconds_total
# HTTPのリクエスト
http_request_duration_seconds


ローカルストレージ (prometheus_tsdb_*)

▼ prometheus_tsdb_head_samples_appended_total

Prometheusが収集したデータポイントの合計数を表す。

prometheus_tsdb_head_samples_appended_total

▼ prometheus_tsdb_compaction_chunk_size_bytes_sum

Prometheusが作成したチャンクの合計サイズ (KB) を表す。

prometheus_tsdb_compaction_chunk_size_bytes_sum

▼ prometheus_tsdb_compaction_chunk_samples_sum

Prometheusが作成したチャンクの合計数を表す。

prometheus_tsdb_compaction_chunk_samples_sum


02-02. 外部から収集したデータポイント

AWS EKSから収集したデータポイント

AWS EKSで利用できるAPI名を表す。

aggregator_unavailable_apiservice{job="apiserver", name="<API名>"}

aggregator_unavailable_apiservice{job="apiserver", name="v1.metrics.eks.amazonaws.com"}


kubeletから収集したデータポイント

▼ container_cpu_usage_seconds_total

コンテナのCPUの使用時間を表す。

インターネットではこれをCPU使用率と言っている記事が多くあるが、このメトリクスだけではコンテナのCPU使用率の分子を表すだけである。

container_cpu_usage_seconds_total

kube_pod_container_resource_requestsメトリクスやkube_pod_container_resource_limitsを使用して、CPU使用率を集計できる。

# Pod単位のCPU使用率
# メモリ実際値 / 下限値 (.spec.containers[*].resources.requestsキー)
sum(rate(container_cpu_usage_seconds_total{container!=""}[5m])) by (pod) / sum(kube_pod_container_resource_requests{resouce="cpu"}) by (pod) * 100
# Pod単位のCPU使用率
# メモリ実際値 / 下限値 (.spec.containers[*].resources.limitsキー)
sum(rate(container_cpu_usage_seconds_total{container!=""}[5m])) by (pod) / sum(kube_pod_container_resource_limits{resouce="cpu"}) by (pod) * 100

▼ container_memory_working_set_bytes

kube_pod_container_resource_requestsメトリクスやkube_pod_container_resource_limitsを使用して、CPU使用率を集計できる。

# Pod単位のメモリ使用率
# メモリ実際値 / メモリ下限値 (.spec.containers[*].resources.requestsキー)
sum(container_memory_working_set_bytes) by (pod) / sum(kube_pod_container_resource_requests{resource="memory"}) by (pod)  * 100
# Pod単位のメモリ使用率
# メモリ実際値 / メモリ上限値 (.spec.containers[*].resources.limitsキー)
sum(container_memory_working_set_bytes) by (pod) / sum(kube_pod_container_resource_limits{resource="memory"}) by (pod) * 100


03. ディメンション

指定方法

メトリクス名の後に{<ディメンション名>}を設定することにより、ディメンションを単位としてデータポイントを集計する。


ディメンションの種類

▼ container

コンテナ名を表す。

▼ service

KubernetesのService名を表す。

▼ instance

NodeのIPアドレスとポート番号を表す。

▼ job

scrape_configsキー配下のjob_nameキー名を表す。


04. プラクティス

container!="POD"

一時的に停止しているコンテナを除ける。

sum (rate (container_cpu_usage_seconds_total{image!="",container!="POD",pod=~"^$Deployment.*$"}[1m])) by (container, pod) / sum(kube_pod_container_resource_limits{resource="cpu",container!="POD",pod=~"^$Deployment.*$"}) by (container, pod) * 100