6 puntos por 0546530408 2023-08-17 | 1 comentarios | Compartir por WhatsApp

Hola. Somos Eden y Ari, cofundadores de Odigos (https://github.com/keyval-dev/odigos). Odigos es un proyecto open source que genera trazas distribuidas (distributed trace) de forma inmediata para las aplicaciones, para que los usuarios puedan aprovecharlas fácilmente. Odigos es compatible con las herramientas de monitoreo existentes y no requiere cambios en el código fuente.

Nuestra experiencia con las herramientas de monitoreo tradicionales no fue muy satisfactoria. Mientras monitoreábamos sistemas distribuidos con varios microservicios, nos dimos cuenta de que estábamos gastando demasiado tiempo identificando qué microservicio era realmente la causa del problema. Por ejemplo, alguna vez pasamos horas depurando una aplicación porque sospechábamos que estaba causando latencia, y solo después descubrimos que la causa real estaba en otra aplicación relacionada.

Después de eso, investigamos el trazado distribuido (distributed tracing) como una forma adecuada de resolver este tipo de problemas. A diferencia de las métricas o logs, que capturan datos en un momento específico dentro de una sola aplicación, el trazado distribuido etiqueta cada solicitud con un ID único para poder seguir su recorrido a través de un entorno distribuido. Esto permite a los desarrolladores entender el contexto (context) de cada solicitud y cómo se comportan las aplicaciones distribuidas.

Sin embargo, este enfoque tiene la desventaja de ser difícil de implementar. A diferencia de las métricas o logs para una sola aplicación, el trazado distribuido debe implementarse en múltiples aplicaciones para que funcione correctamente. Si хотя sea una sola aplicación no genera trazas distribuidas, la propagación del contexto se interrumpe y el valor de esa traza cae considerablemente.

Según nuestra experiencia implementando trazado distribuido manualmente para varias empresas, coordinar a todos los equipos de desarrollo para instrumentar cada aplicación y así lograr una trazabilidad completa es extremadamente difícil. Cuando la implementación quedaba completa, el valor era muy alto porque los problemas en producción podían resolverse mucho más rápido. Pero una implementación parcial no resultaba tan útil.

Entonces empezamos a automatizar este proceso. Ya sabíamos cómo resolver la mayor parte del flujo, pero la parte más complicada era cómo instrumentar automáticamente programas escritos en lenguajes compilados (como Go). Pensamos que, si lográbamos automatizar solo esa parte, podríamos automatizar por completo el proceso de generación de trazas distribuidas. Durante la investigación descubrimos que, usando eBPF (una tecnología que permite al kernel de Linux cargar programas externos y ejecutarlos dentro del kernel), era posible automatizar la instrumentación de lenguajes compilados. Esa era la última pieza del rompecabezas, y con ella pudimos desarrollar Odigos.

Odigos primero escanea todas las aplicaciones en ejecución y, usando eBPF y OpenTelemetry, detecta el lenguaje de programación de cada una para instrumentarla automáticamente según corresponda. También despliega collectors que almacenan temporalmente, filtran y envían los datos a la herramienta de monitoreo elegida, y además hacen autoescalado (auto scale) según el volumen de tráfico. Gracias a esta automatización, los desarrolladores pueden aprovechar el trazado distribuido en cuestión de minutos, a diferencia del trabajo manual que podría tomar meses de implementación.

La instrumentación automática entre distintos lenguajes de programación no es una tarea simple, especialmente si se consideran binarios estáticos (por ejemplo, los generados por el compilador de Go). Introdujimos varios mecanismos para insertar headers relacionados de forma segura y estable, y desarrollamos un sistema para rastrear funciones y structs de bibliotecas open source en distintas versiones. También desarrollamos un sistema para realizar gestión de memoria en espacio de usuario (userspace) desde eBPF. Como resultado, Odigos se convirtió en la única solución capaz de generar automáticamente trazas distribuidas para lenguajes compilados como Go y Rust. Mientras que otras soluciones requieren que el usuario sea experto en OpenTelemetry o eBPF, nuestra solución no exige conocimientos previos sobre tecnologías de observabilidad (observability).

Nuestra solución puede instalarse en un clúster de Kubernetes con un solo comando. Una vez instalada, detecta el lenguaje de programación de todas las aplicaciones en ejecución y aplica el instrumentador adecuado. Para lenguajes JIT (Java y .NET) o interpretados (JavaScript y Python), despliega instrumentadores de OpenTelemetry. Para lenguajes compilados (Go, Rust, C), despliega instrumentadores basados en eBPF. Todo esto está abstraído para el usuario, así que solo necesita (1) seleccionar algunas o todas las aplicaciones objetivo y (2) elegir el backend al que enviará los datos de monitoreo.

En mayo de 2022 lanzamos nuestro primer proyecto open source: un instrumentador automático para aplicaciones Go basado en eBPF. Después donamos ese proyecto a la comunidad de OpenTelemetry, y actualmente se desarrolla como parte del Go Automatic Instrumentation SIG.

Creemos firmemente en los estándares abiertos, por lo que tanto la instrumentación como los collectors que usa Odigos se basan en proyectos open source desarrollados por la comunidad de OpenTelemetry. Gracias a esto, evitamos depender de un vendor específico.

Actualmente estamos enfocados en construir el proyecto open source. Todavía no hay precios definidos ni funciones de pago, pero en el futuro planeamos ofrecer también una versión administrada de Odigos con funciones empresariales.

Pueden encontrar más información aquí abajo.

¡Nos gustaría conocer y compartir sus experiencias e historias sobre trazado y monitoreo de aplicaciones distribuidas!

1 comentarios

 
0546530408 2023-08-17

Hola, es la primera vez que publicamos aquí. Nos gustaría recibir comentarios de la comunidad. Siéntanse libres de unirse al canal de Slack.
https://join.slack.com/t/odigos/…
¡Gracias!