ストーリー
田
田中VPoE
ログ収集、品質メトリクス、ドリフト検出の仕組みができた。最後にこれらを統合するアラートとダッシュボードだ
あなた
検知した異常を適切な人に通知し、全体状況を可視化するんですね
あ
田
田中VPoE
その通り。NetShop社では先月、レコメンドAIの精度が50%低下したが、3日間気づかなかった。適切なアラート設計があれば初日に検知できていた
あなた
アラートの精度も重要ですね。過度なアラートは無視されてしまいますから
あ
アラート設計の原則
アラート疲れを防ぐ設計
| 原則 | 説明 | 例 |
|---|
| アクショナブル | 受信者が具体的な行動を取れる | 「エラー率15%超過→ログ確認→フォールバック判断」 |
| 適切な粒度 | 細かすぎず粗すぎない | 5分間隔の集計値、1件ごとではない |
| 段階的エスカレーション | 深刻度に応じた通知先 | INFO→Slack / CRITICAL→PagerDuty |
| ノイズ除去 | 一時的な変動で発報しない | 連続N回超過で初めてアラート |
| 自動解除 | 回復したら自動でクローズ | メトリクスが正常値に戻ったら解除 |
アラートレベルの定義
| レベル | 基準 | 通知手段 | 対応SLA |
|---|
| INFO | 軽微な変動、参考情報 | ダッシュボードのみ | 対応不要 |
| WARNING | 閾値に近づいている | Slack通知 | 翌営業日確認 |
| ERROR | 閾値を超過、性能低下 | Slack + メール | 4時間以内に調査 |
| CRITICAL | サービス影響あり | PagerDuty(電話) | 30分以内に初動 |
アラートルールの設計
LLMシステム向けアラートルール
from dataclasses import dataclass
from enum import Enum
class AlertLevel(Enum):
INFO = "info"
WARNING = "warning"
ERROR = "error"
CRITICAL = "critical"
@dataclass
class AlertRule:
"""アラートルール定義"""
name: str
metric: str
condition: str # ">", "<", "==", "change_rate>"
threshold: float
level: AlertLevel
window_minutes: int = 5
consecutive_count: int = 3 # N回連続で閾値超過
notification_channels: list[str] = None
runbook_url: str = "" # 対応手順書のURL
# NetShop社のアラートルール例
alert_rules = [
AlertRule(
name="エラー率上昇",
metric="error_rate",
condition=">",
threshold=0.05,
level=AlertLevel.ERROR,
window_minutes=5,
consecutive_count=3,
notification_channels=["slack-ai-alerts", "email-oncall"],
runbook_url="https://wiki.netshop.co.jp/runbook/error-rate"
),
AlertRule(
name="レイテンシP95超過",
metric="latency_p95_ms",
condition=">",
threshold=5000,
level=AlertLevel.WARNING,
window_minutes=10,
consecutive_count=2,
notification_channels=["slack-ai-alerts"]
),
AlertRule(
name="品質スコア低下",
metric="quality_score",
condition="<",
threshold=0.7,
level=AlertLevel.ERROR,
window_minutes=60,
consecutive_count=1,
notification_channels=["slack-ai-alerts", "pagerduty"]
),
AlertRule(
name="コスト急増",
metric="hourly_cost_usd",
condition="change_rate>",
threshold=2.0, # 前時間比200%
level=AlertLevel.WARNING,
window_minutes=60,
consecutive_count=1,
notification_channels=["slack-ai-alerts", "email-finance"]
),
AlertRule(
name="ドリフト検出",
metric="psi_score",
condition=">",
threshold=0.2,
level=AlertLevel.ERROR,
window_minutes=1440, # 日次
consecutive_count=1,
notification_channels=["slack-ai-alerts"]
),
]
ダッシュボード設計
ダッシュボードの階層構造
Level 1: エグゼクティブダッシュボード(経営層向け)
├── 月次AIコスト推移
├── 主要KPIサマリー(品質、可用性、コスト)
└── インシデント件数推移
Level 2: オペレーションダッシュボード(運用チーム向け)
├── リアルタイムメトリクス(エラー率、レイテンシ、スループット)
├── モデル別パフォーマンス比較
├── アラート状況一覧
└── ドリフト検出状況
Level 3: デバッグダッシュボード(開発チーム向け)
├── リクエスト詳細ログ
├── プロンプト別成功率
├── トークン使用量の内訳
└── エラーの詳細分析
主要パネルの構成
| パネル | 表示内容 | 更新頻度 |
|---|
| サービス正常性 | 各AIシステムのUp/Down状態 | 1分 |
| エラー率 | 時系列グラフ + 閾値ライン | 5分 |
| レイテンシ | P50/P95/P99の時系列 | 5分 |
| 品質スコア | モデル別の品質トレンド | 1時間 |
| コスト | 時間別/日別のコスト推移 | 1時間 |
| ドリフト | PSI値の日次トレンド | 日次 |
| アラート履歴 | 直近のアラートリスト | リアルタイム |
運用ランブック
ランブックの構成
| セクション | 内容 |
|---|
| アラート概要 | 何が起きているかの説明 |
| 影響範囲 | どのサービス/ユーザーに影響するか |
| 初期確認手順 | 最初に確認すべきメトリクスとログ |
| 対処手順 | ステップバイステップの対応手順 |
| エスカレーション | 対処できない場合の連絡先 |
| 過去事例 | 類似アラートの過去の対応記録 |
エラー率上昇時のランブック例
【ランブック: エラー率上昇】
1. 初期確認(5分以内):
□ エラーの種類を確認(APIエラー? タイムアウト? バリデーション?)
□ 影響を受けているモデル/エンドポイントを特定
□ 直近のデプロイ変更がないか確認
2. 原因切り分け(15分以内):
□ 外部API(OpenAI等)のステータスページを確認
□ 入力データの異常がないか確認(サイズ、形式)
□ インフラメトリクス確認(CPU、メモリ、ネットワーク)
3. 対処:
□ 外部APIダウンの場合 → フォールバックモデルに切替
□ 入力データ異常の場合 → 入力バリデーション強化
□ インフラ問題の場合 → スケーリング or 再起動
□ 原因不明の場合 → エスカレーション(AI推進チームリーダー)
4. 復旧確認:
□ エラー率が閾値以下に回復したことを確認
□ 影響を受けた処理の再実行が必要か判断
□ インシデントレポートを作成
まとめ
| 要素 | ポイント |
|---|
| アラート設計 | アクショナブルで段階的なエスカレーション |
| アラートルール | メトリクス、閾値、連続回数で精度を確保 |
| ダッシュボード | 3階層(経営/運用/開発)で対象者別に設計 |
| ランブック | 対処手順を事前に文書化し対応速度を向上 |
チェックリスト
次のステップへ
次は演習で、NetShop社のモニタリング基盤を実際に設計します。
推定読了時間: 30分