Observabilidad en Go: trazado, métricas y registros para profesionales

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

Tu aplicación funciona, pero ¿estás seguro de que sabes lo que hay dentro?

\n\n

Imagina: lanzaste un microservicio en Go a producción. No falla, no da errores 500, pero los usuarios se quejan de que la página carga «como que lento». Revisas el monitoreo — CPU al 30%, memoria normal. ¿Qué hacer? Sin observabilidad en Go eres un capitán de barco sin mapa ni brújula.

\n\n

Observabilidad no es solo «registros». Son tres pilares: trazado, métricas y registros. Juntos te dan un superpoder: entender lo que sucede en el sistema, incluso si no esperabas un problema. En este artículo analizaremos cada uno de estos aspectos con ejemplos de código en Go. No solo leerás teoría — obtendrás recetas listas que puedes implementar hoy mismo.

\n\n

¿Por qué Go es el lenguaje ideal para la observabilidad?

\n\n

Go fue creado para sistemas backend donde el rendimiento y la confiabilidad son importantes. La biblioteca estándar (net/http, database/sql) ya sabe entregar métricas y soportar contextos para trazado. Y el ecosistema de OpenTelemetry Go y Prometheus Go hace que implementar observabilidad sea simple y elegante.

\n\n

Pero lo principal — en Go no hay «magia». Escribes código que se puede medir, trazar y registrar sin dolor. Veamos cómo se hace.

\n\n

Trazado en Go: OpenTelemetry en acción

\n\n

Trazado es la historia de una solicitud desde que entra al sistema hasta que sale. Muestra cuánto tiempo tomó cada paso: consulta a la BD, llamada a una API externa, procesamiento de datos. En Go, el trazado se basa en contextos (context.Context).

\n\n

Configuración del SDK de OpenTelemetry

\n\n

Instalemos los paquetes:

\n
go get go.opentelemetry.io/otel \\\n  go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp \\\n  go.opentelemetry.io/otel/sdk/trace
\n\n

Ahora inicializamos el trazador:

\n\n
package main\n\nimport (\n    "context"\n    "log"\n    "go.opentelemetry.io/otel"\n    "go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp"\n    "go.opentelemetry.io/otel/sdk/trace"\n)\n\nfunc initTracer() {\n    exporter, err := otlptracehttp.New(context.Background())\n    if err != nil {\n        log.Fatal(err)\n    }\n\n    tp := trace.NewTracerProvider(\n        trace.WithBatcher(exporter),\n        trace.WithSampler(trace.AlwaysSample()),\n    )\n    otel.SetTracerProvider(tp)\n}
\n\n

Creando un span en el manejador HTTP

\n\n

Así se ve el trazado en código real:

\n\n
func userHandler(w http.ResponseWriter, r *http.Request) {\n    tracer := otel.Tracer("user-service")\n    ctx, span := tracer.Start(r.Context(), "getUser")\n    defer span.End()\n\n    // Simulación de consulta a BD\n    user, err := getUserFromDB(ctx, r.URL.Query().Get("id"))\n    if err != nil {\n        span.RecordError(err)\n        span.SetStatus(codes.Error, err.Error())\n        http.Error(w, err.Error(), 500)\n        return\n    }\n\n    span.SetAttributes(\n        attribute.String("user.id", user.ID),\n        attribute.Int64("user.age", int64(user.Age)),\n    )\n\n    // Span anidado para llamada externa\n    _, childSpan := tracer.Start(ctx, "callAnalyticsAPI")\n    defer childSpan.End()\n\n    callAnalyticsAPI(user)\n    \n    w.Write([]byte("OK"))\n}
\n\n

Cada span contiene nombre, hora de inicio y fin, atributos y estado. En Jaeger o Grafana Tempo verás el mapa completo de la solicitud.

\n\n

Consejo práctico

\n

No olvides pasar el contexto a través de toda la aplicación. En Go esto se hace automáticamente si usas context.Context en las firmas de funciones. OpenTelemetry Go tomará el contexto de la solicitud HTTP por sí mismo si usas middleware.

\n\n

Métricas: Prometheus y exportación en Go

\n\n

Métricas son números que hablan del estado del sistema: RPS, latencia, cantidad de errores, uso

Blogs

Book Recommendations