Métricas Prometheus em Go (Golang): guia completo
Prometheus é um poderoso sistema de monitoramento e alerta de código aberto, que se tornou o padrão de facto no mundo das aplicações em nuvem. Para a linguagem Go (Golang), existe o cliente oficial prometheus/client_golang, que permite adicionar métricas facilmente à sua aplicação. Neste artigo, vamos detalhar como instalar a biblioteca, criar os principais tipos de métricas (counter, gauge, histogram) e exportá-las via HTTP.
1. Instalação da biblioteca
Para trabalhar com Prometheus em Go, é necessário instalar o pacote prometheus/client_golang. Execute o comando:
go get github.com/prometheus/client_golang/prometheusgo get github.com/prometheus/client_golang/prometheus/promhttpO primeiro pacote contém os tipos básicos de métricas, o segundo contém o manipulador HTTP para exportar métricas no formato compreendido pelo servidor Prometheus.
2. Principais tipos de métricas
Prometheus suporta quatro tipos principais de métricas. Vamos considerar os três mais populares:
- Counter — um contador que apenas aumenta (por exemplo, número de requisições).
- Gauge — um valor que pode tanto aumentar quanto diminuir (por exemplo, número de conexões ativas).
- Histogram — um histograma que mede a distribuição de valores (por exemplo, tempo de resposta).
3. Exemplo: Counter (contador de requisições)
Vamos criar um servidor HTTP simples que conta o número de requisições processadas:
package main
import ( "fmt" "net/http" "github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus/promhttp")
var ( requestsTotal = prometheus.NewCounter( prometheus.CounterOpts{ Name: "http_requests_total", Help: "Total number of HTTP requests.", }, ))
func init() { prometheus.MustRegister(requestsTotal)}
func handler(w http.ResponseWriter, r *http.Request) { requestsTotal.Inc() fmt.Fprintf(w, "Hello, you are visitor #%d", requestsTotal)}
func main() { http.HandleFunc("/", handler) http.Handle("/metrics", promhttp.Handler()) http.ListenAndServe(":8080", nil)}Neste exemplo:
prometheus.NewCountercria um contador com o nomehttp_requests_total.prometheus.MustRegisterregistra a métrica no registro global.requestsTotal.Inc()incrementa o contador em 1 a cada requisição.promhttp.Handler()exporta todas as métricas registradas no endpoint/metrics.
4. Exemplo: Gauge (conexões ativas)
Gauge é ideal para monitorar o estado atual, por exemplo, o número de goroutines ativas:
var ( activeGoroutines = prometheus.NewGauge( prometheus.GaugeOpts{ Name: "active_goroutines", Help: "Current number of active goroutines.", }, ))
func monitorGoroutines() { for { activeGoroutines.Set(float64(runtime.NumGoroutine())) time.Sleep(5 * time.Second) }}
func main() { prometheus.MustRegister(activeGoroutines) go monitorGoroutines() // ... código restante}Aqui, Set() define o valor atual, enquanto Inc() e Dec() permitem aumentar ou diminuir o gauge em uma unidade.
5. Exemplo: Histogram (tempo de resposta)
Histogram coleta observações e as distribui em segmentos configuráveis (buckets):
var ( requestDuration = prometheus.NewHistogram( prometheus.HistogramOpts{ Name: "http_request_duration_seconds", Help: "Histogr Também na biblioteca
node-cron: Agendador de Tarefas JavaScript
Processamento de Imagens em C++: resize e crop com a biblioteca OpenCV