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: ルールはユニットテストして安全に運用
関連記事: