Métriques Prometheus en Go (Golang) : guide complet
Prometheus est un puissant système de surveillance et d'alerte open source, devenu le standard de facto dans le monde des applications cloud. Pour le langage Go (Golang), il existe un client officiel prometheus/client_golang qui permet d'ajouter facilement des métriques à votre application. Dans cet article, nous allons détailler comment installer la bibliothèque, créer les principaux types de métriques (counter, gauge, histogram) et les exporter via HTTP.
1. Installation de la bibliothèque
Pour travailler avec Prometheus en Go, vous devez installer le paquet prometheus/client_golang. Exécutez la commande :
go get github.com/prometheus/client_golang/prometheusgo get github.com/prometheus/client_golang/prometheus/promhttpLe premier paquet contient les types de métriques de base, le second contient le gestionnaire HTTP pour exporter les métriques dans un format compréhensible par le serveur Prometheus.
2. Types de métriques principaux
Prometheus prend en charge quatre types de métriques principaux. Examinons les trois plus populaires :
- Counter — un compteur qui ne fait qu'augmenter (par exemple, le nombre de requêtes).
- Gauge — une valeur qui peut à la fois augmenter et diminuer (par exemple, le nombre de connexions actives).
- Histogram — un histogramme qui mesure la distribution des valeurs (par exemple, le temps de réponse).
3. Exemple : Counter (compteur de requêtes)
Créons un simple serveur HTTP qui compte le nombre de requêtes traitées :
package main
import ( "fmt" "net/http" "github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus/promhttp")
var ( requestsTotal = prometheus.NewCounter( prometheus.CounterOpts{ Name: "http_requests_total", Help: "Total number of HTTP requests.", }, ))
func init() { prometheus.MustRegister(requestsTotal)}
func handler(w http.ResponseWriter, r *http.Request) { requestsTotal.Inc() fmt.Fprintf(w, "Hello, you are visitor #%d", requestsTotal)}
func main() { http.HandleFunc("/", handler) http.Handle("/metrics", promhttp.Handler()) http.ListenAndServe(":8080", nil)}Dans cet exemple :
prometheus.NewCountercrée un compteur nomméhttp_requests_total.prometheus.MustRegisterenregistre la métrique dans le registre global.requestsTotal.Inc()incrémente le compteur de 1 à chaque requête.promhttp.Handler()exporte toutes les métriques enregistrées à l'adresse/metrics.
4. Exemple : Gauge (connexions actives)
Gauge est idéal pour suivre l'état actuel, par exemple le nombre de goroutines actives :
var ( activeGoroutines = prometheus.NewGauge( prometheus.GaugeOpts{ Name: "active_goroutines", Help: "Current number of active goroutines.", }, ))
func monitorGoroutines() { for { activeGoroutines.Set(float64(runtime.NumGoroutine())) time.Sleep(5 * time.Second) }}
func main() { prometheus.MustRegister(activeGoroutines) go monitorGoroutines() // ... reste du code}Ici, Set() définit la valeur actuelle, tandis que Inc() et Dec() permettent d'augmenter ou de diminuer le gauge d'une unité.
5. Exemple : Histogram (temps de réponse)
Histogram collecte des observations et les répartit dans des segments (buckets) configurables :
var ( requestDuration = prometheus.NewHistogram( prometheus.HistogramOpts{ Name: "http_request_duration_seconds", Help: "Histogr