Ü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
Konfiguration von Swift-Apps: Die Bibliothek SwiftyConfiguration
Room für Kotlin: Vollständiger Leitfaden mit Beispielen
CLI-Frameworks für Rust: Überblick über die besten Tools zur Erstellung von Kommandozeilen-Dienstprogrammen
Swagger/OpenAPI-Generierung für TypeScript: Die besten Tools
yaml-cpp für C++: Komplette Anleitung mit Beispielen
Empfehlungen