Monitoreo de aplicaciones Go: métricas y alertas de la A a la Z
\n\nEn el desarrollo de software moderno, el monitoreo no es un lujo, sino una necesidad. Para aplicaciones en Go (Golang), que a menudo se utilizan en microservicios de alta carga y proyectos de infraestructura, un monitoreo bien configurado permite detectar problemas a tiempo, optimizar el rendimiento y garantizar un funcionamiento estable. En este artículo, analizaremos cómo configurar el monitoreo de aplicaciones Go desde cero: desde la recolección de métricas básicas hasta la configuración de alertas y la visualización en Grafana.
\n\n¿Por qué es importante el monitoreo para las aplicaciones Go?
\n\nGo es un lenguaje compilado con soporte integrado para concurrencia. Las aplicaciones en Go a menudo funcionan en sistemas críticos: desde puertas de enlace API hasta bases de datos. Sin monitoreo, corres el riesgo de:
\n- \n
- Pasar por alto una fuga de memoria o de gorutinas \n
- No notar la degradación del rendimiento \n
- Perder datos debido a errores no manejados \n
- Sufrir tiempos de inactividad por falta de recursos \n
Un monitoreo adecuado te brinda una imagen completa de la salud de la aplicación: desde el uso de CPU y memoria hasta el tiempo de respuesta y la tasa de errores.
\n\nMétricas principales para monitorear Go
\n\nAntes de pasar a las herramientas, definamos qué métricas son críticas para las aplicaciones Go:
\n\nMétricas del sistema
\n- \n
- CPU usage — uso de la CPU \n
- Memory usage — consumo de memoria (incluyendo heap y stack) \n
- Goroutines count — cantidad de gorutinas activas \n
- GC stats — estadísticas del recolector de basura (tiempo, número de ciclos) \n
- Open file descriptors — cantidad de descriptores de archivo abiertos \n
Métricas de negocio
\n- \n
- Request latency — tiempo de respuesta (p50, p95, p99) \n
- Request rate — cantidad de solicitudes por segundo \n
- Error rate — porcentaje de errores \n
- Database connection pool — estado del pool de conexiones \n
Herramientas para monitorear Go
\n\nEl stack estándar para el monitoreo de aplicaciones Go incluye:
\n- \n
- Prometheus — sistema de recolección y almacenamiento de métricas \n
- Grafana — visualización y paneles \n
- Alertmanager — gestión de alertas \n
- Bibliotecas cliente Go — para exportar métricas \n
Configuración de la recolección de métricas en Go con Prometheus
\n\nComencemos con la práctica. Para exportar métricas desde una aplicación Go, usaremos la biblioteca oficial prometheus/client_golang.
Paso 1: Instalación de dependencias
\ngo get github.com/prometheus/client_golang/prometheus\ngo get github.com/prometheus/client_golang/prometheus/promhttp\n\nPaso 2: Servidor HTTP básico con métricas
\n\npackage main\n\nimport (\n "net/http"\n "github.com/prometheus/client_golang/prometheus"\n "github.com/prometheus/client_golang/prometheus/promhttp"\n)\n\nvar (\n httpRequestsTotal = prometheus.NewCounterVec(\n prometheus.CounterOpts{\n Name: "http_requests_total",\n Help: "Total number of HTTP requests",\n },\n []string{"method", "endpoint", "status"},\n )\n\n httpRequestDuration = prometheus.NewHistogramVec(\n prometheus.HistogramOpts{\n Name: "http_request_duration_seconds",\n Help: "Histogram of HTTP request durations",\n Buckets: prometheus.DefBuckets,\n },\n []string{"method", "endpoint"},\n )\n)\n\nfunc init() {\n prometheus.MustRegister(httpRequestsTotal)\n prometheus.MustRegister(httpRequestDuration)\n}\n\nfunc main() {\n http.Handle("/metrics", promhttp.Handler())\n \n http.HandleFunc("/api/users", func(w http.ResponseWrit