Monitoreo de aplicaciones Go (Golang): bibliotecas y herramientas

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 (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=30

Esto 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

Recommendations