2026年10月6日

2026年10月6日

Prometheusのアラートルールを設定する方法

はじめに

Prometheusのアラートルールは、PromQLで定義した条件が継続して真になったときに発火するシンプルな仕組みですが、本番運用では「閾値の選び方」「for句の使い方」「ラベル設計」「抑制ルール」までを総合的に設計する必要があります。

本記事ではよくあるアラート例(高CPU・ディスク逼迫・サービス停止)を題材に、誤検知を抑える実用的なルール設計を解説します。

症状・背景

  • 一瞬の負荷スパイクで何度も通知が飛ぶ
  • 重大アラートと情報アラートが混在している
  • ノードがダウンするとあらゆるアラートが連鎖発火する
  • ラベルがバラバラでAlertmanagerでグルーピングできない

手順・設定方法

ステップ1: ルールファイルを配置しPrometheusに読み込ませる

sudo mkdir -p /etc/prometheus/rules
sudo tee /etc/prometheus/rules/node.yml <<'EOF'
groups:
- name: node-basic
  interval: 30s
  rules:
  - alert: NodeDown
    expr: up{job="node"} == 0
    for: 2m
    labels: {severity: critical, team: infra}
    annotations:
      summary: "{{ $labels.instance }} がダウン"
      description: "node_exporterへの2分以上のスクレイプ失敗"
EOF
# prometheus.ymlで読み込み
sudo sed -i '/^rule_files:/a\  - "/etc/prometheus/rules/*.yml"' /etc/prometheus/prometheus.yml
sudo promtool check rules /etc/prometheus/rules/node.yml
sudo systemctl reload prometheus

ステップ2: 代表的なリソースアラート

# /etc/prometheus/rules/resource.yml
groups:
- name: resources
  rules:
  - alert: HighCPU
    expr: 100 - (avg by(instance) (rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100) > 85
    for: 10m
    labels: {severity: warning}
    annotations:
      summary: "{{ $labels.instance }} CPU {{ $value | printf \"%.0f\" }}%"
  - alert: DiskFullSoon
    expr: predict_linear(node_filesystem_avail_bytes{mountpoint="/"}[6h], 24*3600) < 0
    for: 30m
    labels: {severity: warning}
    annotations:
      summary: "{{ $labels.instance }} 24時間以内にディスク満杯予測"
  - alert: MemoryPressure
    expr: (node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes) * 100 < 10
    for: 5m
    labels: {severity: warning}

ステップ3: Alertmanager側でグルーピングと抑制

# /etc/alertmanager/alertmanager.yml
route:
  group_by: ['alertname','team','instance']
  group_wait: 30s
  group_interval: 5m
  repeat_interval: 4h
  receiver: default
  routes:
  - matchers: [severity="critical"]
    receiver: pager
    continue: true
# NodeDown発火時は下位アラートを抑制
inhibit_rules:
- source_matchers: [alertname="NodeDown"]
  target_matchers: [severity=~"warning|info"]
  equal: [instance]
receivers:
- name: default
  slack_configs: [{api_url: "https://hooks.slack.com/..."}]
- name: pager
  pagerduty_configs: [{routing_key: "PD_KEY"}]

ステップ4: 検証・サイレンス・ユニットテスト

# 構文チェック
sudo promtool check rules /etc/prometheus/rules/*.yml
# テスト用ルールテスト(公式機能)
cat > test.yml <<'EOF'
rule_files: ["/etc/prometheus/rules/resource.yml"]
tests:
- interval: 1m
  input_series:
  - series: 'node_cpu_seconds_total{mode="idle",instance="srv01"}'
    values: '0+0x60'
  alert_rule_test:
  - eval_time: 11m
    alertname: HighCPU
EOF
promtool test rules test.yml
# 一時抑制(メンテナンス)
amtool silence add alertname=HighCPU instance=srv01 --duration=2h --comment="maintenance"

注意事項

  • for句は短すぎると誤検知、長すぎると検知遅延。CPUは10分、サービス停止は2分が目安
  • アノテーションは日本語OKだが、{{ $value }}の桁数整形(printf "%.0f"等)を忘れない
  • 抑制ルール(inhibit_rules)はラベル整合性が肝。equalで同じインスタンス間に限定する
  • promtoolのテストはCIで実行することで規律あるアラート運用が可能

まとめ

1. for句: 一時的なスパイクで通知しないための継続時間条件

2. severity: critical/warning/infoの3段階でルートを分ける

3. predict_linear: 線形回帰で先回り検知(ディスク満杯予測など)

4. inhibit_rules: 上位障害発火時は下位を抑制し通知ノイズを削減

5. promtool test: ルールはユニットテストして安全に運用

関連記事:

お気軽にご相談ください

お見積りへ お問い合わせへ
▲