Monitoramento de aplicações Go: métricas e alertas em nível avançado
\nAs aplicações Go modernas exigem não apenas alto desempenho, mas também um monitoramento confiável. A coleta básica de métricas (CPU, memória, requisições) é apenas o primeiro passo. Em um nível avançado, é necessário implementar métricas personalizadas, configurar alertas com base na lógica de negócios e garantir a tolerância a falhas. Neste artigo, veremos como implementar um monitoramento abrangente de aplicações Go usando Prometheus, Grafana e alertas personalizados.
\n\n1. Coleta avançada de métricas em Go com Prometheus
\nA biblioteca prometheus/client_golang permite coletar não apenas métricas padrão, mas também métricas personalizadas. Vejamos um exemplo de configuração de um coletor de métricas personalizado para um servidor HTTP.
package main\n\nimport (\n "net/http"\n "github.com/prometheus/client_golang/prometheus"\n "github.com/prometheus/client_golang/prometheus/promhttp"\n)\n\nvar (\n requestDuration = prometheus.NewHistogramVec(\n prometheus.HistogramOpts{\n Name: "http_request_duration_seconds",\n Help: "Tempo de execução das requisições HTTP.",\n Buckets: prometheus.DefBuckets,\n },\n []string{"method", "path", "status"},\n )\n activeRequests = prometheus.NewGauge(\n prometheus.GaugeOpts{\n Name: "http_active_requests_total",\n Help: "Número atual de requisições ativas.",\n },\n )\n)\n\nfunc init() {\n prometheus.MustRegister(requestDuration)\n prometheus.MustRegister(activeRequests)\n}\n\nfunc metricsMiddleware(next http.Handler) http.Handler {\n return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {\n activeRequests.Inc()\n defer activeRequests.Dec()\n\n timer := prometheus.NewTimer(prometheus.ObserverFunc(func(v float64) {\n requestDuration.WithLabelValues(r.Method, r.URL.Path, "200").Observe(v)\n }))\n defer timer.ObserveDuration()\n\n next.ServeHTTP(w, r)\n })\n}\n\nfunc main() {\n mux := http.NewServeMux()\n mux.Handle("/metrics", promhttp.Handler())\n mux.Handle("/api", metricsMiddleware(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {\n w.Write([]byte("Hello, Go!"))\n })))\n http.ListenAndServe(":8080", mux)\n}\n\nNeste exemplo, criamos um histograma para a duração das requisições e um gauge para requisições ativas. O uso de labels (rótulos) permite detalhar as métricas por métodos, caminhos e status.
\n\n2. Configuração de alertas com base na lógica de negócios
\nOs alertas devem ser não apenas técnicos (alta carga de CPU), mas também de negócios. Por exemplo, exceder o tempo de resposta para um endpoint crítico ou uma queda no número de transações bem-sucedidas. Configuração de alertas no Prometheus (arquivo alerts.yml):
groups:\n - name: go_app_alerts\n rules:\n - alert: HighRequestLatency\n expr: http_request_duration_seconds{job="go-app"} > 1.0\n for: 5m\n labels:\n severity: critical\n annotations:\n summary: "Alta latência de requisição ({{ $value }}s)"\n description: "O endpoint {{ $labels.path }} tem latência superior a 1 segundo por 5 minutos."\n\n - alert: ActiveRequestsSurge\n expr: http_active_requests_total{job="go-app"} > 100\n for: 2m\n labels:\n severity: warning\n annotations:\n summary: "Pico de requisições ativas ({{ $value }})"\n description: "O número de requisições ativas excedeu 100 em 2 minutos."\n\n - alert: ErrorRateHigh\n expr: rate(http_requests_total{status=~"5.."}[5m]) > 0.1\n for: 10m\n labels:\n severity: critical\n annotations:\n summary: "Alta taxa de erros 5xx"\n description: "A taxa de erros excede 10% nos últimos 10 minutos."\n\nObserve o uso