Introdução: por que o monitoramento é crítico para aplicações Go
Go (Golang) conquistou popularidade no desenvolvimento de microsserviços de alta carga, API gateways e utilitários de rede devido ao seu desempenho e simplicidade. No entanto, mesmo a aplicação mais estável pode enfrentar vazamentos de memória, travamentos de goroutines ou aumento repentino de latência. É aqui que o monitoramento entra em ação — uma prática chave do Site Reliability Engineering (SRE).
Neste artigo, vamos analisar como configurar o monitoramento de aplicações Go usando a stack Prometheus + Grafana, quais métricas coletar primeiro e como configurar alertas para prevenir incidentes. O material será útil tanto para desenvolvedores Go iniciantes quanto para engenheiros experientes que desejam melhorar a observabilidade de seus serviços.
1. Métricas principais de uma aplicação Go
Antes de configurar o monitoramento, é importante entender quais métricas são vitais para um serviço Go. Elas podem ser divididas em três categorias:
1.1. Métricas do runtime Go
O runtime Go fornece informações ricas sobre o estado da aplicação. Usando o pacote runtime e o exporter padrão expvar, você pode obter dados sobre:
- Número de goroutines (
runtime.NumGoroutine()) — um aumento repentino indica vazamento de goroutines. - Uso de memória (
runtime.ReadMemStats()) — monitoreAlloc,HeapInuseeGCStats. - Tempo de garbage collection — se o GC ocupar mais de 5% do tempo, é um sinal para otimização.
- Número de chamadas de sistema — pode indicar bloqueios.
1.2. Métricas de negócio
Para entender a saúde do serviço, é necessário monitorar indicadores de negócio:
- RPS (Requests Per Second) — número de requisições por segundo.
- Latência (P50, P95, P99) — atrasos no processamento de requisições.
- Taxa de erro — porcentagem de erros (5xx, 4xx).
- Número de conexões ativas (banco de dados, APIs externas).
1.3. Métricas de infraestrutura
Não se esqueça das métricas do sistema: CPU, memória, I/O de disco, pacotes de rede. Elas ajudam a distinguir um problema da aplicação de um problema do host.
2. Integração com Prometheus: exportação de métricas
Prometheus é o padrão de facto para coleta de métricas no mundo Go. Vamos analisar a integração passo a passo.
2.1. Instalação do cliente Prometheus para Go
Adicione a dependência ao seu go.mod:
go get github.com/prometheus/client_golang/prometheusgo get github.com/prometheus/client_golang/prometheus/promhttp2.2. Criação de métricas customizadas
Exemplo de criação de um contador de requisições e um histograma para tempo de resposta:
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", "status"}, ) 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) prometheus.MustRegister(requestDuration)}
func metricsMiddleware(next http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { start := time.Now() wrapped := &responseWriter{ResponseWriter: w, statusCode: http.Stat