Überwachung von C# (.NET)-Anwendungen: Vollständiger Leitfaden zu OpenTelemetry und Prometheus
Moderne .NET-Anwendungen erfordern eine ständige Überwachung von Leistung, Fehlern und Zustand. Ohne Überwachung riskieren Sie, die Kontrolle über die Produktion zu verlieren. In diesem Artikel werden wir erläutern, wie Sie eine effektive Überwachung von C# (.NET)-Anwendungen mit der Kombination aus OpenTelemetry (Telemetrieerfassung) und Prometheus + Grafana (Visualisierung und Alerting) einrichten.
Warum gerade OpenTelemetry?
OpenTelemetry (OTel) ist der Industriestandard für die Erfassung von Metriken, Traces (Ablaufverfolgungen) und Logs. Für .NET bietet es offizielle SDKs und automatische Instrumentierung für gängige Bibliotheken (ASP.NET Core, gRPC, Entity Framework).
Installation und Konfiguration von OpenTelemetry in einem C#-Projekt
Fügen Sie Ihrem Projekt die NuGet-Pakete hinzu:
dotnet add package OpenTelemetrydotnet add package OpenTelemetry.Extensions.Hostingdotnet add package OpenTelemetry.Instrumentation.AspNetCoredotnet add package OpenTelemetry.Exporter.Prometheus.AspNetCoreBasiskonfiguration in Program.cs
Konfigurieren Sie die Metrikenerfassung und den Export nach Prometheus:
using OpenTelemetry.Metrics;using OpenTelemetry.Resources;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddOpenTelemetry() .ConfigureResource(resource => resource .AddService("MyApp", serviceVersion: "1.0.0")) .WithMetrics(metrics => metrics .AddAspNetCoreInstrumentation() .AddHttpClientInstrumentation() .AddMeter("Microsoft.AspNetCore.Hosting") .AddMeter("Microsoft.AspNetCore.Server.Kestrel") .AddPrometheusExporter());
var app = builder.Build();
// Endpunkt für Prometheus (standardmäßig /metrics)app.MapPrometheusScrapingEndpoint();
app.Run();Erstellung benutzerdefinierter Metriken
Sie können eigene Zähler, Histogramme und Messgeräte hinzufügen:
using System.Diagnostics.Metrics;
public class OrderMetrics{ private readonly Counter<int> _ordersCreated; private readonly Histogram<double> _orderProcessingTime;
public OrderMetrics(IMeterFactory meterFactory) { var meter = meterFactory.Create("MyApp.Orders"); _ordersCreated = meter.CreateCounter<int>("orders.created", description: "Anzahl der erstellten Bestellungen"); _orderProcessingTime = meter.CreateHistogram<double>("orders.processing_time", unit: "ms"); }
public void RecordOrderCreated() => _ordersCreated.Add(1); public void RecordProcessingTime(double ms) => _orderProcessingTime.Record(ms);}Ablaufverfolgung von Anfragen (Distributed Tracing)
Fügen Sie Tracing hinzu, um Aufrufketten zu verfolgen:
using OpenTelemetry.Trace;
builder.Services.AddOpenTelemetry() .WithTracing(tracing => tracing .AddAspNetCoreInstrumentation() .AddHttpClientInstrumentation() .AddEntityFrameworkCoreInstrumentation() .AddConsoleExporter()); // Für Debugging, in Produktion: Jaeger oder ZipkinLogging über OpenTelemetry
Binden Sie den Logger an OTel an:
using OpenTelemetry.Logs;
builder.Logging.AddOpenTelemetry(logging => logging .AddConsoleExporter() .AddOtlpExporter(options => options.Endpoint = new Uri("http://localhost:4317")));Konfiguration von Prometheus zur Metrikenerfassung
Geben Sie in der Datei prometheus.yml Ihren Endpunkt an:
scrape_configs: - job_name: 'dotnet-app' scrape_interval: 5s static_configs: - targets: ['localhost:5000'] # Port Ihrer AnwendungVisualisierung in Grafana
Erstellen Sie nach dem Verbinden von Prometheus mit Grafana ein Dashboard mit den wichtigsten Metriken:
- http_server_duration_ms — Server-Antwortzeit
Auch in der Bibliothek
Arbeiten mit ZIP-Archiven in TypeScript: Bibliothek JSZip und Hilfsprogramme
WebSocket-Bibliothek Java: Tyrus — Referenzimplementierung von JSR 356 für Echtzeitkommunikation
Maschinelles Lernen mit PHP: Überblick über Bibliotheken zur ML-Integration
Kotlin Symbol Processing (KSP) für Kotlin: Komplettguide mit Beispielen
GORM für Go: Vollständiger Leitfaden mit Beispielen
Empfehlungen