Monitoramento de aplicações Go (Golang): ferramentas e bibliotecas
O monitoramento é uma parte essencial da operação de produção de qualquer serviço. Para aplicações em Go (Golang), o ecossistema oferece tanto soluções integradas quanto ferramentas externas poderosas. Neste artigo, abordaremos as principais abordagens: desde a criação básica de perfis até a coleta de métricas e rastreamento.
1. Ferramentas integradas: pacote expvar
O pacote expvar fornece um endpoint HTTP simples para publicar variáveis de estado da aplicação. Ele não requer dependências externas e é ideal para diagnósticos rápidos.
Conexão e uso
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) // O endpoint /debug/vars estará disponível automaticamente http.ListenAndServe(":8080", nil)}Após a execução, acesse /debug/vars — você verá um JSON com métricas, incluindo contagem de requisições, dados de GC e memória.
2. Prometheus — o padrão de facto para métricas
Prometheus é o sistema de monitoramento mais popular para Go. A biblioteca prometheus/client_golang permite exportar métricas em um formato compreensível pelo servidor Prometheus.
Instalação
go get github.com/prometheus/client_golang/prometheusgo get github.com/prometheus/client_golang/prometheus/promhttpExemplo: contador e histograma
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)}O Prometheus coletará métricas do endpoint /metrics. Você pode adicionar alertas no Alertmanager com base nesses dados.
3. Criação de perfis com pprof
O pacote net/http/pprof adiciona endpoints à aplicação para criação de perfis de CPU, memória, goroutines e bloqueios. É uma ferramenta indispensável para encontrar gargalos.
Início rápido
package main
import ( "log" "net/http" _ "net/http/pprof" // registra os handlers)
func main() { http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { w.Write([]byte("Hello, pprof!")) }) log.Fatal(http.ListenAndServe(":6060", nil))}Agora, os endpoints estão disponíveis:
/debug/pprof/— lista de perfis/debug/pprof/profile— perfil de CPU/debug/pprof/heap— perfil de memória/debug/pprof/goroutine— stacks de goroutines
Analise os perfis com o comando go tool pprof ou vi
Também na biblioteca
Prophecy PHP: guia completo com exemplos práticos
ts-mockito para TypeScript: guia completo com exemplos
TBB (Intel Threading Building Blocks) para C++: guia completo com exemplos