Monitoramento de aplicações Go: métricas e alertas

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

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()) — monitore Alloc, HeapInuse e GCStats.
  • 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/promhttp


2.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

Blogs

Book Recommendations