メトリクス@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. 外部から収集したデータポイント¶
Amazon EKSから収集したデータポイント¶
Amazon 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{resource="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{resource="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