Surveillance des applications Go (Golang) : outils et bibliothèques
La surveillance est une partie essentielle de l'exploitation en production de tout service. Pour les applications en Go (Golang), l'écosystème propose à la fois des solutions intégrées et des outils externes puissants. Dans cet article, nous examinerons les principales approches : du profilage de base à la collecte de métriques et au traçage.
1. Outils intégrés : le package expvar
Le package expvar fournit un point de terminaison HTTP très simple pour publier les variables d'état de l'application. Il ne nécessite aucune dépendance externe et est idéal pour un diagnostic rapide.
Connexion et utilisation
package main
import ( "expvar" "net/http")
var requestsCount = expvar.NewInt("total_requests")
func handler(w http.ResponseWriter, r *http.Request) { requestsCount.Add(1) w.Write([]byte("OK"))}
func main() { http.HandleFunc("/api", handler) // Le point de terminaison /debug/vars sera disponible automatiquement http.ListenAndServe(":8080", nil)}Après le lancement, accédez à /debug/vars — vous verrez un JSON avec les métriques, y compris le compteur de requêtes, les données GC et la mémoire.
2. Prometheus — le standard de facto pour les métriques
Prometheus est le système de surveillance le plus populaire pour Go. La bibliothèque prometheus/client_golang permet d'exporter les métriques dans un format compréhensible par le serveur Prometheus.
Installation
go get github.com/prometheus/client_golang/prometheusgo get github.com/prometheus/client_golang/prometheus/promhttpExemple : compteur et histogramme
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: "Histogram of request durations", Buckets: prometheus.DefBuckets, }, []string{"method"}, ))
func init() { prometheus.MustRegister(requestCount, requestDuration)}
func handler(w http.ResponseWriter, r *http.Request) { start := time.Now() requestCount.WithLabelValues(r.Method, r.URL.Path).Inc() w.Write([]byte("Hello")) requestDuration.WithLabelValues(r.Method).Observe(time.Since(start).Seconds())}
func main() { http.Handle("/metrics", promhttp.Handler()) http.HandleFunc("/", handler) http.ListenAndServe(":8080", nil)}Prometheus collectera les métriques depuis le point de terminaison /metrics. Vous pouvez ajouter des alertes dans Alertmanager basées sur ces données.
3. Profilage avec pprof
Le package net/http/pprof ajoute à l'application des points de terminaison pour le profilage du CPU, de la mémoire, des goroutines et des verrous. C'est un outil indispensable pour trouver les goulots d'étranglement.
Démarrage rapide
package main
import ( "log" "net/http" _ "net/http/pprof" // enregistre les gestionnaires)
func main() { http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { w.Write([]byte("Hello, pprof!")) }) log.Fatal(http.ListenAndServe(":6060", nil))}Les points de terminaison suivants sont désormais disponibles :
/debug/pprof/— liste des profils/debug/pprof/profile— profil CPU/debug/pprof/heap— profil mémoire/debug/pprof/goroutine— piles des goroutines
Analysez les profils avec la commande go tool pprof ou vi
Aussi dans la bibliothèque
Travailler avec Excel en C# (.NET) : bibliothèques EPPlus, ClosedXML et NPOI
Bibliothèque standard TypeScript : aperçu complet pour les développeurs
Travailler avec Apache Kafka en Java : guide complet pour développeur
Jetons JWT en PHP : Guide complet d'authentification et d'autorisation
Traitement JSON en PHP : fonctions, exemples et meilleures pratiques