Métricas de Prometheus en Go (Golang): guía completa
Prometheus es un sistema de monitoreo de código abierto que se ha convertido en el estándar de facto para la recopilación y análisis de métricas en arquitecturas modernas de microservicios. En el ecosistema de Go (Golang), la biblioteca prometheus/client_golang proporciona un conjunto de herramientas potente y flexible para instrumentar aplicaciones. En este artículo, analizaremos en detalle cómo agregar métricas de Prometheus a su aplicación Go, configurar endpoints HTTP y crear tipos de métricas personalizados.
Instalación y configuración
Para comenzar, es necesario instalar el cliente oficial de Prometheus para Go:
go get github.com/prometheus/client_golang/prometheusgo get github.com/prometheus/client_golang/prometheus/promhttpLa primera biblioteca proporciona el núcleo para crear y registrar métricas, la segunda proporciona un manejador HTTP listo para usar para el endpoint /metrics.
Tipos básicos de métricas de Prometheus
Prometheus admite cuatro tipos principales de métricas, cada uno diseñado para resolver tareas específicas:
- Counter (contador) — un valor que aumenta monótonamente. Ideal para contar el número de solicitudes, errores, tareas completadas.
- Gauge (indicador) — un valor que puede tanto aumentar como disminuir. Se utiliza para temperatura actual, número de conexiones activas, tamaño de cola.
- Histogram (histograma) — recopila observaciones (por ejemplo, tiempo de ejecución de una solicitud) y las agrupa en "cubos" (buckets) configurables. Permite calcular cuantiles.
- Summary (resumen) — similar al histograma, pero calcula los cuantiles en el lado de la aplicación. Se recomienda para casos donde los cuantiles son críticos para la lógica de negocio.
Ejemplo práctico: servidor HTTP con métricas
Crearemos una aplicación web simple que registra el número de solicitudes, su duración y el número actual de conexiones activas.
package main
import ( "fmt" "net/http" "time"
"github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus/promhttp")
var ( // Contador de solicitudes con etiquetas "method" y "endpoint" requestCounter = prometheus.NewCounterVec( prometheus.CounterOpts{ Name: "http_requests_total", Help: "Total number of HTTP requests", }, []string{"method", "endpoint"}, )
// Histograma para la duración de las solicitudes 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"}, )
// Indicador de conexiones activas activeConnections = prometheus.NewGauge( prometheus.GaugeOpts{ Name: "http_active_connections", Help: "Current number of active connections", }, ))
func init() { // Registramos las métricas en el registro de Prometheus prometheus.MustRegister(requestCounter) prometheus.MustRegister(requestDuration) prometheus.MustRegister(activeConnections)}
// middleware envuelve cada solicitud HTTP para recopilar métricasfunc metricsMiddleware(next http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { // Incrementamos el contador de conexiones activas activeConnections.Inc() defer activeConnections.Dec()
start := time.Now() next.ServeHTTP(w, r) duration := time.Since(start).Seconds()
// Registramos las métricas de la solicitud requestCounter.WithLabelVal