Prometheus-Metriken in C# (.NET): Vollständige Anleitung zur Integration
\n\nPrometheus ist ein Open-Source-Überwachungssystem, das Metriken als Zeitreihen sammelt und speichert. Für C# (.NET)-Entwickler eröffnet die Integration mit Prometheus die Möglichkeit, die Anwendungsleistung, Geschäftskennzahlen und den Systemstatus in Echtzeit zu verfolgen. In diesem Artikel werden wir behandeln, wie man Prometheus mit einer .NET-Anwendung verbindet, welche Bibliotheken verwendet werden sollten und wie Metriken richtig konfiguriert werden.
\n\nWarum werden Prometheus-Metriken in .NET benötigt?
\nDie Überwachung mit Prometheus ermöglicht:
\n- \n
- Verfolgung der Anzahl von Anfragen, Fehlern und Antwortzeiten. \n
- Sammlung von Leistungsmetriken (CPU, Arbeitsspeicher, GC). \n
- Erstellung benutzerdefinierter Geschäftsmetriken (aktive Benutzer, Bestellungen). \n
- Integration mit Grafana zur Visualisierung von Dashboards. \n
- Einrichtung von Alarmen basierend auf Schwellenwerten. \n
Die Bibliothek prometheus-net
\nDie wichtigste Bibliothek für die Arbeit mit Prometheus in .NET ist prometheus-net. Sie unterstützt ASP.NET Core, .NET Core, .NET Framework und gRPC. Installation über NuGet:
\ndotnet add package prometheus-net\nFür ASP.NET Core installieren Sie zusätzlich:
\ndotnet add package prometheus-net.AspNetCore\n\nMetriktypen in Prometheus
\nDie Bibliothek unterstützt alle Standard-Metriktypen:
\n- \n
- Counter — ein Zähler, der nur erhöht wird (Anzahl der Anfragen). \n
- Gauge — ein Wert, der steigen und fallen kann (aktuelle Temperatur). \n
- Histogram — ein Histogramm zur Messung der Werteverteilung (Antwortzeit). \n
- Summary — Quantile zur Aggregation von Daten (p95, p99). \n
Beispiel: Einfacher Counter
\nErstellen wir eine Metrik, die die Anzahl der Anfragen an einen Endpunkt zählt:
\nusing Prometheus;\n\npublic class MetricsService\n{\n private static readonly Counter RequestCount = Metrics\n .CreateCounter("app_requests_total", "Total number of requests", new CounterConfiguration\n {\n LabelNames = new[] { "method", "endpoint" }\n });\n\n public void RecordRequest(string method, string endpoint)\n {\n RequestCount.WithLabels(method, endpoint).Inc();\n }\n}\nIm ASP.NET Core-Controller sieht der Aufruf wie folgt aus:
\n[ApiController]\n[Route("api/order")]\npublic class OrderController : ControllerBase\n{\n private readonly MetricsService _metrics;\n\n public OrderController(MetricsService metrics) => _metrics = metrics;\n\n [HttpGet]\n public IActionResult GetOrders()\n {\n _metrics.RecordRequest("GET", "/api/order");\n return Ok(new { orders = new[] { "order1", "order2" } });\n }\n}\n\nBeispiel: Gauge für aktive Benutzer
\nprivate static readonly Gauge ActiveUsers = Metrics\n .CreateGauge("app_active_users", "Number of active users");\n\npublic void UserLoggedIn() => ActiveUsers.Inc();\npublic void UserLoggedOut() => ActiveUsers.Dec();\n\nBeispiel: Histogram für Antwortzeit
\nprivate static readonly Histogram RequestDuration = Metrics\n .CreateHistogram("app_request_duration_seconds", "Request duration in seconds",\n new HistogramConfiguration\n {\n Buckets = Histogram.ExponentialBuckets(0.001, 2, 10) // von 1ms bis ~1s\n });\n\npublic void RecordRequestDuration(double seconds)\n{\n RequestDuration.Observe(seconds);\n}\n\nExport von Metriken in ASP.NET Core
\nDamit Prometheus Metriken sammeln kann, muss ein Endpunkt /metrics hinzugefügt werden. In Program.cs:
using Prometheus;\n\nvar builder = WebApplication.CreateBuilder(args);\nbuilder.Services.AddCont