Cómo agregar monitoreo a un proyecto Go sin cambios en el código
Piensa en cuántas veces has postergado implementar tracing completo en un proyecto simplemente porque era demasiado tedioso pasar contextos a través de cada método. O peor, cuando necesitabas trazar una ruta de solicitud dentro de una biblioteca de terceros cuyo código fuente no controlas. Por lo general, en estos casos, tenías que reescribir la mitad de la lógica de negocio para adaptarla a la API de OpenTelemetry, o aceptar "puntos ciegos" en tu monitoreo.
El equipo de OpenTelemetry parece haber encontrado una forma de eliminar este trabajo tedioso. El repositorio opentelemetry-go-compile-instrumentation ofrece una herramienta que inyecta telemetría directamente durante el proceso de compilación de la aplicación.
¿En qué consiste esta magia
El proyecto es una utilidad otelc. Funciona como una capa sobre el compilador estándar de Go. En lugar de que tú importes manualmente las bibliotecas de OpenTelemetry y coloques spans, la herramienta hace esto por ti en tiempo de compilación. Encuentra los lugares correctos en tu código y sus dependencias, y luego inserta las llamadas necesarias.
Esto no es solo "automatización"—es un cambio de paradigma. Escribes código limpio enfocado en tareas de negocio, y la observabilidad se convierte en una capa de infraestructura que se superpone.
¿Para qué es útil esto en la práctica
Lo principal aquí es la ausencia total de cambios en el código fuente. Si mañana decides cambiar de proveedor de monitoreo o abandonar el tracing por completo, no necesitarás limpiar cientos de importaciones en todo el proyecto.
Capacidades interesantes de la herramienta:
- Trabajo con bibliotecas de terceros. Puedes obtener trazas desde las profundidades del código de otra persona que está conectado a través de go.mod.
- Sin sobrecarga en tiempo de ejecución. Dado que el código se inyecta en tiempo de compilación, el programa no necesita gastar recursos en análisis dinámico o reflexión durante la ejecución.
- Integración flexible. La herramienta se conecta fácilmente a pipelines de CI/CD. Esencialmente, solo cambias el comando de compilación.
Cómo funciona internamente
La herramienta modifica el proceso de compilación. En lugar del familiar go build usas otelc go build. Entre bastidores, la utilidad analiza el árbol de sintaxis abstracta (AST) de tu código y sus dependencias. Basándose en reglas predefinidas (Instrumentation Rules), inyecta los fragmentos de código necesarios.
El repositorio contiene guías de arquitectura detalladas. Si te interesa saber exactamente cómo funciona la sustitución de llamadas y cómo describir reglas para nuevas bibliotecas, échale un vistazo a la carpeta docs/. Todo está documentado allí: desde el diseño de la API hasta las convenciones semánticas.
Por dónde empezar
Primero, necesitas compilar la herramienta tú mismo. Este es un procedimiento estándar para proyectos Go:
git clone https://github.com/open-telemetry/opentelemetry-go-compile-instrumentation.git
cd opentelemetry-go-compile-instrumentation
make build
Después de eso, tendrás el binario otelc. Para probarlo en acción, puedes ejecutar la aplicación de demostración del repositorio. Todo el proceso se reduce a un comando:
cd demo/app/basic
../../otelc go build
./basic
Si todo salió bien, tu aplicación comenzará a generar datos de telemetría, aunque no encontrarás una sola mención de OpenTelemetry en su código fuente.
Quién se beneficiará de esto
El proyecto parece una excelente herramienta para quienes mantienen sistemas heredados o monolitos enormes donde la implementación manual de tracing tomaría meses. También es un salvavidas para equipos que quieren mantener su código "estéril" de dependencias de infraestructura.
Sin embargo, vale la pena considerar que el proyecto requiere entender cómo funcionan las reglas de instrumentación. Si necesitas algo específico que no esté cubierto por las reglas estándar, tendrás que profundizar en configuraciones YAML y posiblemente escribir tus propios hooks.
Definitivamente vale la pena probar la herramienta si estás cansado del código repetitivo alrededor de contextos y spans. Este es un paso hacia lo que debería ser la experiencia del desarrollador moderno: cosas complejas como la observabilidad funcionan "de fábrica" y no estorban al escribir código.
Proyectos relacionados