Surveillance des applications C# : métriques et alertes avancées

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

Surveillance des applications C# : métriques et alertes avancées

\n\n

Dans le développement moderne en C# (.NET), une application simplement "fonctionnelle" n'est plus un critère de qualité suffisant. Les systèmes de production nécessitent une surveillance constante : il faut savoir combien de mémoire le service consomme, à quelle vitesse les requêtes sont traitées, si la file d'attente dans le courtier de messages ne s'allonge pas. Sans système de surveillance et d'alertes, vous risquez de découvrir un problème uniquement par les utilisateurs. Dans cet article, nous aborderons les techniques avancées de collecte de métriques, leur visualisation et la configuration d'alertes pour les applications C#, en utilisant des outils modernes comme Prometheus, Grafana et OpenTelemetry.

\n\n

Pourquoi une surveillance avancée ?

\n

La surveillance de base (CPU, RAM, disque) ne donne pas une image complète. Pour les applications C#, des métriques spécifiques sont critiques : le nombre de garbage collections (GC), le temps de blocage des threads, la taille du pool de connexions à la base de données. Les alertes sur ces métriques permettent de réagir avant qu'une panne ne se produise. L'approche avancée implique trois niveaux :

\n
    \n
  • Infrastructure level — métriques standard du serveur.
  • \n
  • Application level — métriques de la logique métier (latences, erreurs, fréquence d'appels).
  • \n
  • Business level — métriques liées au domaine (nombre de commandes, conversion).
  • \n
\n

Nous nous concentrerons sur le niveau application, qui offre le plus grand bénéfice pour les développeurs C#.

\n\n

Collecte de métriques avec OpenTelemetry et Prometheus

\n

OpenTelemetry (OTel) est le standard de facto pour instrumenter les applications .NET. Il permet de collecter des métriques, des traces et des logs via une API unifiée. Voici un exemple d'intégration avec Prometheus.

\n\n

Installez les packages NuGet :

\n
dotnet add package OpenTelemetry.Extensions.Hosting\ndotnet add package OpenTelemetry.Exporter.Prometheus.AspNetCore\ndotnet add package OpenTelemetry.Instrumentation.AspNetCore
\n\n

Configuration dans Program.cs :

\n
using OpenTelemetry.Metrics;\n\nvar builder = WebApplication.CreateBuilder(args);\n\nbuilder.Services.AddOpenTelemetry()\n    .WithMetrics(metrics => metrics\n        .AddAspNetCoreInstrumentation()\n        .AddRuntimeInstrumentation()\n        .AddPrometheusExporter());\n\nvar app = builder.Build();\n\napp.MapPrometheusScrapingEndpoint(); // endpoint pour Prometheus\n\napp.Run();
\n\n

Désormais, à l'adresse /metrics, votre service fournira des métriques au format Prometheus. Parmi elles : le nombre de requêtes HTTP, leur temps de traitement, les métriques GC et mémoire.

\n\n

Métriques personnalisées

\n

Pour les métriques métier, utilisez Meter et Counter :

\n
using System.Diagnostics.Metrics;\n\npublic class OrderMetrics\n{\n    private readonly Counter<int> _ordersCreated;\n\n    public OrderMetrics(IMeterFactory meterFactory)\n    {\n        var meter = meterFactory.Create("MyApp.Orders");\n        _ordersCreated = meter.CreateCounter<int>("orders.created.count");\n    }\n\n    public void OrderCreated() => _ordersCreated.Add(1);\n}\n\n// Enregistrement dans DI :\nbuilder.Services.AddSingleton<OrderMetrics>();
\n\n

Ces métriques seront automatiquement transmises à Prometheus et disponibles pour la création de tableaux de bord dans Grafana.

\n\n

Configuration des alertes : des règles simples aux systèmes multi-niveaux

\n

Les métriques seules sont inutiles sans alertes. Dans Prometheus, les alertes sont configurées via Alertmanager. Voici un scénario avancé : une alerte sur un temps de réponse API anormal.

\n\n

Règle dans Prometheus (alert.rules.yml)

\n
groups:\n  - name: csharp_app_alerts\n    rules:\n      - alert: HighRequestLatency\n        expr: |\n          histogram_quantile(0.95, \n            rate(http_server_duration_seconds_bucket[5m])\n          ) > 2\n        for: 2m\n        labels:\n          severity: critical\n        annotations:\n          summary: "Latence élevée des requêtes ({{ $value }}s)"\n          descr                

Blogs

Book Recommendations