Einleitung: Warum die Überwachung von C#-Anwendungen eine Kunst ist
In der modernen C# (.NET)-Entwicklung ist die Überwachung keine bloße Option mehr. Sie ist ein obligatorisches Element einer Produktionsumgebung, das es ermöglicht, Ausfälle nicht nur zu erfassen, sondern auch vorherzusagen. Auf fortgeschrittener Ebene wird die Überwachung zu einem Frühwarnsystem: Sie schauen nicht nur auf Dashboards, sondern richten Alarme basierend auf komplexen Metriken ein.
In diesem Artikel werden wir erläutern, wie Sie über die standardmäßigen CPU- und Speicherzähler hinausgehen. Sie erfahren, wie Sie benutzerdefinierte Geschäftsmetriken erfassen, Alarme mit Prometheus und Alertmanager einrichten und OpenTelemetry für die Ablaufverfolgung nutzen. Alle Beispiele sind in C#.
1. Fortgeschrittene Instrumentierung: App Metrics und Prometheus
1.1. Anbindung von Prometheus an ASP.NET Core
Die grundlegende Überwachung in .NET beschränkt sich oft auf den integrierten PerformanceCounter. Für eine Microservices-Architektur ist jedoch Prometheus zum Standard geworden. Installieren Sie das Paket:
dotnet add package prometheus-net.AspNetCoreFügen Sie dann die Middleware in Program.cs hinzu:
using Prometheus;
var builder = WebApplication.CreateBuilder(args);var app = builder.Build();
// Metrik-Endpunkt aktivierenapp.UseHttpMetrics();app.UseRouting();app.MapMetrics(); // /metrics
app.Run();Dies liefert Ihnen grundlegende Metriken: Anzahl der Anfragen, Dauer, Fehler. Für ein fortgeschrittenes Niveau reicht dies jedoch nicht aus.
1.2. Benutzerdefinierte Geschäftsmetriken
Angenommen, Sie möchten die Anzahl der erstellten Bestellungen oder die Ausführungszeit einer kritischen Geschäftsoperation verfolgen. Verwenden Sie Counter und Histogram:
using Prometheus;
public class OrderMetrics{ private static readonly Counter OrdersCreated = Metrics .CreateCounter("orders_created_total", "Total number of created orders");
private static readonly Histogram OrderProcessingTime = Metrics .CreateHistogram("order_processing_seconds", "Histogram of order processing time");
public void RecordOrderCreation(double elapsedSeconds) { OrdersCreated.Inc(); OrderProcessingTime.Observe(elapsedSeconds); }}Jetzt können Sie in jedem Dienst OrderMetrics injizieren und Daten aufzeichnen. Dies ermöglicht Ihnen den Bau von Dashboards in Grafana mit einer Genauigkeit bis zur Sekunde.
2. Alarme: Von einfachen Triggern zu SLO-orientierten Regeln
2.1. Einrichtung von Alertmanager für C#-Metriken
Metriken zu sammeln ist die eine Hälfte. Die andere Hälfte sind Alarme. Erstellen Sie eine Regel für Prometheus (alerts.yml):
groups: - name: csharp_app_alerts rules: - alert: HighErrorRate expr: rate(http_requests_total{status=~"5.."}[5m]) > 0.05 for: 2m labels: severity: critical annotations: summary: "High error rate in C# app" description: "Error rate is {{ $value }} for the last 5 minutes"Dies ist ein einfaches Beispiel. Auf fortgeschrittenem Niveau sollten Sie SLO-Alarme hinzufügen. Wenn beispielsweise 99% der Anfragen nicht innerhalb von 200 ms abgeschlossen werden, ist das ein Grund zur Panik.
2.2. Alarme basierend auf Geschäftsmetriken
Verwenden Sie die benutzerdefinierten Zähler aus dem vorherigen Abschnitt. Wenn die Anzahl der Bestellungen drastisch sinkt, ist etwas kaputt:
- alert: OrdersStopped expr: rate(orders_created_total[10m]) == 0 for: 5m labels: severity: warning annotations: summary: "No orders created in last 10 minutes"Einen solchen Alarm können Sie nicht aus standardmäßigen Betriebssystemmetriken erhalten – er erfordert ein tiefes Verständnis der Geschäftslogik.
3. OpenTelemetry: Verteilte Ablaufverfolgung in C#
3.1. Integration des OpenTelemetry SDK
Wenn Sie 10 Microservices in C# haben, helfen einzelne Metriken nicht weiter. Sie benötigen eine Ablaufverfolgung. Install