Surveillance des applications Go : métriques et alertes de niveau avancé

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 Go : métriques et alertes de niveau avancé

\n

Les applications Go modernes nécessitent non seulement des performances élevées, mais aussi une surveillance fiable. La collecte de base des métriques (CPU, mémoire, requêtes) n'est que la première étape. Au niveau avancé, il est nécessaire d'intégrer des métriques personnalisées, de configurer des alertes basées sur la logique métier et d'assurer la tolérance aux pannes. Dans cet article, nous verrons comment mettre en œuvre une surveillance complète des applications Go à l'aide de Prometheus, Grafana et de vos propres alertes.

\n\n

1. Collecte avancée de métriques en Go avec Prometheus

\n

La bibliothèque prometheus/client_golang permet de collecter non seulement des métriques standard, mais aussi des métriques personnalisées. Voici un exemple de configuration d'un collecteur de métriques personnalisé pour un serveur HTTP.

\n\n
package main\n\nimport (\n    "net/http"\n    "github.com/prometheus/client_golang/prometheus"\n    "github.com/prometheus/client_golang/prometheus/promhttp"\n)\n\nvar (\n    requestDuration = prometheus.NewHistogramVec(\n        prometheus.HistogramOpts{\n            Name:    "http_request_duration_seconds",\n            Help:    "Temps d'exécution des requêtes HTTP.",\n            Buckets: prometheus.DefBuckets,\n        },\n        []string{"method", "path", "status"},\n    )\n    activeRequests = prometheus.NewGauge(\n        prometheus.GaugeOpts{\n            Name: "http_active_requests_total",\n            Help: "Nombre actuel de requêtes actives.",\n        },\n    )\n)\n\nfunc init() {\n    prometheus.MustRegister(requestDuration)\n    prometheus.MustRegister(activeRequests)\n}\n\nfunc metricsMiddleware(next http.Handler) http.Handler {\n    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {\n        activeRequests.Inc()\n        defer activeRequests.Dec()\n\n        timer := prometheus.NewTimer(prometheus.ObserverFunc(func(v float64) {\n            requestDuration.WithLabelValues(r.Method, r.URL.Path, "200").Observe(v)\n        }))\n        defer timer.ObserveDuration()\n\n        next.ServeHTTP(w, r)\n    })\n}\n\nfunc main() {\n    mux := http.NewServeMux()\n    mux.Handle("/metrics", promhttp.Handler())\n    mux.Handle("/api", metricsMiddleware(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {\n        w.Write([]byte("Hello, Go!"))\n    })))\n    http.ListenAndServe(":8080", mux)\n}
\n\n

Dans cet exemple, nous créons un histogramme pour la durée des requêtes et une jauge pour les requêtes actives. L'utilisation d'étiquettes (labels) permet de détailler les métriques par méthodes, chemins et statuts.

\n\n

2. Configuration d'alertes basées sur la logique métier

\n

Les alertes ne doivent pas être seulement techniques (charge CPU élevée), mais aussi métier. Par exemple, un dépassement du temps de réponse pour un point d'accès critique ou une baisse du nombre de transactions réussies. Configuration des alertes dans Prometheus (fichier alerts.yml) :

\n\n
groups:\n  - name: go_app_alerts\n    rules:\n      - alert: HighRequestLatency\n        expr: http_request_duration_seconds{job="go-app"} > 1.0\n        for: 5m\n        labels:\n          severity: critical\n        annotations:\n          summary: "Latence de requête élevée ({{ $value }}s)"\n          description: "Le point d'accès {{ $labels.path }} a une latence supérieure à 1 seconde pendant 5 minutes."\n\n      - alert: ActiveRequestsSurge\n        expr: http_active_requests_total{job="go-app"} > 100\n        for: 2m\n        labels:\n          severity: warning\n        annotations:\n          summary: "Pic de requêtes actives ({{ $value }})"\n          description: "Le nombre de requêtes actives a dépassé 100 pendant 2 minutes."\n\n      - alert: ErrorRateHigh\n        expr: rate(http_requests_total{status=~"5.."}[5m]) > 0.1\n        for: 10m\n        labels:\n          severity: critical\n        annotations:\n          summary: "Taux d'erreurs 5xx élevé"\n          description: "Le taux d'erreurs dépasse 10% au cours des 10 dernières minutes."
\n\n

Notez l'utilisation

Blogs

Book Recommendations