オブザーバビリティの世界へようこそ。Prometheusを触り始めて「なぜこのクエリは結果を返さないのか?」「なぜ数値が爆発するのか?」と頭を抱えたことはありませんか?
Prometheusの真髄は、メトリクスを単に並べることではなく、「異なる次元のデータをPromQLで演算し、意味ある洞察に変えること」にあります。特に`ignoring`と`on`を使いこなせるようになれば、あなたはもう初心者ではありません。
今日は、PromQLのベクトルマッチングという「魔法の鍵」を完全に解読しましょう。これをマスターすれば、毎日の監視業務から「勘と経験」という名のノイズが消え去ります。
—
1. Vector Matchingの原則:メトリクスの「次元」を合わせる
PromQLの演算が失敗する最大の理由は、「ラベルのセット(次元)が一致していないから」です。
- One-to-One (1:1): 両方のベクトルのラベルセットが完全に一致する場合。
- Many-to-One / Many-to-Right: 多くのデータを持つ側から、一つのデータを持つ側(メタデータなど)へ情報を付与する際によく使います。
ここで重要なのは、「計算したい要素以外を、演算から除外(無視)する」という考え方です。
—
2. `ignoring` vs `on`:どちらを選ぶべきか?
これらは「どのラベルを基準にマッチさせるか」を指定する修飾子です。
- `ignoring(label_name)`: 指定したラベル以外のすべてが一致すればマッチさせる。
- 使いどころ: 「特定のラベル(例:`instance`)は無視して、残りのラベルが同じなら計算したい」という時に使います。
- `on(label_name)`: 指定したラベルだけが一致すればマッチさせる。
- 使いどころ: 「このラベルさえ同じなら、他は何が違っても構わない」という時に使います。
【先輩エンジニアの鉄則】
基本的には `on` を推奨します。`ignoring`は「何が含まれているか分からない」というリスクがありますが、`on`は「何を基準にするか」を明示するため、クエリの意図が明確になり、バグが激減します。
—
3. 実践:コンテナのCPU使用率を「スペック」で割る
現場で最も頻出する「精度の高い監視」の例を見てみましょう。
「コンテナのCPU使用率(`container_cpu_usage_seconds_total`)」を、「割り当てられたCPUコア数(`kube_pod_container_resource_limits_cpu_cores`)」で割って、使用率(%)を算出します。
クエリ構築のステップ
1. コンテナごとの使用率を取得
(rate(container_cpu_usage_seconds_total[5m]))
2. 割り当て(Limit)情報と結合して計算
/ on (pod, container)
(kube_pod_container_resource_limits_cpu_cores)
なぜこれが必要なのか?
`container_cpu_usage`には`instance`や`node`といったラベルが大量に含まれていますが、`kube_pod_…`にはそれらのラベルがありません。`on(pod, container)`と指定することで、「podとcontainer名さえ一致していれば、物理ノードやインスタンスが違っても計算する」という柔軟性を手に入れているのです。
—
4. 初心者向け:まず試すべき「HelloWorld」セットアップ
まだ環境がない方へ。Dockerで一瞬で立ち上げ、この挙動を確認してみましょう。
docker-compose.yml
version: ‘3’
services:
prometheus:
image: prom/prometheus
ports:
- “9090:9090”
volumes:
- ./prometheus.yml:/etc/prometheus/prometheus.yml
prometheus.yml
global:
scrape_interval: 15s
scrape_configs:
- job_name: ‘prometheus’
static_configs:
- targets: [‘localhost:9090’]
動作確認の魔法
1. `docker-compose up` で起動。
2. `http://localhost:9090` にアクセス。
3. Expressionブラウザに以下を入力:
`up on(instance) group_left() up`
※これは「自分自身と自分自身を乗算する」という冗長な例ですが、`group_left`の挙動を確認するのに最適です。
—
最後に:あなたへのアドバイス
PromQLで一番怖いのは「クエリがエラーを吐くこと」ではありません。「意図しないラベルのマッチングで、数値が異常な倍数になって出力されること」です。
演算を行うときは、必ず「片方のベクトルには、もう片方のベクトルに含まれるラベルのサブセットが含まれているか?」を確認してください。`on`を使って明示的に「ここだけ合わせる」と決める習慣をつければ、あなたの監視ダッシュボードは、ノイズのない、極めて精度の高い「真実の鏡」に変わります。
最初は難しく感じるかもしれませんが、一度この「次元を揃える」感覚を掴めば、どんな複雑なインフラでも手足のように操れるようになりますよ。さあ、次はどんなメトリクスを解析しましょうか?