Monitoreo de aplicaciones Go (Golang): desde métricas hasta perfilado
Go (Golang) es un lenguaje creado para aplicaciones de servidor de alta carga. Sin embargo, incluso el código más eficiente puede presentar fallos, fugas de memoria o una latencia excesivamente alta. Sin monitoreo, corres el riesgo de enterarte del problema solo por los usuarios enfadados. En este artículo analizaremos las bibliotecas y herramientas clave para el monitoreo de aplicaciones Go: desde la recopilación de métricas hasta el trazado y el perfilado.
¿Por qué monitorear una aplicación Go?
- Rendimiento: rastrear el tiempo de respuesta, la cantidad de gorutinas, el uso de CPU y memoria.
- Confiabilidad: controlar errores, pánicos, cantidad de reinicios.
- Escalabilidad: entender cuándo es necesario agregar réplicas.
- Métricas de negocio: cantidad de solicitudes, usuarios activos, volumen de datos procesados.
1. Paquete integrado expvar
La forma más sencilla es expvar. Proporciona un endpoint HTTP con métricas básicas: cantidad de gorutinas, uso de memoria, tiempo de actividad. Es adecuado para un inicio rápido.
package main
import ( "expvar" "net/http")
var requestCount = expvar.NewInt("requests_total")
func handler(w http.ResponseWriter, r *http.Request) { requestCount.Add(1) w.Write([]byte("Hello, Go!"))}
func main() { http.HandleFunc("/", handler) // Métricas disponibles en la dirección /debug/vars http.ListenAndServe(":8080", nil)}Ejecuta la aplicación y abre http://localhost:8080/debug/vars — verás un JSON con las métricas.
2. Prometheus + prometheus/client_golang
Prometheus es el estándar de facto para la recopilación de métricas en Go. La biblioteca prometheus/client_golang permite registrar métricas personalizadas: contadores, histogramas, resúmenes.
package main
import ( "net/http" "github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus/promhttp")
var ( httpRequests = prometheus.NewCounterVec( prometheus.CounterOpts{ Name: "http_requests_total", Help: "Total number of HTTP requests.", }, []string{"method", "path"}, ))
func init() { prometheus.MustRegister(httpRequests)}
func handler(w http.ResponseWriter, r *http.Request) { httpRequests.WithLabelValues(r.Method, r.URL.Path).Inc() w.Write([]byte("OK"))}
func main() { http.HandleFunc("/", handler) http.Handle("/metrics", promhttp.Handler()) http.ListenAndServe(":8080", nil)}El endpoint /metrics entrega datos en el formato que entiende Prometheus. Luego se pueden configurar paneles en Grafana.
3. Perfilado con pprof
El paquete net/http/pprof agrega endpoints para perfilado: CPU, memoria, bloqueos, gorutinas. Es una herramienta indispensable para encontrar cuellos de botella.
package main
import ( "net/http" _ "net/http/pprof" // conectamos el perfilador)
func main() { http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { w.Write([]byte("Perfilado activo")) }) http.ListenAndServe(":6060", nil)}Ahora puedes ejecutar:
go tool pprof http://localhost:6060/debug/pprof/profile?seconds=30Esto recopilará un perfil de CPU de 30 segundos. Analízalo en modo interactivo o expórtalo a SVG/PDF.
4. OpenTelemetry — trazado y métricas
OpenTelemetry (OTel) es el estándar moderno para la observabilidad. Unifica métricas, registros y trazas. Para Go existe el SDK oficial go.opentelemetry.io/otel.
package main
import ( "context" "log" "net/http" "go.opentelemetry.io También en la biblioteca
Caché en C++: Redis, memcached, LevelDB y otras herramientas
Cliente Redis para PHP: Predis — instalación, conexión, ejemplos
ORM para Swift (iOS/macOS): comparación y ejemplos de uso
Psr/Log PHP: guía completa con ejemplos prácticos
Procesamiento de Markdown en C# (.NET): bibliotecas y herramientas