Einleitung: Warum Überwachung für C#-Anwendungen entscheidend ist
\n\nIn der modernen Softwareentwicklung ist das Schreiben von Code nur die halbe Miete. Damit eine Anwendung stabil, schnell und vorhersagbar läuft, ist eine kontinuierliche Überwachung erforderlich. Für C# (.NET)-Anwendungen, die häufig in hochbelasteten Unternehmenssystemen, im Bankensektor, im E-Commerce und in Cloud-Diensten eingesetzt werden, ist die Überwachung nicht nur eine Option, sondern eine zwingende Anforderung.
\n\nOhne Überwachung arbeiten Sie im Blindflug: Speicherlecks bleiben unbemerkt, bis der Server abstürzt, langsame Anfragen häufen sich und Benutzer wechseln zur Konkurrenz. In diesem Artikel behandeln wir den gesamten Zyklus der Einrichtung von Observability für C#-Anwendungen: von der Erfassung grundlegender Metriken bis zur Konfiguration intelligenter Alarme in Echtzeit.
\n\n1. Grundlagen der Überwachung: Welche Metriken in .NET erfassen
\n\nBevor Sie Tools konfigurieren, ist es wichtig zu verstehen, welche Metriken für C#-Anwendungen wirklich wichtig sind. Wir unterteilen sie in drei Gruppen:
\n\n1.1. Systemmetriken (Infrastrukturebene)
\n- \n
- CPU und Arbeitsspeicher — Prozessorauslastung und RAM-Verbrauch des dotnet-Prozesses. \n
- GC (Garbage Collection) — Häufigkeit und Dauer der Speicherbereinigung, Heap-Größen (Gen0, Gen1, Gen2, LOH). \n
- Thread-Pool — Anzahl aktiver, freier und wartender Threads. \n
- Datenträger-I/O und Netzwerk — Lese-/Schreibzugriffe auf die Festplatte, Netzwerkverbindungen. \n
1.2. Geschäftsmetriken (Anwendungsebene)
\n- \n
- Request Rate — Anzahl der Anfragen pro Sekunde (RPS). \n
- Latenz — Antwortzeit (p50, p95, p99 Perzentile). \n
- Fehlerrate — Prozentsatz der 4xx- und 5xx-Fehler. \n
- Aktive Benutzer — Anzahl gleichzeitig arbeitender Benutzer. \n
1.3. .NET-Runtime-Metriken
\n- \n
- JIT-Kompilierung — Kompilierungszeit von Methoden. \n
- Assembly-Laden — Anzahl geladener Assemblys. \n
- Ausnahmen — Anzahl ausgelöster Ausnahmen pro Sekunde. \n
Zur Erfassung dieser Metriken wird in .NET ein leistungsstarkes Tool verwendet — System.Diagnostics.Metrics (integrierte API ab .NET 6+) und die Bibliothek OpenTelemetry.
\n\n2. Einrichtung der Metriksammlung mit OpenTelemetry und Prometheus
\n\nDer beste Weg, die Überwachung einer C#-Anwendung zu organisieren, ist die Kombination von OpenTelemetry (Metriksammlung) + Prometheus (Speicherung) + Grafana (Visualisierung). Betrachten wir die schrittweise Einrichtung.
\n\n2.1. Installation der NuGet-Pakete
\nFügen Sie dem Projekt die folgenden Pakete hinzu:
\ndotnet add package OpenTelemetry.Extensions.Hosting\ndotnet add package OpenTelemetry.Exporter.Prometheus.AspNetCore\ndotnet add package OpenTelemetry.Instrumentation.AspNetCore\ndotnet add package OpenTelemetry.Instrumentation.Runtime\n\n2.2. Konfiguration in Program.cs
\nKonfigurieren Sie OpenTelemetry für die automatische Erfassung von Metriken aus ASP.NET Core und der .NET-Runtime:
\nusing OpenTelemetry.Metrics;\n\nvar builder = WebApplication.CreateBuilder(args);\n\nbuilder.Services.AddOpenTelemetry()\n .WithMetrics(metrics => metrics\n .AddAspNetCoreInstrumentation() // Metriken für HTTP-Anfragen\n .AddRuntimeInstrumentation() // Metriken für GC, JIT, ThreadPool\n .AddPrometheusExporter()); // Export nach Prometheus\n\nvar app = builder.Build();\n\napp.UseOpenTelemetryPrometheusScrapingEndpoint(); // Endpunkt /metrics\n\napp.Run();\n\nJetzt ist unter http://localhost:5000/metrics ein Endpunkt mit Metriken im Prometheus-Format verfügbar.
2.3. Erstellung benutzerdefinierter Metriken
\nFügen wir eine Geschäftsmetrik hinzu — einen Zähler für verarbeitete Bestellungen:
\npublic class OrderMetrics\