LESSON 25分

ストーリー

あなた
最近、アラートが鳴りすぎて、チームが本当に重要なアラートを見逃すようになってきたんです…

高橋アーキテクトが頷いた。

高橋アーキテクト
それは”アラート疲れ”だ。アラートが多すぎると、人間はそれを無視するようになる。良いアラート設計とは、“本当にアクションが必要なときだけ鳴る”ようにすること。これはエンジニアリングの中でも最も難しい設計の1つだ

アラート疲れ(Alert Fatigue)

悪いアラート設計:
  1日に100件のアラート → 95件は誤報 → チームがアラートを無視 → 本当の障害を見逃す

良いアラート設計:
  1日に2-3件のアラート → すべてアクションが必要 → チームが即座に対応
症状原因対策
アラートを無視するアラートが多すぎる本当に重要なもののみに絞る
対応が遅れる優先度が不明確severity分類を明確にする
常にアラートが鳴っている閾値が不適切SLOベースのアラートに変更

アラート設計の原則

1. すべてのアラートはアクションを伴う

// 良いアラート: 具体的なアクションがある
interface GoodAlert {
  name: 'API Error Rate > 5%';
  action: 'オンコール担当者がダッシュボードを確認し、原因を調査';
  runbook: 'https://wiki.example.com/runbook/high-error-rate';
}

// 悪いアラート: アクションが不明確
interface BadAlert {
  name: 'CPU usage > 50%';
  action: '???';  // 何をすればいいかわからない
}

2. SLOベースのアラート

// 症状ベース(推奨): ユーザーに影響があるときにアラート
const symptomBasedAlert = {
  name: 'SLO Burn Rate Alert',
  condition: 'エラーバジェットの消費速度が通常の14.4倍',
  meaning: 'このペースだと1時間で月間エラーバジェットの2%を消費',
};

// 原因ベース(非推奨): インフラの状態変化でアラート
const causeBasedAlert = {
  name: 'High CPU Alert',
  condition: 'CPU使用率 > 80%',
  problem: 'CPUが高くてもユーザーに影響がない場合がある',
};

3. Multi-window, Multi-burn-rate

# Burn Rate アラートの例
# 短期間で急激にバジェットを消費 → 即座にアラート
- alert: SLO_HighBurnRate_Critical
  expr: |
    (
      error_rate_5m > (14.4 * 0.001)
      and
      error_rate_1h > (14.4 * 0.001)
    )
  for: 2m
  labels:
    severity: critical

# 長期間でじわじわ消費 → 警告レベル
- alert: SLO_HighBurnRate_Warning
  expr: |
    (
      error_rate_30m > (3 * 0.001)
      and
      error_rate_6h > (3 * 0.001)
    )
  for: 15m
  labels:
    severity: warning

アラートの分類

severity意味対応時間通知先
criticalユーザーに影響が出ている即座(5分以内)PagerDuty + Slack
warning影響が出る可能性がある営業時間内Slack #monitoring
info注意が必要だがアクション不要次の営業日ダッシュボードのみ

ランブック(Runbook)

// すべてのアラートにランブックを紐づける
interface AlertWithRunbook {
  alertName: string;
  severity: 'critical' | 'warning';
  runbookUrl: string;
  runbookContent: {
    description: string;      // アラートの意味
    impact: string;           // ユーザーへの影響
    diagnosis: string[];      // 原因調査の手順
    mitigation: string[];     // 暫定対応の手順
    escalation: string;       // エスカレーション先
  };
}

const exampleRunbook: AlertWithRunbook = {
  alertName: 'PaymentService_HighErrorRate',
  severity: 'critical',
  runbookUrl: 'https://wiki.example.com/runbook/payment-error',
  runbookContent: {
    description: 'Payment Serviceのエラー率が5%を超えています',
    impact: '一部のユーザーが決済を完了できません',
    diagnosis: [
      '1. Grafanaダッシュボードでエラーの種類を確認',
      '2. 外部決済APIのステータスページを確認',
      '3. 直近のデプロイ履歴を確認',
      '4. トレースで具体的なエラー箇所を特定',
    ],
    mitigation: [
      '1. 外部API障害の場合: フォールバック決済に切り替え',
      '2. デプロイ起因の場合: 前バージョンにロールバック',
      '3. 負荷起因の場合: スケールアウト',
    ],
    escalation: 'Payment Team Lead → CTO',
  },
};

アラート設計のアンチパターン

アンチパターン問題対策
閾値を低く設定しすぎ常にアラートが鳴るSLOベースに変更
for句がない一瞬のスパイクで発火5分以上の持続を条件にする
ランブックがない何をすべかわからない全アラートにランブックを紐づける
通知先が全員誰も自分の責任と思わないオンコールローテーションを導入
自動復旧する事象にアラート無駄な対応が発生自動復旧するものはinfoに

まとめ

ポイント内容
アラート疲れアラートが多すぎるとチームが無視するようになる
原則すべてのアラートにアクションとランブックを紐づける
SLOベース症状(ユーザー影響)ベースのアラートを優先
分類critical/warning/infoで対応時間と通知先を分ける

チェックリスト

  • アラート疲れの原因と対策を説明できる
  • SLOベースのアラート設計を理解した
  • Burn Rateアラートの考え方を把握した
  • ランブックの必要性と構成を理解した

次のステップへ

次は演習「ダッシュボードを設計しよう」です。これまで学んだメトリクスとアラートの知識を使って、実際にダッシュボードを設計してみましょう。


推定読了時間: 25分