Monitoramento de aplicações Go (Golang): bibliotecas e ferramentas

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

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=30

Isso 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

Recommendations