
Observability & OpenTelemetry im .NET-Umfeld
Observability ermöglicht es, den Zustand komplexer Systeme anhand ihrer Ausgaben zu verstehen. Dies ist für den Betrieb und die Fehleranalyse insbesondere in verteilten Systemen unverzichtbar.
Da wir den Anspruch auf qualitativ hochwertigen Code haben, welcher wartbar und erweiterbar sein soll, ist Observability bei uns ein fixer Bestandteil. Wir setzen dabei auf OpenTelemetry als Standard.
In diesem Blogbeitrag geben wir einen kompakten Überblick über Observability im .NET Umfeld und gehen auf unsere Erfahrungen ein.
Die 3 Säulen der Observability
Durch die Kombination aller drei Observability Säulen: Metriken, Traces und Logs erhalten Entwicklungs- und Betriebsteams eine umfassende und detaillierte Einsicht in das Verhalten komplexer Systeme.
Gemeinsam ermöglichen sie eine schnellere Problemerkennung und -lösung, stellen ergänzende Werkzeuge zur Verfügung, verbessern die Systemleistung und schaffen die Grundlage für Full Stack Observability. Um vom Frontend, über das Backend bis zur Infrastruktur, alles im Blick zu haben.
Metriken: das «Was» im System
Metriken liefern quantitative Messwerte, die das Verhalten eines Systems über die Zeit abbilden.
Sie werden häufig aggregiert, um eine übersichtliche Darstellung in Dashboards und Visualisierungen wie Zeitreihendiagrammen zu ermöglichen. Metriken sind essenziell für die Einrichtung von Alarmierungen und bieten wertvolle Einblicke in Systemleistung, Ressourcennutzung und den allgemeinen Gesundheitszustand.
Ihr Hauptzweck besteht darin festzustellen «was» im System vorliegt (Normalbetrieb, Einschränkung, Fehler).
Typische Beispiele für Metriken sind:
- Host-Metriken: Speicherverbrauch, Festplattenauslastung, CPU-Nutzung
- Netzwerkmetriken: Betriebszeit, Latenz, Durchsatz
- Anwendungsmetriken: Antwortzeiten, Anfrage- und Fehlerraten
- Serverpool-Metriken: Anzahl der Gesamt- und aktiven Instanzen
- Metriken externer Abhängigkeiten: Verfügbarkeit, Servicestatus
Praxis-Tipp:
Für .NET empfehlen wir die Integration von OpenTelemetry Metrics oder Prometheus.NET, kombiniert mit Grafana für Visualisierungen.
Logs: das «Warum» hinter Ereignissen
Logs sind unveränderliche, detaillierte Aufzeichnungen einzelner Ereignisse und liefern den Kontext für die Ursachenanalyse. Protokolle enthalten typischerweise:
- Zeitstempel
- Transaktions-IDs
- IP- und Benutzer-IDs
- Ereignisdetails und Ablaufinformationen
- Fehlermeldungen
- Verbindungsversuche
- Konfigurationsänderungen
Sie erfassen wichtige Ereignisse, Fehler und Warnungen und ermöglichen es, das Systemverhalten über die Zeit nachzuvollziehen.
Ein weiterer wichtiger Aspekt der Logs sind die Log-Levels. Damit lassen sich Ereignisse in bestimmten Gruppen zusammenfassen. Gemäss unserer Erfahrung haben sich folgende Log-Levels bewährt:
- Debug: Entwickler-Infos
- Info: Normalbetrieb
- Warning: Auffälligkeiten
- Error: Fehler
Durch die Korrelation mit Traces (z. B. über Trace ID und Span ID) lassen sich Abläufe noch präziser analysieren.
Praxis-Tipp:
Nutze strukturierte Logs (z. B. JSON) und bewährte Frameworks wie Serilog oder NLog. So lassen sich Logs nicht nur flexibel auswerten, sondern auch gezielt nach Feldern filtern, ideal für zentrale Log-Management-Systeme und gezielte Analysen.
Traces: das «Wo und Wie» im System
Traces zeichnen den Ablauf einer Anfrage über mehrere Komponenten eines verteilten Systems auf. Sie helfen dabei Engpässe, Latenzen und Fehlerquellen zu identifizieren, indem nachvollziehbar wird, was vor und nach dem Ereignis passierte.
Traces ermöglichen:
- Die Analyse der Dauer von Netzwerkoperationen
- Die Nachverfolgung des Datenflusses durch die Systemarchitektur
- Die Rekonstruktion der Reihenfolge, in der Dienste durchlaufen werden
- Die Identifikation von Fehlerursachen, Engpässen und Latenzproblemen

Sie kombinieren Aspekte von Metriken und Logs, indem sie Kontextinformationen über den Lebenszyklus einer Anfrage liefern. Dabei wird der gesamte Weg einer Anfrage sichtbar gemacht – inklusive aller beteiligten Komponenten und deren jeweiliger Bearbeitungszeit.
Traces sind besonders hilfreich für DevOps und Entwicklungsteams, da sie komplexe Abläufe transparent machen und die Ursachenanalyse bei Systemstörungen erleichtern.
Praxis-Tipp:
Für verteilte Systeme ist OpenTelemetry Tracing mit Exportern wie Jaeger oder Zipkin Standard. Auto-Instrumentierung deckt teilweise Standardfälle ab, aber sobald du individuelle Anforderungen hast, etwa Bezug zur Business-Logik, spezielle Messaging-Systeme oder zusätzliche Kontextinformationen, reicht sie nicht mehr aus.
Plane dann ausreichend Zeit für manuelle Instrumentierung und saubere Kontextpropagation ein.
Das ist kein „Plug & Play“, sondern erfordert gezielte Implementierung und Coding.
Umsetzungsaufwand und Nutzen Vergleich
| Säule | Implementierungsaufwand | Nutzen |
|---|---|---|
| Logs | Gering | Ursachenanalyse, Fehlerkontext |
| Metriken | Mittel | Performance Monitoring, Alarmierungen |
| Traces | Hoch | End to End Transparenz, Engpassanalyse |
- Logs und Metriken sind die «Low-hanging Fruits» der Observability, da sie mit geringen Aufwand implementiert sind und bereits die wichtigsten Punkte wie die Identifikation von Anomalien, Fehlern und die Überwachung von Performance Indikatoren erlauben.
- Traces sind für verteilte Systeme und das Debugging extrem hilfreich, jedoch auch deutlich aufwändiger in der Implementation
OpenTelemetry
Im ersten Teil wurden die Grundlagen zu den drei Säulen der Observability vorgestellt. Nachfolgend wird nun die Umsetzung mit OpenTelemetry als de-facto-Standard für Observability erläutert.
OpenTelemetry ist ein leistungsfähiges Open-Source-Framework, das eine einheitliche und standardisierte Methode zur Erfassung, Verarbeitung und Weiterleitung von Telemetriedaten wie Metriken, Logs und Traces bietet. Nachfolgend die wichtigsten Vorteile:
- Vendor-Neutralität
Es ist unabhängig von kommerziellen Anbietern und unterstützt eine Vielzahl von Programmiersprachen, was Entwickler maximale Flexibilität bei der Integration in bestehende Systemlandschaften bietet. Das bedeutet: Egal ob du Jaeger, Prometheus oder Grafana nutzt, OpenTelemetry integriert sich nahtlos
- Standardisierung über Sprachen hinweg
OpenTelemetry stellt stabile APIs und SDKs für viele gängige Programmiersprachen bereit und sorgt so für konsistente Implementierungen über unterschiedliche Technologie-Stacks hinweg. Für .NET sind alle drei Bereiche stabil und ist damit bestens für die produktive Implementation geeignet.
| Language | Traces | Metrics | Logs |
|---|---|---|---|
| C++ | Stable | Stable | Stable |
| C#/.Net | Stable | Stable | Stable |
| Erlang/Elixir | Stable | Development | Development |
| Go | Stable | Stable | Beta |
| Java | Stable | Stable | Stable |
| JavaScript | Stable | Stable | Development |
| PHP | Stable | Stable | Stable |
| Python | Stable | Stable | Development |
| Ruby | Stable | Development | Development |
| Rust | Beta | Beta | Beta |
| Swift | Stable | Development | Development |
- Flexibilität und Erweiterbarkeit
OpenTelemetry unterstützt verschiedene Datenformate und Backend-Systeme wie Prometheus, Jaeger, Zipkin, Grafana oder Elastic, wodurch sich Telemetriedaten problemlos in bestehende Monitoring- und Analyseplattformen integrieren lassen Dank der modularen Architektur lässt sich OpenTelemetry einfach erweitern, etwa durch eigene Instrumentierungen oder Exporter. Ein Wechsel des Backends ist ebenfalls unkompliziert, da die Instrumentierung unverändert bleibt und nur die Exporter- oder Collector-Konfiguration angepasst werden muss.
OTELCollector

Der OpenTelemetry Collector ist eine zentrale Komponente. Durch den OTEL Collector werden die Telemetriedaten wie Metriken, Logs und Traces gesammelt, verarbeitet und weitergeleitet. Er läuft als eigenständiger Dienst und ermöglicht die Trennung von Instrumentierung und Backend, wodurch Flexibilität und Skalierbarkeit erhöht werden.
Der Kollektor lässt sich je nach Bedarf konfigurieren, die Konfiguration auf der linken Seite erstellt eine Trace Pipeline, die Traces via otlp empfängt, via batch verarbeitet und mit TLS an einen Jaeger Server exportiert

- Pipeline
Eine Pipeline im Collector beschreibt den Weg, den Telemetriedaten durchlaufen – vom Empfang über die Verarbeitung bis zum Export. Sie besteht aus mehreren modularen Komponenten (Receiver, Processor, Exporter), die konfigurierbar sind und unterschiedliche Aufgaben übernehmen.
- Receivers
Receivers sind die Eingangspunkte der Pipeline. Sie nehmen Telemetriedaten aus verschiedenen Quellen entgegen z. B. von Anwendungen, Agenten oder anderen Kollektoren und leiten die Daten an die Pipeline weiter. Beispiele sind OTLP, Prometheus oder Jaeger Receiver.
- Processor
Processor-Komponenten verarbeiten die empfangenen Daten innerhalb der Pipeline. Sie können Daten anreichern, filtern, gruppieren oder transformieren. Typische Aufgaben sind z. B. das Entfernen sensibler Informationen oder das Hinzufügen von Attributen.
- Exporter
Exporter sind die Ausgangspunkte der Pipeline. Sie senden die verarbeiteten Telemetriedaten an ein Zielsystem wie ein Observability-Backend (z. B. Grafana, Jaeger, Datadog oder Prometheus), wo die Daten gespeichert und analysiert werden können.
Fazit
- Observability ist unverzichtbar für den Betrieb verteilter Systeme, den ohne ist man «blind».
- Starte klein und wachse mit der Komplexität: Beginne mit Logs und Metriken und ergänze Traces wenn nötig. Hierbei ist auch die Relevanz der Daten zu beachten. Mehr Daten bedeutet nicht automatisch mehr Insights. Die Daten müssen bewusst ausgewählt und die nachfolgenden Analysen dazu ausgelegt sein.
- Strukturierte Logs (z. B. im JSON-Format) sind eine wichtige Grundlage für effiziente Auswertung und erleichtern automatisierte Verarbeitung, etwa für Filterung, Alerting oder Analyse in zentralen Log-Systemen.
- OpenTelemetry erleichtert die Umsetzung durch Standardisierung erheblich und dies ohne die Flexibilität einzuschränken (Vendor-Neutralität).
- In Kombination mit dem OTLP Collector lässt sich die Instrumentierung vom Backend trennen und es resultiert eine skalierbare und zukunftssichere Observability Architektur.
Patrick Heiniger
Dipl. Techniker HF in Informatik / NDS Software Engineering SWS
Software Engineer
Über den Autor
Patrick Heiniger arbeitet seit über 19 Jahren als Software Engineer bei der CSA.
Er unterstützt Kunden im Application Bereich bei Architektur und Entwicklung im Web und Cloud Projekten oder generell im .Net Umfeld. Sein Interesse an neuen Technologien und seine Motivation sich stetig weiterzubilden haben ihm ein Breites Einsatzgebiet eröffnet.