Métriques Prometheus en Go (Golang) : guide complet de monitoring

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

Métriques Prometheus en Go (Golang) : guide complet

\n\n

Prometheus est un système de monitoring open source qui est devenu le standard de facto pour la collecte et l'analyse de métriques dans les architectures modernes de microservices. Dans l'écosystème Go (Golang), la bibliothèque prometheus/client_golang fournit une boîte à outils puissante et flexible pour instrumenter les applications. Dans cet article, nous allons détailler comment ajouter des métriques Prometheus à votre application Go, configurer des endpoints HTTP et créer vos propres types de métriques.

\n\n

Installation et configuration

\n\n

Pour commencer, vous devez installer le client officiel Prometheus pour Go :

\n\n
go get github.com/prometheus/client_golang/prometheus\ngo get github.com/prometheus/client_golang/prometheus/promhttp\n
\n\n

La première bibliothèque fournit le noyau pour créer et enregistrer des métriques, la seconde fournit un gestionnaire HTTP prêt à l'emploi pour l'endpoint /metrics.

\n\n

Types de métriques de base de Prometheus

\n\n

Prometheus prend en charge quatre types principaux de métriques, chacun étant conçu pour résoudre des problèmes spécifiques :

\n\n
    \n
  • Counter (compteur) — une valeur qui augmente de manière monotone. Idéal pour compter le nombre de requêtes, d'erreurs, de tâches effectuées.
  • \n
  • Gauge (jauge) — une valeur qui peut à la fois augmenter et diminuer. Utilisée pour la température actuelle, le nombre de connexions actives, la taille de la file d'attente.
  • \n
  • Histogram (histogramme) — collecte des observations (par exemple, le temps d'exécution d'une requête) et les regroupe dans des "seaux" (buckets) configurables. Permet de calculer des quantiles.
  • \n
  • Summary (résumé) — similaire à un histogramme, mais calcule les quantiles côté application. Recommandé lorsque les quantiles sont critiques pour la logique métier.
  • \n
\n\n

Exemple pratique : serveur HTTP avec métriques

\n\n

Créons une application web simple qui enregistre le nombre de requêtes, leur durée et le nombre actuel de connexions actives.

\n\n
package main\n\nimport (\n    "fmt"\n    "net/http"\n    "time"\n\n    "github.com/prometheus/client_golang/prometheus"\n    "github.com/prometheus/client_golang/prometheus/promhttp"\n)\n\nvar (\n    // Compteur de requêtes avec les labels "method" et "endpoint"\n    requestCounter = prometheus.NewCounterVec(\n        prometheus.CounterOpts{\n            Name: "http_requests_total",\n            Help: "Total number of HTTP requests",\n        },\n        []string{"method", "endpoint"},\n    )\n\n    // Histogramme pour la durée des requêtes\n    requestDuration = prometheus.NewHistogramVec(\n        prometheus.HistogramOpts{\n            Name:    "http_request_duration_seconds",\n            Help:    "Histogram of request duration in seconds",\n            Buckets: prometheus.DefBuckets, // [0.005, 0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 1, 2.5, 5, 10]\n        },\n        []string{"method", "endpoint"},\n    )\n\n    // Jauge des connexions actives\n    activeConnections = prometheus.NewGauge(\n        prometheus.GaugeOpts{\n            Name: "http_active_connections",\n            Help: "Current number of active connections",\n        },\n    )\n)\n\nfunc init() {\n    // Enregistrons les métriques dans le registre Prometheus\n    prometheus.MustRegister(requestCounter)\n    prometheus.MustRegister(requestDuration)\n    prometheus.MustRegister(activeConnections)\n}\n\n// middleware enveloppe chaque requête HTTP pour collecter les métriques\nfunc metricsMiddleware(next http.Handler) http.Handler {\n    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {\n        // Augmentons le compteur de connexions actives\n        activeConnections.Inc()\n        defer activeConnections.Dec()\n\n        start := time.Now()\n        next.ServeHTTP(w, r)\n        duration := time.Since(start).Seconds()\n\n        // Enregistrons les métriques de la requête\n        requestCounter.WithLabelVal                    

Recommendations