オブザーバビリティの世界へようこそ。システムが「沈黙」している時ほど怖いものはありません。しかし、ただ闇雲にログを垂れ流すだけでは、真の異常は見抜けない。
今日はPrometheusの真髄、特に「未来を予測し、ノイズを排除する」ための魔法の関数群について解説します。これを武器にすれば、深夜の緊急呼び出し(アラート)に震える夜とはおさらばです。
—
1. Prometheusの「時間軸」を支配する:rate, irate, delta
Prometheusで最もよく使うのがカウンター(増え続ける値)ですが、そのままグラフにしても「右肩上がりの線」が見えるだけで、何も分かりません。ここで「速度」を抽出します。
rate vs irate:なぜ使い分けるのか?
- `rate(v[range])`: 指定した期間(range)の平均変化率を計算します。長期的なトレンドを見たいとき、例えば「ここ1時間の平均トラフィック」を見るならこれです。
- `irate(v[range])`: 直近の2つのデータポイントだけで変化率を計算します。瞬間的なスパイクを捉えるのに最適です。
【現場の知見】
ダッシュボードのグラフには`rate`を使い、アラートの閾値判定には`irate`を使います。なぜなら、平均化された値(rate)をアラートの閾値にすると、瞬間的な高負荷(スパイク)が平均化されて消えてしまい、「ユーザーがエラーで悲鳴を上げているのに、アラートが鳴らない」という最悪の事態を引き起こすからです。
—
2. 未来を予言する:predict_linearの数理モデル
「あとどれくらいでディスクが溢れるか?」を計算するのに、目視は不要です。`predict_linear`を使いましょう。
数式: `predict_linear(v[range], t)`
これは、過去の`range`期間のデータから線形回帰を行い、`t`秒後の値を予測します。
実践:ディスク枯渇予測アラート
例えば、「あと4時間後にディスクが100%になるか」を検知するクエリはこう書きます。
4時間後のディスク使用量を予測し、それが100%(1.0)を超えそうか判定
predict_linear(node_filesystem_free_percent[1h], 4 3600) < 0
【現場の知見】
`[1h]`のような期間指定は長すぎると予測が鈍くなり、短すぎるとノイズに振り回されます。ディスク容量のような「比較的緩やかな変化」には1時間から3時間程度が黄金比です。
—
3. 【初心者向け】HelloWorld的な最初の一歩
まずはPrometheusを触ってみましょう。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 # 15秒ごとにデータを収集
scrape_configs:
- job_name: ‘prometheus’
static_configs:
- targets: [‘localhost:9090’] # 自分自身のメトリクスを監視
最初のクエリ:HelloWorld
Prometheus UI(`http://localhost:9090`)を開き、Expression欄に以下を入力してください。
直近5分間のPrometheusのCPU使用率の変化(irate)
irate(process_cpu_seconds_total[5m])
グラフタブをクリックし、線が動くのを確認できれば成功です!これが「今、この瞬間のシステムの呼吸」です。
—
最後に:先輩からのアドバイス
オブザーバビリティの神髄は、「起きていること(ログ)」ではなく「起きつつあること(メトリクス)」を知ることにあります。
- `rate` でトレンドを把握し、
- `irate` で瞬間の悲鳴を聞き逃さず、
- `predict_linear` で明日起きる事故を今日防ぐ。
これらを使いこなすだけで、あなたのシステム運用は「場当たり的な火消し」から「先回りした最適化」へと劇的に進化します。最初は難しく感じるかもしれませんが、PromQLは慣れれば言語のように直感的になります。
次は、ぜひ`sum by (instance)`などの集計関数と組み合わせて、サービス全体を俯瞰するクエリに挑戦してみてください。あなたのエンジニアライフが、より静かで、より確実なものになることを願っています。