Monitoreo de aplicaciones Go: métricas y alertas a nivel avanzado

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

Monitoreo de aplicaciones Go: métricas y alertas a nivel avanzado

\n

Las aplicaciones Go modernas requieren no solo un alto rendimiento, sino también un monitoreo confiable. La recopilación básica de métricas (CPU, memoria, solicitudes) es solo el primer paso. A nivel avanzado, es necesario implementar métricas personalizadas, configurar alertas basadas en la lógica de negocio y garantizar la tolerancia a fallos. En este artículo, veremos cómo implementar un monitoreo integral de aplicaciones Go con Prometheus, Grafana y alertas propias.

\n\n

1. Recopilación avanzada de métricas en Go con Prometheus

\n

La biblioteca prometheus/client_golang permite recopilar no solo métricas estándar, sino también personalizadas. Veamos un ejemplo de configuración de un recopilador de métricas personalizado para un servidor HTTP.

\n\n
package 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    requestDuration = prometheus.NewHistogramVec(\n        prometheus.HistogramOpts{\n            Name:    "http_request_duration_seconds",\n            Help:    "Tiempo de ejecución de las solicitudes HTTP.",\n            Buckets: prometheus.DefBuckets,\n        },\n        []string{"method", "path", "status"},\n    )\n    activeRequests = prometheus.NewGauge(\n        prometheus.GaugeOpts{\n            Name: "http_active_requests_total",\n            Help: "Número actual de solicitudes activas.",\n        },\n    )\n)\n\nfunc init() {\n    prometheus.MustRegister(requestDuration)\n    prometheus.MustRegister(activeRequests)\n}\n\nfunc metricsMiddleware(next http.Handler) http.Handler {\n    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {\n        activeRequests.Inc()\n        defer activeRequests.Dec()\n\n        timer := prometheus.NewTimer(prometheus.ObserverFunc(func(v float64) {\n            requestDuration.WithLabelValues(r.Method, r.URL.Path, "200").Observe(v)\n        }))\n        defer timer.ObserveDuration()\n\n        next.ServeHTTP(w, r)\n    })\n}\n\nfunc main() {\n    mux := http.NewServeMux()\n    mux.Handle("/metrics", promhttp.Handler())\n    mux.Handle("/api", metricsMiddleware(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {\n        w.Write([]byte("Hello, Go!"))\n    })))\n    http.ListenAndServe(":8080", mux)\n}
\n\n

En este ejemplo, creamos un histograma para la duración de las solicitudes y un gauge para las solicitudes activas. El uso de etiquetas (labels) permite detallar las métricas por métodos, rutas y estados.

\n\n

2. Configuración de alertas basadas en la lógica de negocio

\n

Las alertas no solo deben ser técnicas (alta carga de CPU), sino también de negocio. Por ejemplo, superar el tiempo de respuesta para un endpoint crítico o una caída en la cantidad de transacciones exitosas. Configuración de alertas en Prometheus (archivo alerts.yml):

\n\n
groups:\n  - name: go_app_alerts\n    rules:\n      - alert: HighRequestLatency\n        expr: http_request_duration_seconds{job="go-app"} > 1.0\n        for: 5m\n        labels:\n          severity: critical\n        annotations:\n          summary: "Alta latencia de solicitud ({{ $value }}s)"\n          description: "El endpoint {{ $labels.path }} tiene una latencia superior a 1 segundo durante 5 minutos."\n\n      - alert: ActiveRequestsSurge\n        expr: http_active_requests_total{job="go-app"} > 100\n        for: 2m\n        labels:\n          severity: warning\n        annotations:\n          summary: "Aumento de solicitudes activas ({{ $value }})"\n          description: "El número de solicitudes activas superó 100 durante 2 minutos."\n\n      - alert: ErrorRateHigh\n        expr: rate(http_requests_total{status=~"5.."}[5m]) > 0.1\n        for: 10m\n        labels:\n          severity: critical\n        annotations:\n          summary: "Alta tasa de errores 5xx"\n          description: "La tasa de errores supera el 10% en los últimos 10 minutos."
\n\n

Tenga en cuenta el uso

Blogs

Book Recommendations