Monitoramento de aplicações Go (Golang): visão geral completa de ferramentas e bibliotecas
O monitoramento é uma parte criticamente importante da operação de qualquer aplicação servidora. Para o ecossistema Go (Golang), foram desenvolvidas diversas ferramentas que permitem rastrear desempenho, estado e erros em tempo real. Neste artigo, abordaremos as principais bibliotecas e abordagens para monitoramento de aplicações Go, incluindo Prometheus, expvar, pprof e OpenTelemetry.
Por que o monitoramento de aplicações Go é necessário?
As aplicações Go são frequentemente usadas para microsserviços de alta carga, gateways de API e processadores em segundo plano. Sem monitoramento, você corre o risco de perder:
- Vazamentos de memória e goroutines;
- Requisições lentas e bloqueios;
- Queda de desempenho sob carga;
- Erros de conexão com bancos de dados e serviços externos.
1. Prometheus — padrão de coleta de métricas
Prometheus é o padrão de facto para coleta de métricas no mundo Go. A biblioteca cliente oficial prometheus/client_golang permite exportar facilmente métricas no formato Prometheus.
Instalação
go get github.com/prometheus/client_golang/prometheusgo get github.com/prometheus/client_golang/prometheus/promhttpExemplo: contador de requisições e histograma de tempo
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)}Após a execução, as métricas estarão disponíveis no endereço http://localhost:8080/metrics. O Prometheus configurará a coleta a partir deste endpoint.
2. expvar — exportação embutida de métricas
A biblioteca padrão do Go oferece o pacote expvar para publicar variáveis de estado da aplicação. Ele não requer dependências externas.
Exemplo de uso
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) // Simulação de erro 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)}As métricas estão disponíveis no caminho /debug/vars no formato JSON. Para integração com o Prometheus, pode-se usar <