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): visão geral completa de ferramentas e bibliotecas



O monitoramento é uma parte criticamente importante da operação de qualquer aplicação servidora. Para o ecossistema Go (Golang), foram desenvolvidas diversas ferramentas que permitem rastrear desempenho, estado e erros em tempo real. Neste artigo, abordaremos as principais bibliotecas e abordagens para monitoramento de aplicações Go, incluindo Prometheus, expvar, pprof e OpenTelemetry.



Por que o monitoramento de aplicações Go é necessário?

As aplicações Go são frequentemente usadas para microsserviços de alta carga, gateways de API e processadores em segundo plano. Sem monitoramento, você corre o risco de perder:

  • Vazamentos de memória e goroutines;
  • Requisições lentas e bloqueios;
  • Queda de desempenho sob carga;
  • Erros de conexão com bancos de dados e serviços externos.


1. Prometheus — padrão de coleta de métricas

Prometheus é o padrão de facto para coleta de métricas no mundo Go. A biblioteca cliente oficial prometheus/client_golang permite exportar facilmente métricas no formato Prometheus.



Instalação

go get github.com/prometheus/client_golang/prometheusgo get github.com/prometheus/client_golang/prometheus/promhttp


Exemplo: contador de requisições e histograma de tempo

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: "Duration of HTTP requests in seconds", Buckets: prometheus.DefBuckets, }, []string{"method", "endpoint"}, ))

func init() { prometheus.MustRegister(requestCount, requestDuration)}

func middleware(next http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { start := time.Now() next.ServeHTTP(w, r) duration := time.Since(start).Seconds() requestCount.WithLabelValues(r.Method, r.URL.Path).Inc() requestDuration.WithLabelValues(r.Method, r.URL.Path).Observe(duration) })}

func main() { mux := http.NewServeMux() mux.Handle("/metrics", promhttp.Handler()) mux.Handle("/", middleware(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { w.Write([]byte("Hello, World!")) }))) http.ListenAndServe(":8080", mux)}

Após a execução, as métricas estarão disponíveis no endereço http://localhost:8080/metrics. O Prometheus configurará a coleta a partir deste endpoint.



2. expvar — exportação embutida de métricas

A biblioteca padrão do Go oferece o pacote expvar para publicar variáveis de estado da aplicação. Ele não requer dependências externas.



Exemplo de uso

package main

import ( "expvar" "net/http")

var ( requests = expvar.NewInt("requests_total") errors = expvar.NewInt("errors_total"))

func handler(w http.ResponseWriter, r *http.Request) { requests.Add(1) // Simulação de erro if r.URL.Query().Get("error") == "1" { errors.Add(1) w.WriteHeader(http.StatusInternalServerError) return } w.Write([]byte("OK"))}

func main() { http.HandleFunc("/debug/vars", expvar.Handler().ServeHTTP) http.HandleFunc("/", handler) http.ListenAndServe(":8080", nil)}

As métricas estão disponíveis no caminho /debug/vars no formato JSON. Para integração com o Prometheus, pode-se usar <

Recommendations