Monitoramento de aplicações Go (Golang): de métricas a profiling
Go (Golang) — uma linguagem criada para aplicações servidoras de alta carga. No entanto, mesmo o código mais performático pode apresentar falhas, vazamentos de memória ou latência excessivamente alta. Sem monitoramento, você corre o risco de descobrir o problema apenas através de usuários irritados. Neste artigo, abordaremos as principais bibliotecas e ferramentas para monitoramento de aplicações Go: desde a coleta de métricas até tracing e profiling.
Por que monitorar uma aplicação Go?
- Performance: acompanhar tempo de resposta, número de goroutines, uso de CPU e memória.
- Confiabilidade: controlar erros, panics, número de reinicializações.
- Escalabilidade: entender quando é necessário adicionar réplicas.
- Métricas de negócio: número de requisições, usuários ativos, volume de dados processados.
1. Pacote nativo expvar
A maneira mais simples — expvar. Ele fornece um endpoint HTTP com métricas básicas: número de goroutines, uso de memória, tempo de atividade. Adequado para um início rápido.
package main
import ( "expvar" "net/http")
var requestCount = expvar.NewInt("requests_total")
func handler(w http.ResponseWriter, r *http.Request) { requestCount.Add(1) w.Write([]byte("Hello, Go!"))}
func main() { http.HandleFunc("/", handler) // Métricas disponíveis em /debug/vars http.ListenAndServe(":8080", nil)}Execute a aplicação e abra http://localhost:8080/debug/vars — você verá um JSON com as métricas.
2. Prometheus + prometheus/client_golang
Prometheus é o padrão de facto para coleta de métricas em Go. A biblioteca prometheus/client_golang permite registrar métricas personalizadas: contadores, histogramas, sumários.
package main
import ( "net/http" "github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus/promhttp")
var ( httpRequests = prometheus.NewCounterVec( prometheus.CounterOpts{ Name: "http_requests_total", Help: "Total number of HTTP requests.", }, []string{"method", "path"}, ))
func init() { prometheus.MustRegister(httpRequests)}
func handler(w http.ResponseWriter, r *http.Request) { httpRequests.WithLabelValues(r.Method, r.URL.Path).Inc() w.Write([]byte("OK"))}
func main() { http.HandleFunc("/", handler) http.Handle("/metrics", promhttp.Handler()) http.ListenAndServe(":8080", nil)}O endpoint /metrics fornece dados no formato que o Prometheus entende. Em seguida, é possível configurar dashboards no Grafana.
3. Profiling com pprof
O pacote net/http/pprof adiciona endpoints para profiling: CPU, memória, bloqueios, goroutines. É uma ferramenta indispensável para encontrar gargalos.
package main
import ( "net/http" _ "net/http/pprof" // habilita o profiler)
func main() { http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { w.Write([]byte("Profiling ativo")) }) http.ListenAndServe(":6060", nil)}Agora você pode executar:
go tool pprof http://localhost:6060/debug/pprof/profile?seconds=30Isso coletará um perfil de CPU de 30 segundos. Analise-o em modo interativo ou exporte para SVG/PDF.
4. OpenTelemetry — tracing e métricas
OpenTelemetry (OTel) é o padrão moderno para observabilidade. Ele unifica métricas, logs e traces. Para Go, existe o SDK oficial go.opentelemetry.io/otel.
package main
import ( "context" "log" "net/http" "go.opentelemetry.io Também na biblioteca
Trabalhando com Kafka em TypeScript: biblioteca KafkaJS para Node.js
Trabalhando com XML em Rust: bibliotecas roxmltree, quick-xml e serde-xml-rs
Biblioteca Padrão Rust: visão geral completa
Trabalho com XML em PHP: parsing, criação e processamento de dados