ストーリー
あなた
最近、アラートが鳴りすぎて、チームが本当に重要なアラートを見逃すようになってきたんです…
あ
高
高橋アーキテクト
それは”アラート疲れ”だ。アラートが多すぎると、人間はそれを無視するようになる。良いアラート設計とは、“本当にアクションが必要なときだけ鳴る”ようにすること。これはエンジニアリングの中でも最も難しい設計の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で対応時間と通知先を分ける |
チェックリスト
次のステップへ
次は演習「ダッシュボードを設計しよう」です。これまで学んだメトリクスとアラートの知識を使って、実際にダッシュボードを設計してみましょう。
推定読了時間: 25分