Überwachung von C#-Anwendungen: Metriken und Alarme in .NET

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

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.AspNetCore

Fü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.Seq

Konfiguration 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

Blogs

Buchempfehlungen