Surveillance des applications C# (.NET) : Guide complet sur OpenTelemetry et Prometheus
Les applications .NET modernes nécessitent une surveillance constante des performances, des erreurs et de l'état. Sans surveillance, vous risquez de perdre le contrôle de la production. Dans cet article, nous allons voir comment configurer une surveillance efficace des applications C# (.NET) en utilisant la combinaison OpenTelemetry (collecte de télémétrie) et Prometheus + Grafana (visualisation et alerting).
Pourquoi OpenTelemetry ?
OpenTelemetry (OTel) est le standard industriel pour la collecte de métriques, de traces et de journaux. Pour .NET, il fournit des SDK officiels et une instrumentation automatique des bibliothèques populaires (ASP.NET Core, gRPC, Entity Framework).
Installation et configuration d'OpenTelemetry dans un projet C#
Ajoutez les packages NuGet à votre projet :
dotnet add package OpenTelemetrydotnet add package OpenTelemetry.Extensions.Hostingdotnet add package OpenTelemetry.Instrumentation.AspNetCoredotnet add package OpenTelemetry.Exporter.Prometheus.AspNetCoreConfiguration de base dans Program.cs
Configurez la collecte de métriques et l'export vers 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();
// Point de terminaison pour Prometheus (par défaut /metrics)app.MapPrometheusScrapingEndpoint();
app.Run();Création de métriques personnalisées
Vous pouvez ajouter vos propres compteurs, histogrammes et jauges :
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: "Nombre de commandes créées"); _orderProcessingTime = meter.CreateHistogram<double>("orders.processing_time", unit: "ms"); }
public void RecordOrderCreated() => _ordersCreated.Add(1); public void RecordProcessingTime(double ms) => _orderProcessingTime.Record(ms);}Traçage des requêtes (Distributed Tracing)
Pour suivre les chaînes d'appels, ajoutez le traçage :
using OpenTelemetry.Trace;
builder.Services.AddOpenTelemetry() .WithTracing(tracing => tracing .AddAspNetCoreInstrumentation() .AddHttpClientInstrumentation() .AddEntityFrameworkCoreInstrumentation() .AddConsoleExporter()); // Pour le débogage, en production — Jaeger ou ZipkinJournalisation via OpenTelemetry
Connectez le journaliseur à OTel :
using OpenTelemetry.Logs;
builder.Logging.AddOpenTelemetry(logging => logging .AddConsoleExporter() .AddOtlpExporter(options => options.Endpoint = new Uri("http://localhost:4317")));Configuration de Prometheus pour la collecte de métriques
Dans le fichier prometheus.yml, indiquez votre point de terminaison :
scrape_configs: - job_name: 'dotnet-app' scrape_interval: 5s static_configs: - targets: ['localhost:5000'] # Port de votre applicationVisualisation dans Grafana
Après avoir connecté Prometheus à Grafana, créez un tableau de bord avec les métriques clés :
- http_server_duration_ms — temps de réponse du serveur
Aussi dans la bibliothèque
Recommendations