Logging, Tracing und Metriken in verteilten Anwendungen
Wer eine Anwendung in der Cloud betreibt, benötigt Daten über deren Leistung und Zustand. Eine Mikroservice Architektur oder ein verteilter Monolith stellen eine besondere Herausforderung für das Sammeln sogenannter Telemetriedaten dar. Eine zentrale Speicherung und Auswertung von Logs, Traces und Metriken ist Pflicht. Niemand möchte bei einem Problem die Logs von mehreren Diensten durchsuchen, um den Durchlauf einer Anfrage durch das System nachzuvollziehen. Auch möchte man wissen, ob das System bereits am Ressourcen-Limit arbeitet oder ob noch Luft für unerwartete Belastungen ist.
Ist man in der Position, dass man Einfluss auf die Entwicklung der Anwendung hat, können diese Themen aktiv gefördert werden. Bei einer Mikro-Service Architektur werden sie als querschnittliches Konzepte für alle Dienste verbindlich festgelegt. Eine monolithische, verteilte Anwendung sollte ein einheitliches Logging von Hause aus mitbringen. Baut man die Anwendung aus bestehenden Komponenten zusammen, besteht die Herausforderung darin, die meist in unterschiedlichen Programmiersprachen und mit unterschiedlichen Software-Stacks entwickelten Komponenten hinsichtlich der Telemetriedaten einheitlich zusammen zu führen.
Logs
Unter Logs versteht man in der Regel eine mit einem Zeitstempel versehene Textzeile. Diese können unstrukturiert sein oder eine solche Struktur aufweisen, dass leicht bestimmte Daten extrahiert werden können. Dies könnte der Schweregrad (Severity) des Eintrags sein, z.B. DEBUG, WARNING oder ERROR, oder andere auswertbare Daten enthalten, wie z.B. die Trace ID, mit der der zugehörige Trace ermittelt werden kann. Ein strukturiertes Logging sollte bevorzugt werden.
Eine zentrale Sammlung aller im System entstehenden Logs bietet viele Vorteile. Die einfache Auswertung bezogen auf einen Vorgang in unterschiedlichen Diensten oder Nachforschung zu einem Problem zu einem bestimmten Zeitpunkt sind nur einige Beispiele. In der Regel bieten die eingesetzten Tools die Möglichkeit, nach beliebigen Merkmalen zu filtern oder auch Benachrichtigungen bei bestimmten Ereignissen zu senden.
Beispielhaft seien hier Loki aus dem Prometheus/Grafana Umfeld oder Logstash aus dem Elasticstack zu nennen.
Meist ist die Integration leicht zu lösen, da so gut wie jede Anwendung Logdaten erzeugt, die ausgewertet werden können.
Metriken
Metriken sind Messwerte eines Dienstes zu seiner Laufzeit. Dabei können mehrere Arten von Messwerten unterschieden werden.
Zähler geben über eine bestimmte Anzahl von Ereignissen Auskunft, z.B. die Anzahl der Verarbeiteten Anfrage oder die Anzahl der laufenden Prozesse.
Histogramme sammeln eine Häufigkeitsverteilung einer Messung, z.B. wie viele Anfragen wurden in welcher Zeit beantwortet.
Metriken lassen sich aggregieren. Es können Summen, Mittelwerte oder Minima/Maxima in einem bestimmten Zeitraum gebildet werden. Diese bilden die Basis für die Bewertung der Anwendung hinsichtlich Performance oder Verfügbarkeit. In Dashboards werden die Messwerte übersichtlich aufbereitet und Benachrichtigungssysteme senden Warnmeldungen, wenn bestimmte Werte nicht innerhalb des Solls liegen.
Bekannte Systeme sind hier Prometheus und Telegraf.
Tracing
Ein Trace sammelt Informationen zu eine Anfrage während des Durchlaufs durch die verteilte Anwendung. Dabei ergänzen die einzelnen Dienste den Trace um zusätzliche Informationen und melden einem zentralen Tracing Server die Informationen. Dieser setzt die Daten zu einem gesamten Bild zusammen.
Bei Performance-Problemen oder Fehlern kann hier detailliert untersucht werden, welcher Dienst einen Fehler verursacht oder wo die längste Verarbeitungszeit auftritt.
Hier sei Jaeger Tracing als weit verbreitetes Tool genannt.
Umsetzung
Die Aggregation von Logdaten ist der erste und einfachste Schritt, da alle Anwendungen mehr oder weniger detaillierte Log-Dateien schreiben. Viele Standard Anwendungen, die in der Cloud zum Einsatz kommen, stellen Metriken direkt bereit (z.B. MinIO) oder lassen sich über zusätzliche Software abfragen (z.B. postgres-exporter für PostgreSQL Datenbanken). Eigene Anwendungen lassen sich über entsprechende Bibliotheken, zum Teil automatisch, mit Metriken ausstatten. Sinnvoll ist es auch, die Anwendung entsprechend anzupassen, um wichtige fachliche Einblicke zu bekommen (z.B. Anzahl der Artikel einer Bestellung).
Aufwändiger wird das Tracing, da hier die Traces auch mit sinnvollen Daten für die Auswertung angereichert werden müssen. Manche Dienste bieten das bereits, die eigenen müssen hierfür vorbereitet werden.
Ausblick
Die drei Disziplinen Logging, Metriken und Tracing lassen sich mit aktuellen Open-Source-Tools gut umsetzen und bieten wertvolle Einsichten in die Cloud-Anwendung.
Das Projekt OpenTelemetry möchte die Schnittstellen vereinfachen und bietet sich als einheitlicher Standard an. Es ist flexibel aufgebaut, um auch bestehende Anwendungen einzubinden.