Monitoreo de aplicaciones Go: 3 herramientas para logging y tracing

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

¿Por qué su aplicación Go está en silencio y cómo solucionarlo?

\n

Escribió un microservicio perfecto en Go. Pasa todas las pruebas, arranca rápido y consume poca memoria. Lo despliega a producción y, una hora después, los usuarios se quejan de lentitud. Accede al servidor, mira la terminal vacía y se da cuenta: la aplicación está en silencio. Sin logs, sin métricas, sin entender qué salió mal.

\n

¿Le suena familiar? Bienvenido al mundo de la observabilidad de aplicaciones Go. Sin monitoreo y logging, su código es una caja negra. Hoy veremos cómo convertirlo en un sistema transparente, donde cada retraso y cada error sean visibles como en la palma de la mano.

\n

Le mostraré tres herramientas funcionales, ejemplos reales de código en Go y le daré una lista de verificación que salvará su producción. ¡Allá vamos!

\n\n

1. Logging estructurado: cómo dejar de escribir en la consola y empezar a vivir

\n

El ingenuo fmt.Println("Error:", err) es cosa del pasado. En el logging Go moderno se necesita orden: formato JSON, niveles (debug, info, warn, error), campos para búsqueda. Conozca al rey: la librería zap de Uber.

\n\n

¿Por qué zap?

\n
    \n
  • Velocidad: es de 10 a 100 veces más rápido que el log estándar bajo altas cargas.
  • \n
  • Estructura: agrega claves y valores, en lugar de concatenar cadenas.
  • \n
  • Flexibilidad: puede escribir en archivo, stdout, Elasticsearch, donde sea.
  • \n
\n\n

Instalación y ejemplo básico

\n
go get -u go.uber.org/zap
\n\n

Código de un logger simple:

\n
package main\n\nimport (\n    "go.uber.org/zap"\n)\n\nfunc main() {\n    logger, _ := zap.NewProduction()\n    defer logger.Sync() // vacía el buffer antes de salir\n\n    logger.Info("Servicio iniciado",\n        zap.String("env", "production"),\n        zap.Int("port", 8080),\n    )\n\n    // Ejemplo con error\n    err := someFunction()\n    if err != nil {\n        logger.Error("No se pudo ejecutar la operación",\n            zap.Error(err),\n            zap.String("module", "database"),\n        )\n    }\n}
\n\n

Como resultado obtiene un JSON limpio:

\n
{"level":"info","ts":1700000000.123,"msg":"Servicio iniciado","env":"production","port":8080}
\n\n

Ahora cualquier herramienta como Kibana o Grafana Loki podrá analizar estos logs por campos. ¿Quiere encontrar todos los errores en el módulo "database" de la última hora? Un clic.

\n\n

Consejo: no registre secretos ni PII

\n

Agregue una validación: si el campo contiene una contraseña o email, enmascárelo. Use zap.String("user", "***") para datos sensibles.

\n\n

2. Métricas y monitoreo: convertimos el código en un dashboard

\n

Los logs están bien, pero hablan del pasado. Las métricas son el pulso de su aplicación en tiempo real. Para el monitoreo de aplicaciones Go, el estándar de facto es Prometheus + su librería cliente.

\n\n

¿Qué medir?

\n
    \n
  • RPS (solicitudes por segundo) — carga del servicio.
  • \n
  • Latencia (p50, p95, p99) — tiempo de respuesta.
  • \n
  • Tasa de error — porcentaje de errores.
  • \n
  • Goroutines — fugas de gorutinas.
  • \n
  • Memoria / CPU — recursos.
  • \n
\n\n

Ejemplo: agregamos métricas al servidor HTTP

\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    requestCount = prometheus.NewCounterVec(\n        prometheus.CounterOpts{\n            Name: "http_requests_total",\n            Help: "Número total de solicitudes HTTP",\n        },\n        []string{"method", "endpoint", "status"},\n    )\n    requestDuration = prometheus.NewHistogramVec(\n        prometheus.HistogramOpts{\n            Name:    "http_request                

Blogs

Book Recommendations