Surveillance des applications Go : bibliothèques et outils

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 (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/promhttp


Exemple : 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

Recommendations