Notiz

Vier goldene Signale: was sie wirklich erfassen und warum der Stack VictoriaMetrics + Loki heißt

Was jedes der vier Signale tatsächlich erfasst und drei Fallen, bei denen „wir haben Monitoring“ zu grünen Häkchen über einem kaputten Service wird.

Die „vier goldenen Signale" von Google SRE — Latency, Traffic, Errors, Saturation — sind die Baseline jedes Architektur-Interviews. In der Praxis werden sie auswendig aufgezählt und ein Häkchen wird gesetzt; ein Jahr später zeigt das Incident-Postmortem, dass keines der vier in der Produktion erwischt hat, was es erwischen sollte.

Was jedes Signal tatsächlich erfasst

Latency. Nicht der Mittelwert — der maskiert den Tail. Nur p95 / p99. Ein Request, der jedes zehnte Mal fünf Sekunden braucht, ist im Mittelwert unsichtbar; der unglückliche Nutzer geht. Latency erfolgreicher Requests von Latency fehlerhafter Requests trennen: ein 500 in 50 ms und ein 200 in 5 Sekunden sind zwei verschiedene Brände.

Traffic. Nicht „wie viele RPS", sondern wohin sie gehen. Per-Target-Imbalance am Load Balancer von mehr als 40 % bedeutet versteckte Degradation: eine Node wird zum digitalen schwarzen Loch, 99 % des Traffics werden bedient, 1 % hängt ohne Alert. Slowness ist schlimmer als ein Ausfall — Retention sinkt lautlos.

Errors. Explizite 5xx ist die halbe Wahrheit. Implizite Fehler — Timeouts, abgestürzte Upstreams, Retries, die im sechsten Anlauf „erfolgreich" wurden — erreichen den Standard-5xx-Counter nie. Das Error Budget steht auf der Success-Rate, nicht auf 5xx.

Saturation. Die irreführendste Metrik. Ein I/O-bound Service (wartet auf die Datenbank oder eine externe API) zeigt bei p99-Latenz von 8 Sekunden CPU bei 12 %. Die Pods sind nicht ausgelastet — sie warten. HPA autoscaling/v2 auf CPU/Memory ist hier komplett blind; für den Autoscaler sieht es aus wie „ein System ohne Traffic", also skaliert er herunter. Saturation misst man über Request Rate, Queue Depth, SLO Burn Rate — also über KEDA, nicht über den nativen HPA.

Ursache-Wirkungs-Kette eines Ausfalls: traffic↑ → saturation↑ → latency↑ → errors↑. Wer sie verfolgt, fängt das Problem vor dem Nutzer-Impact ab. Das Aufzählen der Signale aus dem Kopf nicht.

Warum der Stack VictoriaMetrics + Loki heißt

Prometheus als Referenzimplementierung der vier goldenen Signale ist nach wie vor Standard. In Produktion 2026 fällt die Wahl häufiger auf VictoriaMetrics: 10-fache Storage-Dichte, 10-mal mehr aktive Series, MetricsQL als Obermenge von PromQL, eingebauter Long-Term-Storage ohne separates Thanos/Cortex. vmagent ist als Scraper leichter als Prometheus, vmauth deckt Multi-Tenancy ab.

Logs — Loki. Nicht weil es OpenSearch „schlägt", sondern weil Full-Text-Indexing teuer und selten nötig ist. Loki indexiert nur Labels und speichert den Log-Körper günstig. Die Korrelation zwischen Metrik und Log läuft über eine gemeinsame trace_id oder request_id, nicht über einen Full-Text-Join. Promtail ist im Maintenance-Mode: auf frischen Clustern steht Grafana Alloy — ein einziger Pipeline-Collector in River-Language, der Promtail + node-exporter + OTel Collector durch ein DaemonSet ersetzt.

Die Erklärung „wir haben Monitoring" über Tool-Namen ist ein schwaches Signal. Stark ist die Erklärung über den Data Flow:

Application → OTel SDK / OBI
  → Collection (vmagent / Alloy)
    → Storage (VictoriaMetrics / Loki)
      → Visualization (Grafana)
        → Alerting (Alertmanager)

Das Schema hält beim Austausch von Knoten: Loki gegen OpenSearch, VictoriaMetrics gegen Datadog — die Struktur bleibt gleich. Ein Architekt erklärt den Flow und die Trade-offs an jedem Knoten; ein Engineer zählt Tool-Namen auf.

Drei Fallen hinter „wir haben Monitoring"

Producer überwachen, nicht den Output. Die ALB-Target-Group ist vier Tage lang grün, während sitemap.xml stale ist, weil der Hintergrundservice, der sie erzeugt, seinen Alias verloren hat. Der Producer-Health-Check fängt das nie. Jedes extern konsumierte Artefakt bekommt einen eigenen Freshness-Probe — eine Last-Modified-Age-Prüfung. Den Output überwachen, nicht nur den Producer.

Cardinality-Explosion in Labels. user_id, session_id, request_id, pod_uid, path ohne Normalisierung — innerhalb von Wochen ein sofortiger TSDB-Tod. Diese Labels werden im Metrics-Code-Review mit derselben Disziplin geblockt wie Produktionscode. High-Cardinality-Daten leben in Trace-Attributen (sampled) und Log-Feldern, nicht in Metric-Labels.

Local Alerting auf demselben Cluster. Fällt der Cluster aus, fallen auch die Alerts aus, die vor dem Ausfall hätten warnen sollen. Control-Plane-Observability — ein separater Cluster, ein Managed Service oder ein externer Receiver. Push, nicht Pull. Wenn der beobachtete Cluster fällt, sieht der Beobachter die Stille als Signal — nicht als fehlende Daten.

Das Minimum, das „wir haben Monitoring" wirklich bedeutet

Nicht 50 Alerts, sondern 5–8 actionable. Jeder Alert trägt eine runbook_url in den Annotations. Jeder Critical-Alert ist eine SLO Burn Rate mit Multi-Window-Setup, kein Threshold-Flap. Jeder Service liefert strukturierte JSON-Logs mit trace_id, service, team, env. Und einmal pro Quartal ein Disaster-Visibility-Test: ein simulierter Cluster-Ausfall. Wenn die Alerts nicht ankommen und die Dashboards dunkel bleiben, hinkt Observability ein bis zwei Stufen hinterher — und ein echter Incident zeigt das teurer als eine Übung.

© 2026 axyi.ru · CC BY 4.0