Monitoramento de aplicações Go: 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): 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/promhttp


Exemplo: 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

Recommendations