Skip to content

アラートルールスキーマ

アラートルールは alert_rules テーブルに保存され、POST /v1/alert-rules で送信されます。このページはワイヤーフォーマットです。真実の出所:internal/manager/model/alert/model.go

ワイヤー形式

json
{
  "rule_key": "host_cpu_high",
  "kind": "metric_raw",
  "name": "Host CPU pegged",
  "source_type": "ongrid_builtin",
  "scope_type": "host",
  "join_mode": "all",
  "severity": "warning",
  "enabled": true,
  "conditions": [
    { "expr": "node_cpu_usage_percent > 90" }
  ],
  "labels":      { "team": "sre", "service": "host" },
  "annotations": { "summary": "CPU on {{$labels.device_id}} above 90%" },
  "runbook_url": "https://wiki.example.com/runbooks/host-cpu",
  "notify_channel_ids": [12, 17],
  "notify_window_seconds": 600,
  "notify_min_fires": 3
}

フィールドリファレンス

Identity

フィールド必須説明
rule_keystringはいdedupe キーと incident.rule で使われる安定 lower_snake 識別子。一意。
namestringはい表示名。
enabledboolいいえ(デフォルト true無効ルールは evaluator にスキップされ、「active」フィルターから隠される。

Source / scope

フィールド必須説明
source_typeenumはいongrid_builtinprometheus_external。組み込みルールは正典の rule_key 値を持つ。外部ルールはインポートされた Prometheus アラートルールファイルから来る。
scope_typeenumはいhostglobalmonitoring_pipeline。evaluator がどのディメンションでグルーピングするかを決める —— hostdevice_id ごとに 1 つのインシデント、global はシステム全体で 1 つ、monitoring_pipeline は内部パイプラインヘルスルール用。
join_modeenumはいall(すべての条件がマッチ必要)、any(いずれかの条件がマッチ)。conditions の要素が複数のときのみ関係する。

Kind

kind は evaluator が conditions をどう解釈するかを判別します。各 kind が異なるサブ evaluator を駆動します。

Kindステータス何をするかConditions の形
metric_thresholdUI のみ入力フレンドリーフォーム。biz レイヤーが保存時に metric_raw に書き直す。この kind をディスクで見ることはない。[{ "metric": "cpu_pct", "operator": ">=", "threshold": 90, "window": "5m", "for": "2m", "aggregator": "avg" }]
metric_rawlive任意の PromQL。ticker 駆動。[{ "expr": "rate(http_500[5m]) > 0.1" }]
metric_anomalyliveローリングベースラインからの逸脱(z スコア)。PromQuerier 経由 ticker 駆動。[{ "metric": "node_cpu_usage_percent", "window": "1h", "z_threshold": 3.0 }]
metric_forecastlive将来ウィンドウ内に静的しきい値をまたぐ線形外挿(predict_linear)。[{ "metric": "node_filesystem_avail_bytes", "window": "1h", "forecast_for": "24h", "below": 1073741824 }]
metric_burn_rateliveSLO エラーバジェット multi-window multi-burn-rate(Google SRE Workbook)。[{ "good": "sum(rate(http_2xx[1h]))", "total": "sum(rate(http_total[1h]))", "slo": 0.999, "long": "1h", "short": "5m" }]
log_matchlive(Phase-B)ヒットすると発火する LogQL パターン。[{ "expr": "{device_id=\"{{.device_id}}\"} |= \"panic\"" }]
log_volumelive(Phase-B)しきい値超えの LogQL ストリームレート。[{ "expr": "sum(rate({app=\"foo\"}[5m])) > 100" }]
trace_latencylive(Phase-B)サービスのしきい値超え TraceQL p95 / p99。[{ "service": "payments", "percentile": 95, "above_ms": 800, "window": "5m" }]
trace_error_ratelive(Phase-B)しきい値超えの TraceQL エラースパン分率。[{ "service": "payments", "above_percent": 1.0, "window": "5m" }]

完全な Go enum は model/alert/model.go にあります:

go
const (
    RuleKindMetricThreshold = "metric_threshold" // UI-only input
    RuleKindMetricAnomaly   = "metric_anomaly"
    RuleKindMetricForecast  = "metric_forecast"
    RuleKindMetricBurnRate  = "metric_burn_rate"
    RuleKindMetricRaw       = "metric_raw"
    RuleKindLogMatch        = "log_match"
    RuleKindLogVolume       = "log_volume"
    RuleKindTraceLatency    = "trace_latency"
    RuleKindTraceErrorRate  = "trace_error_rate"
)

レガシー kind(edge_offlineprom_queryingest_healthedge_absencehealth_ingestevent_internal)は保存時にサイレントに metric_raw にエイリアスされます。

Conditions

conditions は配列です。各要素の形は kind に依存します —— 上の表を参照。join_mode は全要素がマッチ必要(all)か、いずれか(any)かを決めます。

metric_threshold(UI フォーム)では、各 condition は RuleCondition

go
type RuleCondition struct {
    Metric     string  `json:"metric"`            // e.g. "cpu_pct"
    Operator   string  `json:"operator"`          // ">", ">=", "<", "<=", "=="
    Threshold  float64 `json:"threshold"`         // numeric trigger
    Window     string  `json:"window,omitempty"`  // e.g. "5m"
    For        string  `json:"for,omitempty"`     // sustain duration
    Aggregator string  `json:"aggregator,omitempty"` // avg / max / min
}

biz レイヤーは保存時にこれらを正典のクローズドセットホストメトリクス(node_cpu_usage_percentnode_memory_used_percentnode_filesystem_used_percentnode_load1、…)を使って metric_raw expr にコンパイルします。

Severity

扱い
info記録される。通知はチャネルの match_severity_min でゲート(ほとんどのチャネルはこのフロアをスキップ)
warningデフォルト
criticalサイレンスされない限り常に通知

チャネルの match_severity_minwarning にすると warning + critical を受け入れます。criticalcritical のみ。空は何でも受け入れます。

Labels と annotations

JSON として保存される自由形式の key/value マップ。

  • labels は発火時にインシデントの labels に追加され、グルーピング / dedupe に使われます。よくあるもの:serviceteamenv
  • annotations は発火時にインシデントスナップショットに対する Go テンプレート構文でテンプレート展開されます —— たとえば summary: "CPU on {{$labels.device_id}} above 90%"

Runbook

runbook_url はインシデント詳細とチャット画面で AI 調査レポートの隣に逐語表示されます。社内 runbook / プレイブックにリンクするのに使用してください。

通知ダンピング

フィールドデフォルト説明
notify_window_secondsint0ダンピング用ローリングウィンドウ。0 で無効。
notify_min_firesint0通知送信前にウィンドウ内で発火する最小回数。0 で無効。
notify_channel_idsint[]特定チャネル ID に通知をピン留め(チャネル自身の enabled / severity / scope フィルターに従う)。空 = グローバルルーター。

末尾の notify_window_seconds 内で notify_min_fires 回未満発火するルールは、タイムラインに repeat_suppressed イベントを書きます(ダンピングが効いたことが分かるように)が、通知 しません。両方ゼロ = ダンピングオフ、すべての発火が cooldown + silence + 抑制ゲートに従って通知。

混合(一方がゼロ、もう一方が >0)は biz レイヤーで invalid_argument: notify_window_seconds and notify_min_fires must both be zero or both > 0 で拒否されます。

インシデントライフサイクル

上のフィールドは ルール(トリガー定義)を記述します。ルールが発火すると以下のステータスを持つ インシデントalert_incidents テーブル)を生成します:

text
open ─┬─> acknowledged ─> resolved
      ├─> silenced ─> resolved
      └─> resolved

インシデントは基底条件が 1 完全 evaluator サイクルクリアされると自動解決します。ステートマシンは internal/manager/biz/alert/ に文書化されています。

イベントタイプ

各状態遷移は alert_events 行を記録します。安定イベントタイプ文字列:

イベントタイプいつ
firingルール初回発火(インシデント作成または再オープン)
repeat_suppressedcooldown / ダンピングウィンドウ内の発火
acknowledgedユーザーが Ack をクリック
silencedユーザーが N 時間サイレンス
resolved条件クリアまたはユーザーが Resolve をクリック
reopened削除前に解決済みインシデントが再発火
noteユーザー追加コメント
notification_sent1 チャネル配信成功
notification_failed1 チャネル配信失敗
inhibitedより高い severity のアクティブインシデントに抑制された
ai_initial_diagnosisインシデント初回発火時に書かれる、プロアクティブな AI investigator の初回テイク

チャネルタイプ

POST /v1/notification-channels が受け入れるもの:

タイプchannel_typeソース
Webhookwebhookenv または UI
Slackslackenv または UI
Larksuite / Feishufeishuenv または UI
DingTalkdingtalkenv または UI
WeCom(企业微信)wecomUI のみ
TelegramtelegramUI のみ

レガシー log チャネルタイプは 2026-05 に削除されました —— alert_events 自体が配信監査です。

関連