Read in English · Leer en español · Lire en français
Abschnitt 9.6 von 9.8 · Mittelstufe · 26 Min. Lesezeit
Observability: Logs, Metriken und Traces
Videolektion
5 Min. · auf Englisch gesprochen, mit UntertitelnNur anhören (Audio)
Transkript lesen
Willkommen zu Abschnitt neun Punkt sechs. Wenn sich ein System in der Produktion falsch verhält, müssen Sie schnell herausfinden, warum. In dieser Lektion geht es darum, Systeme zu bauen, die Ihnen das ermöglichen.
Ein Auto-Armaturenbrett zeigt ein paar Anzeigen und Warnleuchten: Geschwindigkeit, Tankfüllung, Motortemperatur. Das ist Monitoring. Es informiert Sie über Probleme, die jemand vorhergesehen hat. Macht das Auto aber ein seltsames Geräusch, das keine Leuchte erklärt, hilft das Armaturenbrett nicht. Eine Mechanikerin schließt einen Diagnosecomputer an und liest detaillierte Aufzeichnungen darüber, was jedes Teil getan hat, um einen Fehler zu finden, den niemand vorhergesehen hat. Observability bedeutet, Software so zu bauen, dass diese Art der Untersuchung immer möglich ist: Jedes Teil führt klare Aufzeichnungen, und eine Fahrt lässt sich von Teil zu Teil verfolgen.
Monitoring beantwortet Fragen, die man vorher zu stellen wusste: Ist die Festplatte zu neunzig Prozent voll? Observability ist eine Eigenschaft des Systems: Können Sie Verhalten erklären, das niemand vorhergesehen hat? Eine Bestellung könnte langsam sein, weil ein neues Speisekarten-Feature eine Abfrage verlangsamt, aber nur für Restaurants mit mehr als fünfhundert Gerichten. Dafür hat niemand ein Dashboard gebaut. Mit Observability können Sie die Telemetrie nach beliebigen Attributen aufschlüsseln, bis das Muster sichtbar wird. Deshalb muss sie von Anfang an eingeplant werden, durch konsistente Instrumentierung und gemeinsame Identifikatoren. Während eines Incident lässt sie sich nicht nachrüsten.
Metriken sind über die Zeit aggregierte Zahlen, etwa Anfragen pro Sekunde. Sie sind günstig und ideal für Dashboards und Alerts, können Ihnen aber nichts über eine bestimmte Anfrage sagen. Logs zeichnen einzelne Ereignisse auf. Schreiben Sie sie als strukturierte Felder mit vereinbarten Namen statt als Freitext. Und loggen Sie nie Secrets oder unnötige personenbezogene Daten. Traces zeigen den Weg einer Anfrage durch viele Services und wo ihre Zeit geblieben ist. Und Profile zeigen, wo der Code selbst Prozessorzeit oder Speicher verbraucht.
Ein häufiger Fehler bei Metriken ist das Mitteln von Perzentilen. Der Speisekartenservice läuft auf zwei Instanzen. Instanz A ist gesund, mit einem neunundneunzigsten Perzentil von hundertachtzig Millisekunden. Instanz B hat einen lauten Nachbarn. Dreitausend ihrer zehntausend Anfragen sind langsam, und ihr neunundneunzigstes Perzentil liegt bei tausendachtzig Millisekunden. Mittelt man die beiden, zeigt das Dashboard sechshundertdreißig Millisekunden. Aber die langsamsten zweihundert aller zwanzigtausend Anfragen liegen auf Instanz B. Der wahre Wert beträgt tausendsechzig Millisekunden. Das Dashboard unterschätzt den Tail um vierhundertdreißig Millisekunden. Perzentile lassen sich nicht mitteln. Addieren Sie stattdessen die Histogramm-Buckets über die Server und lesen Sie das Perzentil aus dem zusammengeführten Ergebnis ab.
Zwei kurze Checklisten decken das meiste ab, was zu messen ist. Messen Sie für alles, was Anfragen bedient, Rate, Fehler und Dauer. Das ist die RED-Methode von Tom Wilkie. Messen Sie für jede Ressource, etwa einen Prozessor, eine Festplatte oder einen Connection-Pool, Auslastung, Sättigung und Fehler. Das ist die USE-Methode von Brendan Gregg. Googles Four Golden Signals, Latenz, Traffic, Fehler und Sättigung, sind im Grunde RED plus Sättigung. In der Praxis beschreibt RED, was Nutzer erleben, und USE erklärt, warum. Steigende Zahlungslatenz könnte sich durch einen vollen Connection-Pool erklären, in dem vierzig Anfragen warten.
Über Services hinweg gibt es keinen einzelnen Stack Trace, also baut Distributed Tracing einen nach. Jede Anfrage erhält am Rand einen Trace-Identifikator, und jede Arbeitseinheit wird zu einem Span. Dieser Trace zeigt eine Bestellanfrage, die neunhundertvierzig Millisekunden dauerte. Die Preisgestaltung brauchte nur fünfundsiebzig Millisekunden. Der Zahlungsservice brauchte siebenhundertsechzig, und darin brauchte der externe Kartenanbieter siebenhundertzwanzig. Dort ist die Zeit geblieben: nicht in den eigenen Services der Plattform. Tracing setzt voraus, dass jeder Service den Trace-Kontext über den Standard-Header traceparent weitergibt. Ein Service, der ihn verliert, zerbricht jeden Trace, der durch ihn läuft. OpenTelemetry ist heute der herstellerneutrale Standard für die Erzeugung von Traces, Metriken und Logs.
Telemetrie kann mehr kosten als das System, das sie beobachtet. Jede eindeutige Kombination von Metrik-Labels ist eine eigene Zeitreihe. Ein einziges Histogramm der Anfragedauer im Bestellservice ergibt bereits hundertsechsundzwanzigtausend Zeitreihen. Fügen Sie ein Label für jedes von vierzigtausend Restaurants hinzu, und daraus werden etwa fünf Milliarden. Fragen pro Restaurant gehören in Traces und Logs. Alarmieren Sie schließlich bei Symptomen, die Nutzer spüren, etwa einem schnellen SLO-Burn, nicht bei Ursachen wie hoher CPU-Last. Jede Alarmierung sollte dringend, umsetzbar und echt sein.
Der vollständige Abschnitt behandelt den Collector von OpenTelemetry, Trace-Sampling und Dashboards, die Fragen beantworten. Als Nächstes, in Abschnitt neun Punkt sieben, geht es um Kapazitätsplanung und Performancetests. Bis gleich.
Was Sie wissen müssen
- Monitoring prüft vordefinierte Bedingungen; Observability ist die Fähigkeit, neues, nicht vorhergesehenes Verhalten aus vorhandener Telemetrie zu erklären, und muss durch konsistente Instrumentierung und gemeinsame Identifikatoren von Anfang an eingeplant werden.
- Metriken sind günstige Aggregate für Trends und Alerts, strukturierte Logs zeichnen einzelne Ereignisse auf, Traces zeigen den Weg einer Anfrage durch Services, und Profile zeigen, wo Code Ressourcen verbraucht.
- Counter, Gauges und Histogramme sind die zentralen Metriktypen; Perzentile lassen sich nicht über Server oder Zeit mitteln, Histogramm-Buckets aber addieren, und das Perzentil wird aus dem zusammengeführten Ergebnis abgelesen.
- RED (Rate, Errors, Duration) beschreibt Services, USE (Utilisation, Saturation, Errors) beschreibt Ressourcen, und die Four Golden Signals sind Latenz, Traffic, Fehler und Sättigung.
- Distributed Tracing (Dapper, 2010) verknüpft Spans durch Kontextweitergabe, standardisiert durch den W3C-Header traceparent; OpenTelemetry, ein 2026 graduiertes CNCF-Projekt, ist der herstellerneutrale Standard für die Erzeugung von Traces, Metriken und Logs.
- Unbegrenzte Label-Werte lassen die Kardinalität von Metriken und die Kosten explodieren; Details pro Nutzer oder pro Bestellung gehören daher in Traces und Logs, und Tail-based Sampling behält die Traces, auf die es ankommt.
- Alarmieren Sie bei Symptomen, die Nutzer spüren, etwa SLO-Burn-Rates, nicht bei Ursachen wie der CPU, und bauen Sie jedes Dashboard so, dass es eine Frage für ein Publikum beantwortet.
Monitoring und Observability
Monitoring bedeutet, vordefinierte Messwerte und Prüfungen zu erfassen und Alarm zu schlagen, wenn sie eine Schwelle überschreiten: Festplatte zu 90 % voll, Fehlerrate über 1 %, Health Check schlägt fehl. Es beantwortet Fragen, die man vorher zu stellen wusste. Observability (Beobachtbarkeit) ist eine Eigenschaft des Systems: wie gut Sie seinen inneren Zustand verstehen können, auch Zustände, die niemand vorhergesehen hat, und zwar aus der Telemetrie, die es bereits ausgibt, ohne neuen Code auszuliefern, um es herauszufinden. Der Begriff stammt aus der Regelungstechnik, wo Rudolf Kálmán ihn 1960 als die Fähigkeit definierte, den inneren Zustand eines Systems aus seinen Ausgaben zu erschließen.
Die Unterscheidung ist wichtig, weil verteilte Systeme meist auf neue Weise ausfallen. Eine Essensbestellung kann langsam sein, weil die Tablet-App eines Restaurants aggressiv wiederholt, weil der Endpoint eines Zahlungsanbieters in einer Region beeinträchtigt ist oder weil ein neues Speisekarten-Feature eine Abfrage nur für Restaurants mit mehr als 500 Gerichten verlangsamt. Für keinen dieser Fälle hat jemand ein Dashboard gebaut. Monitoring sagt Ihnen, dass der Bezahlvorgang langsam ist; Observability lässt Sie fragen, für wen, wo und warum, indem Sie die Telemetrie nach beliebigen Attributen aufschlüsseln, bis das Muster sichtbar wird.
Fachleute sind uneins darüber, wie weit die Unterscheidung reicht. Eine Sicht, verbreitet bei Tool-Anbietern, versteht Observability als Dach über drei Säulen: Logs, Metriken und Traces. Charity Majors, Liz Fong-Jones und George Miranda (Observability Engineering, O’Reilly, 2022) argumentieren, dass das Säulenmodell den Kern verfehlt und Observability reichhaltige, strukturierte Ereignisse mit hoher Kardinalität erfordert, die sich in beliebigen Kombinationen abfragen lassen. Beide Lager sind sich über die architektonische Konsequenz einig: Observability ist ein Qualitätsmerkmal, das durch konsistente Instrumentierung, gemeinsame Identifikatoren und Kontextweitergabe von Anfang an eingeplant werden muss, weil es sich während eines Incident nicht nachrüsten lässt.
Arten von Telemetrie
| Signal | Was er ist | Am besten für | Hauptkosten oder Grenze |
|---|---|---|---|
| Metriken | Numerische Zeitreihen, pro Intervall aggregiert und mit wenigen Dimensionen gelabelt | Günstige Langzeittrends, Dashboards, Alerting auf SLIs | Voraggregiert: kann keine Fragen zu einzelnen Anfragen beantworten; Labels müssen niedrige Kardinalität haben |
| Logs | Aufzeichnungen einzelner Ereignisse mit Zeitstempel, idealerweise strukturiert | Details zu einem Ereignis: ein Fehler, eine Entscheidung, ein Audit-Eintrag | Volumen und Kosten wachsen mit dem Traffic; Freitext ist schwer abzufragen |
| Traces | Bäume zeitlich erfasster Spans, die den Weg einer Anfrage durch Services zeigen | Herausfinden, wo die Zeit bleibt und welcher Hop in einem verteilten Aufruf fehlschlug | Müssen bei großem Volumen gesampelt werden; nutzlos, wenn ein Hop den Kontext verliert |
| Profile | Stichproben, wo Code CPU-Zeit verbraucht oder Speicher belegt | Auf Code-Ebene erklären, warum ein Service langsam oder teuer ist | Neuere Werkzeuge; kontinuierliches Profiling verursacht etwas Overhead |
| Wide Events | Ein Datensatz mit vielen Attributen pro Anfrage und pro Service | Ad-hoc-Aufschlüsselung nach beliebigen Attributen (Kunde, Version, Region) | Braucht einen Speicher, der für Abfragen mit hoher Kardinalität gebaut ist |
Strukturiertes Logging
Eine Logzeile wie Payment failed for order 81F3 after 3001ms ist leicht zu schreiben und schwer zu nutzen: Jede Abfrage braucht einen fragilen regulären Ausdruck, und jeder Entwickler formuliert anders. Strukturiertes Logging schreibt jeden Eintrag als Schlüssel-Wert-Felder, meist JSON, mit vereinbarten Namen: Zeitstempel, Level, Service, Ereignisname, fachliche Identifikatoren (Bestellung, Restaurant, Kurier), Ergebnis, Dauer sowie die Trace- und Span-Identifikatoren, die die Zeile mit ihrem Trace verknüpfen. Abfragen werden präzise (alle card_authorisation_failed-Ereignisse für den Anbieter cardco in der letzten Stunde, gruppiert nach http_status
), und Logs verschiedener Services lassen sich verknüpfen.
Ein paar Regeln halten Logs nützlich und bezahlbar. Loggen Sie Ereignisse, keine Prosa; verwenden Sie einen festen Ereignisnamen pro Art von Ereignis. Verwenden Sie Levels konsistent, und loggen Sie nicht auf Error-Level für Zustände, bei denen niemand handeln muss. Loggen Sie nie Secrets, Tokens, vollständige Kartennummern oder unnötige personenbezogene Daten; Telemetrie-Pipelines werden kopiert, an Dritte übermittelt und monatelang aufbewahrt, sie sind daher eine häufige Quelle von Datenlecks, und personenbezogene Daten in Logs fallen wie jede andere Kopie unter die DSGVO (Abschnitt 8.7). Security Logging und Erkennung, ein verwandter, aber anderer Zweck mit eigenen Anforderungen an Aufbewahrung und Integrität, werden in Abschnitt 8.8 behandelt.
traceparent: 00-4bf92f3577b34da6a3ce929d0e0e4736-00f067aa0ba902b7-01
version-trace id (16 bytes)-parent span id (8 bytes)-flags (01 = sampled)
{"ts": "2026-10-22T12:31:07.412Z", "level": "error",
"service": "payment-service", "event": "card_authorisation_failed",
"order_id": "ord_81F3", "provider": "cardco", "http_status": 504,
"duration_ms": 3001, "attempt": 2,
"trace_id": "4bf92f3577b34da6a3ce929d0e0e4736", "span_id": "00f067aa0ba902b7"}Metriken und warum sich Perzentile nicht mitteln lassen
Die meisten Metriksysteme, etwa Prometheus (ein graduiertes CNCF-Projekt) und das Metrikmodell von OpenTelemetry, bieten dieselben wenigen Typen. Ein Counter steigt nur, etwa die Gesamtzahl bedienter Anfragen; Sie lesen ihn als Rate (Anfragen pro Sekunde über die letzten fünf Minuten), was auch Neustarts übersteht. Ein Gauge ist ein aktueller Wert, der steigt und fällt: Queue-Länge, belegte Verbindungen, Speicher. Ein Histogramm zählt Beobachtungen in Buckets (zum Beispiel Anfragen unter 50 ms, unter 100 ms, unter 250 ms und so weiter) plus eine Gesamtzahl und eine Summe, aus denen Perzentile geschätzt werden. Prometheus hat außerdem einen Summary-Typ, der Quantile in jedem Prozess berechnet.
Die Unterscheidung zwischen Histogrammen und Summaries ist kein Detail. Wie Abschnitt 2.4 festgestellt hat, ist ein Perzentil eine Eigenschaft einer ganzen Verteilung, und das Perzentil einer kombinierten Verteilung lässt sich nicht aus den Perzentilen ihrer Teile berechnen. Wer p99-Werte über Server oder über Minuten mittelt, erhält eine Zahl, die kein Perzentil von irgendetwas ist. Bucket-Zählungen lassen sich dagegen einfach addieren: Summieren Sie jeden Bucket über alle Server und schätzen Sie dann das Perzentil aus dem zusammengeführten Histogramm. Deshalb sollten flottenweite Latenz-SLIs auf Histogrammen aufbauen (oder auf Zählungen von Anfragen unter einer Schwelle, wie in Abschnitt 9.5), nie auf Summaries pro Instanz.
Ausgearbeitetes Beispiel
Ausgearbeitetes Beispiel: zwei p99-Werte mitteln
Der Speisekartenservice läuft auf zwei Instanzen, die in einem Fünf-Minuten-Intervall jeweils 10.000 Anfragen verarbeiten. Instanz A ist gesund: Alle ihre Anfragen dauern 20 bis 300 ms, und ihr p99 liegt bei 180 ms. Instanz B hat einen lauten Nachbarn: 7000 Anfragen dauern 20 bis 300 ms, aber 3000 verteilen sich gleichmäßig zwischen 500 und 1100 ms.
| p99 von B (die langsamsten 100 von 10.000) | 1100 - 600 × (100 / 3000) = 1080 ms |
|---|---|
| Mittelwert der beiden p99 | (180 + 1080) / 2 = 630 ms |
| Wahres p99 aller 20.000 Anfragen | Die langsamsten 200 liegen alle auf B: 1100 - 600 × (200 / 3000) = 1060 ms |
| Fehler durch Mittelung | 630 ms gemeldet gegenüber 1060 ms erlebt: Das Dashboard unterschätzt den Tail um 430 ms |
| Mit Histogrammen | Addieren Sie die Bucket-Zählungen von A und B und lesen Sie das 99. Perzentil aus den zusammengeführten Buckets ab: etwa 1060 ms, begrenzt nur durch die Bucket-Breite |
Gemittelte Perzentile können in beide Richtungen falsch sein, und der Fehler wächst, wenn Instanzen unterschiedlichen Traffic tragen.
Dasselbe gilt über die Zeit: Das p99 einer Stunde ist nicht der Mittelwert von zwölf p99-Werten über je fünf Minuten.
Was messen: RED, USE und die Golden Signals
Drei kurze Checklisten decken das meiste ab, was ein Service bereitstellen sollte. Die RED-Methode, 2015 von Tom Wilkie vorgeschlagen, gilt für alles, was Anfragen bedient: Rate (Anfragen pro Sekunde), Errors (fehlgeschlagene Anfragen pro Sekunde) und Duration (die Verteilung der Antwortzeiten). Die USE-Methode von Brendan Gregg gilt für Ressourcen: Prüfen Sie für jede CPU, jede Festplatte, jede Netzwerkverbindung, jeden Connection-Pool und jede Queue Utilisation (wie ausgelastet sie ist), Saturation (wie viel Arbeit wartet) und Errors. Die Four Golden Signals aus dem Kapitel des Google-SRE-Buchs über das Monitoring verteilter Systeme sind Latenz, Traffic, Fehler und Sättigung: im Grunde RED plus Sättigung.
In der Praxis beschreibt RED, was Nutzer erleben, und USE erklärt, warum. Steigt die Dauer beim Zahlungsservice (RED), könnte USE auf seinen Ressourcen einen Connection-Pool mit 100 % Auslastung und 40 wartenden Anfragen zeigen (Sättigung), was wiederum auf den langsamen Kartenanbieter verweist, der Verbindungen offen hält. Messen Sie die Latenz für Erfolge und Fehlschläge getrennt: Ein schneller Fehler ist keine gute Latenz, und ein Timeout ist sowohl ein Fehler als auch eine langsame Antwort.
Drei Checklisten im Vergleich
| Checkliste | Gilt für | Signale | Typische Frage, die sie beantwortet |
|---|---|---|---|
| RED (Wilkie) | Anfragegetriebene Services | Rate, Errors, Duration | Bedient der Bestellservice die Nutzer gerade gut? |
| USE (Gregg) | Ressourcen: CPU, Speicher, Festplatten, Pools, Queues | Utilisation, Saturation, Errors | Welche Ressource ist der Engpass? |
| Four Golden Signals (SRE-Buch) | Nutzerseitige Systeme | Latenz, Traffic, Fehler, Sättigung | Ist das System gesund, und wie nah ist es an seinen Grenzen? |
Distributed Tracing
In einem Monolithen zeigt ein Stack Trace, wo eine langsame Anfrage ihre Zeit verbracht hat. Über Services hinweg gibt es keinen einzelnen Stack. Distributed Tracing baut einen nach: Jede Anfrage erhält am Rand einen Trace-Identifikator, jede Arbeitseinheit wird zu einem Span (mit Name, Startzeit, Dauer, Status, Attributen und dem Identifikator ihres Eltern-Spans), und ein Tracing-Backend setzt die Spans zu einem Baum zusammen. Googles Dapper-Paper (Sigelman und Kollegen, 2010) beschrieb den Ansatz in großem Maßstab: geringer Overhead, Instrumentierung in gemeinsamen Bibliotheken statt im Anwendungscode und Sampling, sodass nur ein Bruchteil der Anfragen aufgezeichnet wird.
Tracing hängt vollständig von der Kontextweitergabe (Context Propagation) ab: Jeder Service muss den Trace-Kontext an den nächsten weitergeben. Die Spezifikation W3C Trace Context (seit 2020 eine W3C Recommendation) standardisiert das für HTTP mit einem traceparent-Header, der eine Version, eine 16-Byte-Trace-ID, die 8-Byte-ID des aufrufenden Spans und Flags enthält, etwa ob der Trace gesampelt wird, plus einem optionalen tracestate-Header für herstellerspezifische Daten. Beim Messaging reisen dieselben Werte in Nachrichtenheadern, und der Span des Consumers verweist auf den des Producers. Ein einziger Service, der den Header verliert (eine alte Bibliothek, ein handgeschriebener HTTP-Client, ein Batch-Job), zerbricht jeden Trace, der durch ihn läuft; deshalb gehört die Weitergabe in gemeinsame Plattformbibliotheken, nicht in den Code jedes Teams.
Jeden Span jeder Anfrage aufzuzeichnen ist bei großem Volumen teuer, daher werden Traces gesampelt. Head-based Sampling entscheidet zu Beginn der Anfrage (1 von 100 behalten) und ist günstig, verwirft aber die meisten der seltenen langsamen und fehlgeschlagenen Anfragen, auf die es Ihnen ankommt. Tail-based Sampling puffert Spans, bis die Anfrage abgeschlossen ist, und behält dann alle Fehler, alle Anfragen über einer Schwelle und einen kleinen Teil des Rests; es braucht mehr Speicher im Collector, behält aber die interessanten Traces.
Ein Trace über die Services der Essenslieferplattform
OpenTelemetry: ein Standard für die Instrumentierung
Bis etwa 2019 hatte jeder Tracing- und Monitoring-Anbieter eigene Agents und Bibliotheken, ein Anbieterwechsel bedeutete also, jeden Service neu zu instrumentieren. OpenTelemetry (OTel) entstand 2019 durch die Zusammenführung zweier früherer Open-Source-Projekte, OpenTracing und OpenCensus, unter der Cloud Native Computing Foundation (CNCF) und wurde im Mai 2026 als CNCF-Projekt graduiert. Es bietet Sprach-APIs und SDKs, automatische Instrumentierung für gängige Frameworks und Clients, das Wire-Protokoll OTLP, den Collector und semantische Konventionen, die Attributnamen wie http.request.method und http.response.status_code festlegen, damit Telemetrie verschiedener Teams und Sprachen zusammenpasst. Traces, Metriken und Logs sind stabil; Profile kamen als viertes Signal hinzu und gingen 2026 in eine öffentliche Alphaphase.
Der architektonische Wert liegt in der Trennung von Instrumentierung und Backend. Services senden OTLP an einen Collector, der meist neben jedem Knoten oder als zentrales Gateway läuft; der Collector bündelt, sampelt, entfernt sensible Attribute, ergänzt Metadaten wie die Deployment-Version und exportiert in die Speicher, die die Organisation nutzt. Ein Anbieterwechsel oder das Senden derselben Daten an zwei Backends während einer Migration wird zu einer Konfigurationsänderung am Collector statt zu einer Codeänderung in zweihundert Services. Ein Plattformteam stellt typischerweise SDK-Einrichtung, Weitergabe und Collector als Paved Road bereit, sodass Produktteams nur fachliche Attribute ergänzen.
Telemetrie-Pipeline
from opentelemetry import trace
import structlog
tracer = trace.get_tracer("order-service")
log = structlog.get_logger()
def place_order(order):
with tracer.start_as_current_span("place_order") as span:
span.set_attribute("restaurant.id", order.restaurant_id)
span.set_attribute("order.item_count", len(order.items))
quote = pricing.quote(order) # instrumented HTTP client adds
payment.authorise(order, quote) # the traceparent header itself
log.info("order_placed", order_id=order.id,
total_pence=quote.total_pence)
return order.idKardinalität und Kosten
Telemetrie kann leicht mehr kosten als das System, das sie beobachtet. Der Haupttreiber bei Metriken ist die Kardinalität: Jede eindeutige Kombination von Label-Werten ist eine eigene Zeitreihe, die gespeichert und indiziert werden muss. Labels mit wenigen Werten (HTTP-Methode, Statusklasse, Region) sind unproblematisch. Labels mit unbegrenzten Werten (Nutzer-ID, Bestell-ID, vollständige URL mit Identifikatoren darin, Text von Fehlermeldungen) vervielfachen die Zeitreihen ohne Grenze und können ein Metriksystem lahmlegen.
Ausgearbeitetes Beispiel
Ausgearbeitetes Beispiel: Zeitreihen zählen
Der Bestellservice exportiert ein Histogramm der Anfragedauer mit 12 Buckets. Prometheus speichert jeden Bucket als Zeitreihe, plus eine Summe und eine Anzahl, also 14 Zeitreihen pro Label-Kombination.
| Paare aus Route und Methode | 60 |
|---|---|
| Statusklassen (1xx bis 5xx) | 5 |
| Instanzen | 30 |
| Zeitreihen für diese eine Metrik | 60 × 5 × 30 × 14 = 126,000 |
| Ein Region-Label hinzufügen (5 Regionen) | 126.000 × 5 = 630.000 Zeitreihen |
| restaurant_id hinzufügen (40.000 Restaurants) | 126.000 × 40.000 = etwa 5 Milliarden mögliche Zeitreihen: nicht machbar |
Fragen pro Restaurant oder pro Kunde gehören in Traces, Logs oder Wide Events, wo hohe Kardinalität erwartet wird, nicht in Metrik-Labels.
Exemplars, die einem Histogramm-Bucket eine Beispiel-Trace-ID anhängen, verknüpfen eine Latenzspitze in einer günstigen Metrik mit einem teuren, detaillierten Trace.
Weitere Kostenhebel sind das Sampling von Traces (Tail-based Sampling behält die nützlichen), kürzere Aufbewahrung für Detaildaten und längere für Aggregate, standardmäßig keine Debug-Logs in der Produktion sowie die Weiterbelastung der Telemetrie an die Teams, die sie erzeugen, damit ihre Kosten sichtbar werden. Behandeln Sie das Telemetrievolumen wie jede andere Ressource als Designparameter mit einem Budget.
Alerting auf Symptome, nicht auf Ursachen
Die Empfehlung des SRE-Buchs lautet, dass Alarmierungen Symptome betreffen sollten, die Nutzer spüren, nicht die vielen möglichen Ursachen. Hohe CPU-Last, eine volle Festplatte auf einem Replikat oder ein neu gestarteter Container sind Ursachen: oft harmlos, manchmal schon von der Automatisierung behandelt und nie eine vollständige Liste dessen, was schiefgehen kann. Ein brennendes SLO, fehlschlagende Bezahlvorgänge oder eine stockende Pipeline für Kurierpositionen sind Symptome: Sie zählen, was auch immer ihre Ursache ist. Symptombasierte Alerts sind weniger zahlreich, selten falsch und decken Ausfälle ab, die niemand vorhergesehen hat; ursachenbasierte Signale gehören auf Dashboards, die helfen, ein Symptom zu diagnostizieren, sobald es alarmiert wurde.
Jede Alarmierung sollte dringend, umsetzbar und echt sein. Alert-Müdigkeit ist an sich schon ein Zuverlässigkeitsrisiko: Engineers in Rufbereitschaft, die von bedeutungslosen Alerts geweckt werden, lernen, sie abzutun, und verpassen den einen, der zählt. Eine praktische Regel ist, bei SLO-Burn-Rates zu alarmieren (Abschnitt 9.5), langsamere Burns und Ressourcenwarnungen an eine Ticket-Queue zu senden und jede Alarmierung mit einem Runbook und einem Dashboard zu verknüpfen.
Entscheidungshilfe
Entscheidungshilfe: Sollte dieser Alert einen Menschen alarmieren?
Stellen Sie diese Fragen zu jeder Alert-Regel, bevor sie jemanden wecken darf, und erneut, wann immer sie auslöst, ohne dass jemand handeln muss.
- Bedeutet die Bedingung, dass Nutzer jetzt oder bald zu Schaden kommen (ein schnell brennendes SLO, ein fehlschlagender Nutzerpfad)?JaWeiter zur nächsten Frage.NeinNicht alarmieren. Stellen Sie es zur Diagnose auf ein Dashboard oder eröffnen Sie ein Ticket, wenn sich jemand während der Arbeitszeit darum kümmern sollte.
- Muss ein Mensch handeln, statt einer automatischen Reaktion wie einem Neustart oder einer Skalierung nach außen?JaWeiter zur nächsten Frage.NeinAutomatisieren Sie die Reaktion und alarmieren Sie nur, wenn die Automatisierung fehlschlägt.
- Muss die Maßnahme vor dem nächsten Arbeitstag erfolgen?JaAlarmieren Sie und verknüpfen Sie den Alert mit einem Runbook und dem passenden Dashboard.NeinSenden Sie ihn statt an den Pager an die Ticket-Queue des Teams.
- Hat dieser Alert im letzten Monat alarmiert, ohne dass jemand etwas tun musste?JaKorrigieren Sie die Schwelle oder das Signal oder löschen Sie den Alert: Eine Alarmierung, auf die niemand reagiert, lehrt Menschen, Alarmierungen zu ignorieren.NeinBehalten Sie ihn und überprüfen Sie ihn bei der nächsten Übergabe der Rufbereitschaft.
Dashboards, die Fragen beantworten
Eine Wand aus fünfzig Graphen beantwortet keine Frage schnell. Gute Dashboards werden wie jede Benutzeroberfläche gestaltet: für ein benanntes Publikum und eine konkrete Frage. Eine Service-Übersicht beantwortet Ist dieser Service gesund?
mit seinen SLOs, dem verbleibenden Error Budget und den RED-Metriken oben und den USE-Metriken seiner wichtigsten Ressourcen darunter. Ein Dashboard für den Nutzerpfad beim Vorverkaufsstart beantwortet Bekommen die Fans Tickets?
mit Zulassungen, Sitzplatzreservierungen, Zahlungen und Fehlschlägen pro Minute von Ende zu Ende. Diagnose-Dashboards erreicht man durch Drill-down; sie werden nicht zuerst gezeigt.
Halten Sie Dashboards als Code in der Versionsverwaltung, geben Sie jedem einen Verantwortlichen, zeigen Sie Deployments und Änderungen an Feature-Flags als Annotationen in den Graphen (die meisten Incidents folgen auf eine Änderung) und löschen Sie Dashboards, die seit Monaten niemand geöffnet hat. Während eines Incident ist die erste nützliche Ansicht meist der nutzerseitige Pfad, die zweite der Trace einer fehlschlagenden Anfrage und erst dann die Ressourcenmetriken.
Prüfen Sie Ihr Verständnis
Warum muss das p99 für eine ganze Flotte aus zusammengeführten Histogrammen berechnet werden statt aus dem p99 jeder Instanz?
Weil ein Perzentil kombinierter Daten keine Funktion der Perzentile der Teile ist; Bucket-Zählungen addieren sich exakt, sodass das zusammengeführte Histogramm eine echte (durch die Buckets begrenzte) Schätzung liefert, während gemittelte p99-Werte stark falsch sein können.
Was geht kaputt, wenn ein Service in einer Aufrufkette den traceparent-Header nicht weitergibt?
Jeder Trace, der durch ihn läuft, wird geteilt: Spans nach diesem Hop beginnen einen neuen Trace, sodass das Gesamtbild von Ende zu Ende und die Verbindung zwischen Ursache und Symptom verloren gehen.
Warum ist order_id ein schlechtes Metrik-Label, aber ein gutes Span-Attribut?
Als Label erzeugt es eine neue Zeitreihe pro Bestellung und lässt Kardinalität und Kosten explodieren; als Span- oder Log-Attribut wird es einmal pro Ereignis gespeichert, wo hohe Kardinalität erwartet wird und für Abfragen nützlich ist.
Was davon sollte jemanden alarmieren: CPU bei 95 % auf einer Instanz oder ein Checkout-SLO, das mit Rate 20 brennt?
Das brennende SLO, weil es ein Symptom ist, das Nutzer spüren; der CPU-Wert ist eine mögliche Ursache, die auf ein Diagnose-Dashboard gehört.
Quellen und weiterführende Literatur
Haben Sie eine Frage zu diesem Abschnitt? ArchitectBot, der KI-Lernassistent des Kurses, antwortet zuerst aus dem Kurs.
Fragen: „Wir haben Logs von zwanzig Services, können aber nicht erkennen, warum manche Bestellungen langsam sind. Was sollten wir zuerst hinzufügen: Tracing, bessere Logs oder mehr Metriken?“