【入門編】Prometheusのトラブルシューティング:よくあるエラーと原因・対処法まとめ – 運用監視・オブザーバビリティ活用バイブル

オブザーバビリティの世界へようこそ。Prometheusは、単なる「監視ツール」ではありません。システムの「脈拍」を可視化し、異常を未然に防ぐための強力な武器です。

あなたが今、Prometheusのトラブルシューティングという荒波に揉まれているなら、それはあなたが「現場の責任あるエンジニア」として一歩前進した証拠です。今日は、教科書には載っていない「現場の泥臭い戦い方」を伝授します。

—

1. “Context deadline exceeded” の正体と、タイムアウトの設計思想

Prometheusで最も頻繁に遭遇するこのエラー。これは「Prometheusがターゲットにデータを要求したが、制限時間内に返事が来なかった」ことを示しています。

原因の深層:
単なるネットワーク遅延だけでなく、「ターゲット側の処理負荷による応答停止」が真犯人であることが多いです。

  • 対処法: `scrape_timeout` を安易に伸ばすのは悪手です。まずは `scrape_interval`(収集間隔)の半分以下に収まるように設計してください。
  • プロのアドバイス: `prometheus.yml` での個別設定が鍵です。

scrape_configs:

  • job_name: ‘heavy-service’

scrape_interval: 30s
scrape_timeout: 10s # intervalの1/3程度に抑えるのが健全
static_configs:

  • targets: [‘service-a:8080’]

もし頻発する場合は、ターゲット側で「メトリクスの生成処理」自体が重くなっていないか、Prometheus側ではなくアプリケーション側を疑ってください。

—

2. ターゲットが “DOWN” になる時のデバッグ手順

ターゲットがDOWNしたとき、慌ててサーバーを再起動してはいけません。以下の順序で「論理的な消去法」を実行してください。

1. 疎通確認の基本: Prometheusのコンテナ内から `curl -v :/metrics` を実行します。これでダメなら、ネットワーク層(Security Group / Firewalls)の問題です。
2. DNSの罠: Docker環境では、Docker DNSの解決失敗がよくあります。IPアドレス直接指定で接続できるか確認してください。
3. セキュリティグループ: ターゲット側のポート(例: 9090や9100)が、Prometheusのセキュリティグループからのインバウンドを許可しているか確認します。
4. 死活監視の視点: PrometheusのUI画面(`/targets`)に表示されるエラーメッセージが「Connection refused」か「EOF」かを見極めてください。EOFならアプリがクラッシュしています。

—

3. メモリリーク:Prometheusが死ぬ原因の8割

Prometheusはメトリクスをメモリ上で管理します。「メモリが足りない」という事態は、「カーディナリティ(時系列データの多様性)の爆発」が原因であることがほとんどです。

  • 何が起きているのか?: 例えば、ユーザーIDやURLのクエリパラメータをラベルとして保存していませんか? `http_requests_total{user_id=”12345″}` のように。これを行うと、無限に時系列データが生成され、Prometheusはメモリを食いつぶします。
  • 対策: ラベルには「有限の数になるもの(ステータスコード、インスタンスID、メソッド名など)」だけを使用してください。
  • 切り分け: `prometheus_tsdb_head_series` メトリクスを監視し、グラフが右肩上がりで止まらない場合は、即座にラベル設計を見直しましょう。

—

4. PromQLのNaN値と構文エラーのデバッグ

「グラフが途切れる」「NaNが表示される」。これはPrometheusが「データが存在しない」と判断している状態です。

  • NaNの原因: ゼロ除算や、メトリクスが一時的に消失(再起動など)した場合に発生します。
  • 対処法: `or` 演算子や `vector(0)` を活用して、欠損値を補完するのが現場の知恵です。

欠損時に0を表示する魔法
(rate(http_requests_total[5m])) or vector(0)

—

初心者へのプレゼント: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

scrape_configs:

  • job_name: ‘prometheus’

static_configs:

  • targets: [‘localhost:9090’]

この設定で起動し、ブラウザで `http://localhost:9090` を開いてください。
「Graph」タブで `prometheus_build_info` と入力して実行しましょう。これが、あなたのシステムを監視するための「最初の1ビット」です。

—

最後に:あなたへ贈る言葉

監視は「守り」に見えて、実は「攻め」の技術です。トラブルを早期に発見し、スマートに解決できるエンジニアは、組織において最も信頼されます。

Prometheusは奥が深いツールです。最初はエラーに怯えるかもしれませんが、それはあなたがシステムと深く向き合っている証拠。一つずつ設定値を調整し、メトリクスの海を泳ぎこなせるようになれば、毎日のオンコールが劇的に、そして確実に楽になりますよ。

さあ、次はどんなメトリクスを可視化してみますか?

タイトルとURLをコピーしました