Surveillance des applications Go (Golang) : aperçu complet des outils et bibliothèques
La surveillance est une partie essentielle de l'exploitation de toute application serveur. Pour l'écosystème Go (Golang), de nombreux outils ont été développés pour suivre les performances, l'état et les erreurs en temps réel. Dans cet article, nous analyserons les bibliothèques et approches clés pour la surveillance des applications Go, notamment Prometheus, expvar, pprof et OpenTelemetry.
Pourquoi la surveillance des applications Go est-elle nécessaire ?
Les applications Go sont souvent utilisées pour les microservices à forte charge, les passerelles API et les gestionnaires d'arrière-plan. Sans surveillance, vous risquez de manquer :
- Les fuites de mémoire et de goroutines ;
- Les requêtes lentes et les blocages ;
- La baisse des performances sous charge ;
- Les erreurs de connexion aux bases de données et aux services externes.
1. Prometheus — standard de collecte de métriques
Prometheus est le standard de facto pour la collecte de métriques dans le monde Go. La bibliothèque cliente officielle prometheus/client_golang permet d'exporter facilement les métriques au format Prometheus.
Installation
go get github.com/prometheus/client_golang/prometheusgo get github.com/prometheus/client_golang/prometheus/promhttpExemple : compteur de requêtes et histogramme de temps
package main
import ( "net/http" "time" "github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus/promhttp")
var ( requestCount = prometheus.NewCounterVec( prometheus.CounterOpts{ Name: "http_requests_total", Help: "Total number of HTTP requests", }, []string{"method", "endpoint"}, ) requestDuration = prometheus.NewHistogramVec( prometheus.HistogramOpts{ Name: "http_request_duration_seconds", Help: "Duration of HTTP requests in seconds", Buckets: prometheus.DefBuckets, }, []string{"method", "endpoint"}, ))
func init() { prometheus.MustRegister(requestCount, requestDuration)}
func middleware(next http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { start := time.Now() next.ServeHTTP(w, r) duration := time.Since(start).Seconds() requestCount.WithLabelValues(r.Method, r.URL.Path).Inc() requestDuration.WithLabelValues(r.Method, r.URL.Path).Observe(duration) })}
func main() { mux := http.NewServeMux() mux.Handle("/metrics", promhttp.Handler()) mux.Handle("/", middleware(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { w.Write([]byte("Hello, World!")) }))) http.ListenAndServe(":8080", mux)}Après le lancement, les métriques seront disponibles à l'adresse http://localhost:8080/metrics. Prometheus configurera la collecte à partir de ce point d'accès.
2. expvar — exportation intégrée de métriques
La bibliothèque standard de Go propose le package expvar pour publier les variables d'état de l'application. Il ne nécessite aucune dépendance externe.
Exemple d'utilisation
package main
import ( "expvar" "net/http")
var ( requests = expvar.NewInt("requests_total") errors = expvar.NewInt("errors_total"))
func handler(w http.ResponseWriter, r *http.Request) { requests.Add(1) // Simulation d'erreur if r.URL.Query().Get("error") == "1" { errors.Add(1) w.WriteHeader(http.StatusInternalServerError) return } w.Write([]byte("OK"))}
func main() { http.HandleFunc("/debug/vars", expvar.Handler().ServeHTTP) http.HandleFunc("/", handler) http.ListenAndServe(":8080", nil)}Les métriques sont disponibles au chemin /debug/vars au format JSON. Pour l'intégration avec Prometheus, vous pouvez utiliser <