Monitoreo de aplicaciones Go: métricas y alertas a nivel avanzado
\nLas 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\n1. Recopilación avanzada de métricas en Go con Prometheus
\nLa 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.
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\nEn 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\n2. Configuración de alertas basadas en la lógica de negocio
\nLas 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):
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\nTenga en cuenta el uso