Skip to content

Alarmregel-Schema ​

Alarmregeln werden in der Tabelle alert_rules gespeichert und an POST /v1/alert-rules übermittelt. Diese Seite ist das Wire-Format. Source of truth: internal/manager/model/alert/model.go.

Wire-Form ​

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
}

Feldreferenz ​

Identität ​

FeldTypPflichtBeschreibung
rule_keystringjaStabiler lower_snake-Bezeichner, verwendet in Dedupe-Keys und incident.rule. Einzigartig.
namestringjaAnzeigename.
enabledboolnein (Standard true)Deaktivierte Regeln werden vom Evaluator übersprungen und aus „aktiven" Filtern ausgeblendet.

Quelle / Geltungsbereich ​

FeldTypPflichtBeschreibung
source_typeenumjaongrid_builtin, prometheus_external. Eingebaute Regeln tragen kanonische rule_key-Werte; externe Regeln stammen aus einer importierten Prometheus-Alerting-Regeldatei.
scope_typeenumjahost, global, monitoring_pipeline. Bestimmt, nach welcher Dimension der Evaluator gruppiert — host erzeugt einen Incident pro device_id; global erzeugt einen Incident systemweit; monitoring_pipeline ist für interne Pipeline-Health-Regeln.
join_modeenumjaall (jede Bedingung muss zutreffen), any (irgendeine Bedingung trifft zu). Nur relevant, wenn conditions mehr als ein Element hat.

Art ​

kind unterscheidet, wie der Evaluator conditions interpretiert. Jede Art treibt einen anderen Sub-Evaluator.

ArtStatusWas sie tutConditions-Form
metric_thresholdnur UI-EingabeFreundliches Formular. Die Biz-Schicht schreibt es beim Speichern in metric_raw um; Sie werden diese Art nie auf der Festplatte sehen.[{ "metric": "cpu_pct", "operator": ">=", "threshold": 90, "window": "5m", "for": "2m", "aggregator": "avg" }]
metric_rawliveBeliebiges PromQL. Ticker-getrieben.[{ "expr": "rate(http_500[5m]) > 0.1" }]
metric_anomalyliveAbweichung von einer Rolling-Baseline (z-Score). Ticker-getrieben via PromQuerier.[{ "metric": "node_cpu_usage_percent", "window": "1h", "z_threshold": 3.0 }]
metric_forecastliveLineare Extrapolation (predict_linear), die einen statischen Schwellenwert innerhalb eines zukünftigen Fensters kreuzt.[{ "metric": "node_filesystem_avail_bytes", "window": "1h", "forecast_for": "24h", "below": 1073741824 }]
metric_burn_rateliveSLO-Error-Budget 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-Muster, das beim Treffer feuert.[{ "expr": "{device_id=\"{{.device_id}}\"} |= \"panic\"" }]
log_volumelive (Phase-B)LogQL-Stream-Rate über Schwellenwert.[{ "expr": "sum(rate({app=\"foo\"}[5m])) > 100" }]
trace_latencylive (Phase-B)TraceQL p95 / p99 über Schwellenwert für einen Dienst.[{ "service": "payments", "percentile": 95, "above_ms": 800, "window": "5m" }]
trace_error_ratelive (Phase-B)TraceQL-Error-Span-Anteil über Schwellenwert.[{ "service": "payments", "above_percent": 1.0, "window": "5m" }]

Der vollständige Go-Enum liegt in 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"
)

Legacy-Arten (edge_offline, prom_query, ingest_health, edge_absence, health_ingest, event_internal) werden beim Speichern stillschweigend zu metric_raw aliasiert.

Conditions ​

conditions ist ein Array. Die Form jedes Elements hängt von kind ab — siehe die Tabelle oben. join_mode entscheidet, ob alle Elemente zutreffen müssen (all) oder irgendeines (any).

Für metric_threshold (das UI-Formular) ist jede Bedingung eine 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
}

Die Biz-Schicht kompiliert diese beim Speichern in einen metric_raw-expr unter Verwendung der kanonischen geschlossenen Host-Metrik-Menge (node_cpu_usage_percent, node_memory_used_percent, node_filesystem_used_percent, node_load1, ...).

Severity ​

WertBehandlung
infoaufgezeichnet; Benachrichtigungen gesteuert durch das match_severity_min des Kanals (die meisten Kanäle überspringen diese Untergrenze)
warningStandard
criticalwird immer benachrichtigt, sofern nicht stummgeschaltet

Ein match_severity_min eines Kanals, das auf warning gesetzt ist, akzeptiert warning + critical; critical akzeptiert nur critical. Leer matcht alles.

Labels & Annotations ​

Frei formatierte Schlüssel/Wert-Maps, gespeichert als JSON.

  • labels werden den Labels des Incidents zur Feuerzeit angehängt und für Gruppierung / Dedupe verwendet. Üblich: service, team, env.
  • annotations werden zur Feuerzeit mit Go-Template-Syntax über dem Incident-Snapshot templatisiert — zum Beispiel summary: "CPU on {{$labels.device_id}} above 90%".

Runbook ​

runbook_url wird wortgetreu im Incident-Detail und auf der Chat-Oberfläche neben dem AI-Investigation-Bericht angezeigt. Verwenden Sie es, um auf Ihre internen Runbooks / Playbooks zu verlinken.

Benachrichtigungs-Dampening ​

FeldTypStandardBeschreibung
notify_window_secondsint0Rolling-Fenster für Dampening. 0 deaktiviert.
notify_min_firesint0Mindestanzahl Feuerungen innerhalb des Fensters, bevor benachrichtigt wird. 0 deaktiviert.
notify_channel_idsint[]leerBenachrichtigungen an bestimmte Kanal-IDs binden (unterliegt jeweils den enabled-/Severity-/Scope-Filtern des Kanals). Leer = globaler Router.

Eine Regel, die innerhalb des trailing notify_window_seconds weniger als notify_min_fires-mal feuert, schreibt ein repeat_suppressed-Event in die Timeline (damit Sie sehen, dass das Dampening griff), benachrichtigt aber nicht. Beide null = Dampening aus, jede Feuerung benachrichtigt vorbehaltlich Cooldown- + Silence- + Inhibition-Gates.

Gemischt (eines null, eines >0) wird in der Biz-Schicht mit invalid_argument: notify_window_seconds and notify_min_fires must both be zero or both > 0 abgelehnt.

Incident-Lebenszyklus ​

Die obigen Felder beschreiben eine Regel (die Trigger-Definition). Wenn eine Regel feuert, erzeugt sie einen Incident (Tabelle alert_incidents) mit diesen Status:

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

Incidents lösen sich automatisch auf, wenn die zugrundeliegende Bedingung für einen vollen Evaluator-Zyklus aufklart. Die State Machine ist in internal/manager/biz/alert/ dokumentiert.

Event-Typen ​

Jede Statusübergangs schreibt eine alert_events-Zeile. Stabile Event-Typ-Strings:

Event-TypWann
firingRegel feuert zum ersten Mal (Incident erstellt oder wiedereröffnet)
repeat_suppressedFeuerung innerhalb des Cooldown- / Dampening-Fensters
acknowledgedBenutzer klickt Ack
silencedBenutzer schaltet für N Stunden stumm
resolvedBedingung aufgeklart oder Benutzer klickte Resolve
reopenedaufgelöster Incident feuerte vor dem Löschen erneut
notebenutzer-hinzugefügter Kommentar
notification_senteine Kanal-Zustellung gelungen
notification_failedeine Kanal-Zustellung fehlgeschlagen
inhibitedunterdrückt durch einen aktiven Incident höherer Severity
ai_initial_diagnosiserster Take des proaktiven AI-Investigators, geschrieben, wenn ein Incident zum ersten Mal feuert

Kanal-Typen ​

POST /v1/notification-channels akzeptiert:

Typchannel_type-WertQuelle
WebhookwebhookEnv oder UI
SlackslackEnv oder UI
Larksuite / FeishufeishuEnv oder UI
DingTalkdingtalkEnv oder UI
WeCom (企业微信)wecomnur UI
Telegramtelegramnur UI

Der Legacy-Kanaltyp log wurde 2026-05 entfernt — alert_events selbst ist das Auslieferungs-Audit.

Siehe auch ​