Métricas do Prometheus em Go (Golang): guia completo de monitoramento

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

Métricas do Prometheus em Go (Golang): guia completo



Prometheus é um sistema de monitoramento de código aberto que se tornou o padrão de facto para coleta e análise de métricas em arquiteturas modernas de microsserviços. No ecossistema Go (Golang), a biblioteca prometheus/client_golang fornece um conjunto de ferramentas poderoso e flexível para instrumentar aplicações. Neste artigo, vamos detalhar como adicionar métricas do Prometheus à sua aplicação Go, configurar endpoints HTTP e criar tipos de métricas personalizados.



Instalação e configuração



Para começar, é necessário instalar o cliente oficial do Prometheus para Go:



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


A primeira biblioteca fornece o núcleo para criar e registrar métricas, a segunda fornece um manipulador HTTP pronto para o endpoint /metrics.



Tipos básicos de métricas do Prometheus



O Prometheus suporta quatro tipos principais de métricas, cada um projetado para resolver problemas específicos:



  • Counter (contador) — um valor monotonicamente crescente. Ideal para contar o número de requisições, erros, tarefas concluídas.
  • Gauge (medidor) — um valor que pode tanto aumentar quanto diminuir. Usado para temperatura atual, número de conexões ativas, tamanho da fila.
  • Histogram (histograma) — coleta observações (por exemplo, tempo de execução de uma requisição) e as agrupa em "baldes" (buckets) configuráveis. Permite calcular quantis.
  • Summary (resumo) — semelhante ao histograma, mas calcula os quantis no lado da aplicação. Recomendado para casos onde os quantis são críticos para a lógica de negócios.


Exemplo prático: servidor HTTP com métricas



Vamos criar uma aplicação web simples que registra o número de requisições, sua duração e o número atual de conexões ativas.



package main

import ( "fmt" "net/http" "time"

"github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus/promhttp")

var ( // Contador de requisições com rótulos "method" e "endpoint" requestCounter = prometheus.NewCounterVec( prometheus.CounterOpts{ Name: "http_requests_total", Help: "Total number of HTTP requests", }, []string{"method", "endpoint"}, )

// Histograma para duração das requisições requestDuration = prometheus.NewHistogramVec( prometheus.HistogramOpts{ Name: "http_request_duration_seconds", Help: "Histogram of request duration in seconds", Buckets: prometheus.DefBuckets, // [0.005, 0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 1, 2.5, 5, 10] }, []string{"method", "endpoint"}, )

// Medidor de conexões ativas activeConnections = prometheus.NewGauge( prometheus.GaugeOpts{ Name: "http_active_connections", Help: "Current number of active connections", }, ))

func init() { // Registramos as métricas no registro do Prometheus prometheus.MustRegister(requestCounter) prometheus.MustRegister(requestDuration) prometheus.MustRegister(activeConnections)}

// middleware envolve cada requisição HTTP para coleta de métricasfunc metricsMiddleware(next http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { // Incrementamos o contador de conexões ativas activeConnections.Inc() defer activeConnections.Dec()

start := time.Now() next.ServeHTTP(w, r) duration := time.Since(start).Seconds()

// Registramos as métricas da requisição requestCounter.WithLabelVal

Recommendations