Prometheusの深淵:PromQLのベクトル演算を支配し、オブザーバビリティを「可視化」から「洞察」へ昇華させる
多くのエンジニアがPrometheusを使いこなしているつもりでいる。しかし、真の地獄は「異なる次元のメトリクスをどう結合するか」という一点に集約される。
「データが取れない」「カーディナリティ爆発でPrometheusが死んだ」——これらは単なる設定ミスではない。ベクトルマッチング(Vector Matching)の概念を理解していないことに起因する、アーキテクトとしての敗北だ。
今日は、PromQLのジョイン操作を完全攻略し、あなたの監視基盤を「数字を並べるだけのダッシュボード」から「システムの真実を突く分析ツール」へと進化させる。
—
1. Vector Matchingの絶対原則:次元を合わせる技術
PromQLにおいて、演算子は「同じラベルセットを持つ系列同士」でしか機能しない。異なるラベル構成を持つメトリクスを演算する場合、`vector matching`という概念が必要になる。
基本の3パターン
- One-to-One (`ignoring` / `on`): 1対1のマッチング。
- Many-to-One / One-to-Many (`group_left` / `group_right`): 多対多の結合。ここが実務の9割を占める。
重要なのは、「どのラベルを基準に結合するか(on)」と「どのラベルを無視して結合するか(ignoring)」の判断だ。
—
2. 実戦:コンテナスペックとCPU使用率の「究極の突合」
現場で頻出する「コンテナのCPU使用率(%)を計算する」クエリを例にしよう。
`container_cpu_usage_seconds_total`(稼働時間)と`container_spec_cpu_quota`(上限値)を結合する際、ラベルの不一致に遭遇するはずだ。
悪い例:単に割ると、ラベルが一致せず結果が返ってこない
container_cpu_usage_seconds_total / container_spec_cpu_quota
プロの実装:group_leftで静的なspec情報を付与する
(
sum by (pod, container) (rate(container_cpu_usage_seconds_total[5m]))
)
/ ignoring (image, id, name) group_left()
(
container_spec_cpu_quota
)
解説:
- `ignoring (image, id, name)`: CPU使用率とスペック情報で異なるラベル(一時的なIDなど)を捨て、結合のキーとなるラベルを揃える。
- `group_left()`: 右側の「spec情報」は全コンテナで共通(1つ)であるため、左側の「個別のコンテナメトリクス」に対して、スペック値を右から左へコピーするイメージだ。
—
3. 開発スピードを劇的に高める「プロの流儀」
PromQLは試行錯誤の回数が全てだ。GUIのブラウザ画面だけで消耗してはいけない。
① VS Codeの神プラグイン: `Prometheus` (by PromLens / PromLabs)
GUIでポチポチする時代は終わった。VS Code上で直接クエリを検証し、警告や構文チェックをリアルタイムで行う。特に`PromLens`と統合された環境は、複雑なジョインの結果を可視化してくれるため、事故を未然に防げる。
② 必須のキーボードショートカット (Prometheus UI)
- `Ctrl + Enter`: クエリ実行。
- `Shift + Enter`: 改行(クエリを読みやすく整形する癖をつけろ)。
- `Up/Down`: 履歴の呼び出し。
③ 設定共有化ルール:YAMLの「モジュール化」
Prometheusの`prometheus.yml`が数千行になっているなら、それは技術的負債だ。`file_sd_configs`を使い、ターゲット構成を分離せよ。
prometheus.yml のベストプラクティス構成
scrape_configs:
- job_name: ‘kubernetes-pods’
# ターゲット情報は別ファイルに外出しし、CI/CDで動的に生成する
file_sd_configs:
- files: [‘/etc/prometheus/sd/pods_.json’]
refresh_interval: 1m
pods_service_a.json (自動生成されるべきファイル)
[
{
“targets”: [“pod-a:8080”],
“labels”: { “service”: “auth-api”, “env”: “prod” }
}
]
—
4. 最後に:オブザーバビリティの神髄
PromQLを操るということは、「システムの構造をコードとして理解する」ということだ。
- ノイズを捨てろ: `ignoring`で不要なラベルを排除し、必要なカーディナリティだけを残す。
- 文脈を付与せよ: `group_left`でマスタデータ(スペックやオーナー情報)を動的に紐付ける。
監視とは、「何が起きているか」を追うことではない。「システムがどう動くべきか」という設計意図と、現実に起きている振る舞いの差分(ギャップ)を数式化することだ。
このテクニックをマスターすれば、アラートのノイズは激減し、障害発生時に「なぜ」が即座に見えるようになるはずだ。君のシステムに、静寂と知性を。