¿Por qué su aplicación Go está en silencio y cómo solucionarlo?
\nEscribió 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.
\nLe 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\n1. Logging estructurado: cómo dejar de escribir en la consola y empezar a vivir
\nEl 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.
¿Por qué zap?
\n- \n
- Velocidad: es de 10 a 100 veces más rápido que el
logestá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
Instalación y ejemplo básico
\ngo get -u go.uber.org/zap\n\nCódigo de un logger simple:
\npackage 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\nComo resultado obtiene un JSON limpio:
\n{"level":"info","ts":1700000000.123,"msg":"Servicio iniciado","env":"production","port":8080}\n\nAhora 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\nConsejo: no registre secretos ni PII
\nAgregue una validación: si el campo contiene una contraseña o email, enmascárelo. Use zap.String("user", "***") para datos sensibles.
2. Métricas y monitoreo: convertimos el código en un dashboard
\nLos 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
Ejemplo: agregamos métricas al servidor HTTP
\npackage 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