Monitoreo de aplicaciones Go: métricas y alertas

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

Introducción: por qué el monitoreo es crítico para aplicaciones Go

Go (Golang) ha ganado popularidad en el desarrollo de microservicios de alta carga, API gateways y utilidades de red gracias a su rendimiento y simplicidad. Sin embargo, incluso la aplicación más estable puede enfrentar fugas de memoria, congelamiento de gorutinas o un aumento repentino de latencia. Aquí es donde el monitoreo —práctica clave de Site Reliability Engineering (SRE)— viene al rescate.

En este artículo analizaremos cómo configurar el monitoreo de aplicaciones Go con el stack Prometheus + Grafana, qué métricas recopilar primero y cómo configurar alertas para prevenir incidentes. El material será útil tanto para desarrolladores Go principiantes como para ingenieros experimentados que deseen mejorar la observabilidad de sus servicios.



1. Métricas principales de una aplicación Go

Antes de configurar el monitoreo, es importante entender qué métricas son vitales para un servicio Go. Se pueden dividir en tres categorías:



1.1. Métricas del runtime de Go

El runtime de Go proporciona información rica sobre el estado de la aplicación. Usando el paquete runtime y el exportador estándar expvar, se pueden obtener datos sobre:

  • Cantidad de gorutinas (runtime.NumGoroutine()) — un aumento brusco indica una fuga de gorutinas.
  • Uso de memoria (runtime.ReadMemStats()) — monitoree Alloc, HeapInuse y GCStats.
  • Tiempo de recolección de basura — si GC ocupa más del 5% del tiempo, es una señal para optimizar.
  • Cantidad de llamadas al sistema — puede indicar bloqueos.


1.2. Métricas de negocio

Para entender la salud del servicio, es necesario monitorear indicadores de negocio:

  • RPS (Requests Per Second) — cantidad de solicitudes por segundo.
  • Latencia (P50, P95, P99) — retrasos en el procesamiento de solicitudes.
  • Tasa de error — porcentaje de errores (5xx, 4xx).
  • Cantidad de conexiones activas (base de datos, APIs externas).


1.3. Métricas de infraestructura

No olvide las métricas del sistema: CPU, memoria, I/O de disco, paquetes de red. Ayudan a distinguir un problema de la aplicación de un problema del host.



2. Integración con Prometheus: exportación de métricas

Prometheus es el estándar de facto para la recopilación de métricas en el mundo Go. Veamos la integración paso a paso.



2.1. Instalación del cliente Prometheus para Go

Agregue la dependencia a su go.mod:

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


2.2. Creación de métricas personalizadas

Ejemplo de creación de un contador de solicitudes y un histograma para el tiempo de respuesta:

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", "status"}, ) 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) prometheus.MustRegister(requestDuration)}

func metricsMiddleware(next http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { start := time.Now() wrapped := &responseWriter{ResponseWriter: w, statusCode: http.Stat

Blogs

Book Recommendations