Einleitung: Warum braucht man Monitoring für C#-Anwendungen
Moderne C#-Anwendungen auf der .NET-Plattform sind komplexe verteilte Systeme, die unter hoher Last arbeiten. Ohne qualitativ hochwertiges Monitoring riskieren Sie, Leistungseinbußen, Speicherlecks oder kritische Ausfälle zu übersehen. Monitoring ermöglicht es nicht nur, Probleme zu erfassen, sondern auch vorherzusagen und rechtzeitig auf Anomalien zu reagieren.
In diesem Artikel werden wir durchgehen, wie man die Sammlung von Metriken, Logging und ein Alertsystem für C# (.NET)-Anwendungen mit modernen Tools einrichtet: Prometheus, Grafana, Serilog und integrierte Health Checks. Sie erhalten fertige Codebeispiele und praktische Empfehlungen.
Wichtige Metriken für C# (.NET)-Anwendungen
Monitoring beginnt mit der Definition der wichtigsten Kennzahlen. Für .NET-Anwendungen lassen sie sich in drei Kategorien einteilen:
- Infrastrukturmetriken — CPU-Auslastung, Speicher, Festplatte, Netzwerk.
- Anwendungsmetriken — API-Antwortzeit, Anzahl der Anfragen, Fehler (4xx/5xx), Warteschlangengröße.
- .NET-spezifische Metriken — Größe des GC-Heaps, Anzahl der Threads, Garbage-Collection-Zeit, Anzahl der Datenbankverbindungen.
Sammeln von Metriken mit Prometheus und .NET
Für den Export von Metriken nach Prometheus verwenden Sie die Bibliothek prometheus-net. Installieren Sie sie über NuGet:
dotnet add package prometheus-net.AspNetCoreFügen Sie Middleware in Program.cs hinzu:
var builder = WebApplication.CreateBuilder(args);var app = builder.Build();
// Prometheus-Metriken aktivierenapp.UseHttpMetrics(); // HTTP-Metrikenapp.UseMetricServer(); // /metrics-Endpunkt
app.MapGet("/", () => "Hello World!");app.Run();Jetzt sind unter der Adresse /metrics Standardmetriken verfügbar: Anzahl der Anfragen, Dauer, Fehler. Fügen wir eine benutzerdefinierte Metrik hinzu — einen Zähler für Aufrufe des Endpunkts:
using Prometheus;
var requestCounter = Metrics.CreateCounter( "myapp_requests_total", "Total requests to the endpoint");
app.MapGet("/api/data", () => { requestCounter.Inc(); return new { Message = "Data loaded" };});Health Checks: Grundlegende Zustandsprüfung
Der integrierte Health Checks-Mechanismus in .NET ermöglicht eine schnelle Bewertung der Anwendungsgesundheit. Fügen Sie eine Prüfung der Datenbankverbindung hinzu:
using Microsoft.Extensions.Diagnostics.HealthChecks;
builder.Services.AddHealthChecks() .AddDbContextCheck<AppDbContext>() .AddUrlGroup(new Uri("https://external-api.com"), "External API");
app.MapHealthChecks("/health");Health Checks geben den Status Healthy, Degraded oder Unhealthy zurück — das ist eine ideale Quelle für Alarme.
Logging mit Serilog: Strukturierte Logs
Logs sind eine äußerst wichtige Datenquelle für die Diagnose. Serilog ermöglicht das Senden von Logs an Elasticsearch, Seq oder einfach in eine Datei mit strukturiertem Format.
Installation:
dotnet add package Serilog.AspNetCoredotnet add package Serilog.Sinks.SeqKonfiguration in Program.cs:
Log.Logger = new LoggerConfiguration() .MinimumLevel.Information() .WriteTo.Console() .WriteTo.Seq("http://localhost:5341") .Enrich.WithProperty("Application", "MyApp") .CreateLogger();
builder.Host.UseSerilog();Jetzt enthalten alle Logs Kontextinformationen: RequestId, UserId, Ausführungszeit. Beispiel für das Logging eines Fehlers:
try { // gefährlicher Code} catch (Exception ex) { Log.Error(ex, "Fehler bei der Verarbeitung der Bestellung {OrderId}", orderId);}Strukturierte Logs lassen sich leicht in Grafana oder Kibana analysieren, um