Métricas de Prometheus en Go (Golang): guía completa
Prometheus es un potente sistema de monitoreo y alerta de código abierto que se ha convertido en el estándar de facto en el mundo de las aplicaciones en la nube. Para el lenguaje Go (Golang), existe el cliente oficial prometheus/client_golang, que permite agregar métricas fácilmente a su aplicación. En este artículo, analizaremos en detalle cómo instalar la biblioteca, crear los tipos principales de métricas (counter, gauge, histogram) y exportarlas a través de HTTP.
1. Instalación de la biblioteca
Para trabajar con Prometheus en Go, es necesario instalar el paquete prometheus/client_golang. Ejecute el comando:
go get github.com/prometheus/client_golang/prometheusgo get github.com/prometheus/client_golang/prometheus/promhttpEl primer paquete contiene los tipos principales de métricas, el segundo contiene el manejador HTTP para exportar métricas en el formato que entiende el servidor Prometheus.
2. Tipos principales de métricas
Prometheus admite cuatro tipos principales de métricas. Veamos los tres más populares:
- Counter — un contador que solo aumenta (por ejemplo, el número de solicitudes).
- Gauge — un valor que puede tanto aumentar como disminuir (por ejemplo, el número de conexiones activas).
- Histogram — un histograma que mide la distribución de valores (por ejemplo, el tiempo de respuesta).
3. Ejemplo: Counter (contador de solicitudes)
Creemos un servidor HTTP simple que cuente el número de solicitudes procesadas:
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)}En este ejemplo:
prometheus.NewCountercrea un contador con el nombrehttp_requests_total.prometheus.MustRegisterregistra la métrica en el registro global.requestsTotal.Inc()incrementa el contador en 1 en cada solicitud.promhttp.Handler()exporta todas las métricas registradas en la ruta/metrics.
4. Ejemplo: Gauge (conexiones activas)
Gauge es ideal para rastrear el estado actual, por ejemplo, el número de gorutinas activas:
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() // ... resto del código}Aquí, Set() establece el valor actual, mientras que Inc() y Dec() permiten aumentar o disminuir el gauge en uno.
5. Ejemplo: Histogram (tiempo de respuesta)
Histogram recopila observaciones y las distribuye en segmentos (buckets) configurables:
var ( requestDuration = prometheus.NewHistogram( prometheus.HistogramOpts{ Name: "http_request_duration_seconds", Help: "Histogr