OpenTelemetry en 2023
(bit.kevinslin.com)- OpenTelemetry, que nació en 2019 de la fusión de OpenTracing y OpenCensus, en solo 4 años se consolidó como un estándar de observabilidad que abarca trazas, métricas y logs
- Su estructura central se divide en especificación e implementaciones, y ofrece tanto los criterios de compatibilidad entre vendors como las herramientas reales de instrumentación y recolección
- La especificación de OTEL estabilizó tracing en 2020, métricas en 2021 y logs en 2023, con lo que todas las señales están ahora en estado stable, aunque el soporte de logs todavía varía según el SDK
- OTLP y Collector son la base para enviar y procesar datos de observabilidad en un formato común, y agentes de vendors como Grafana y Datadog también lo implementan
- OTEL amplía su alcance con Collector, Semantic Conventions, OpAMP, OTTL e incluso Demo, y sigue expandiéndose como la base común de la observabilidad neutral frente a vendors
La posición actual de OpenTelemetry
- OpenTelemetry, o OTEL, comenzó en 2019 con la unión de OpenTracing y OpenCensus
- Al principio era un proyecto centrado en tracing, pero después de la fusión su alcance se amplió a toda la observabilidad
- Su objetivo es ayudar a las organizaciones a ofrecer telemetría de alta calidad, universal y portable
- Tras 4 años, OTEL ya cuenta con las siguientes bases
- estándares estables para métricas, logs y trazas
- un Collector capaz de recibir, procesar y exportar telemetría en cualquier entorno
- SDKs que permiten instrumentar código en los principales lenguajes
- estándares adicionales relacionados con Semantic Conventions y la gestión de agentes
- Actualmente, OTEL es el proyecto más activo de la CNCF después de Kubernetes, con contribuidores repartidos entre los principales vendors de observabilidad y un protocolo ya adoptado casi de forma universal entre los proveedores de observabilidad
La estructura de OTEL: especificación e implementaciones
- OTEL se compone principalmente de especificación (specification) e implementaciones (implementation)
- La especificación define cómo capturar, recolectar, procesar y exportar telemetría
- Es, en la práctica, un estándar común que los vendors deben seguir para ser compatibles con OTEL
- Las implementaciones son las librerías cliente y herramientas que manejan los datos de telemetría
- Es la parte con la que el usuario final interactúa directamente al instrumentar su código
- La estabilidad del proyecto normalmente se indica por señal
- En OTEL, una señal se refiere a tipos de datos de telemetría como métricas, logs y trazas
- Los principales subproyectos son los siguientes
- OpenTelemetry Specification
- OpenTelemetry SDKs
- OpenTelemetry Protocol
- OpenTelemetry Collector
- Open Agent Management Protocol
- OpenTelemetry Semantic Conventions
OpenTelemetry Specification 1.24.0
- OpenTelemetry Specification es la base de OTEL y proporciona la API, el SDK y el modelo de datos sobre los que se construyen los demás estándares de OTEL
- La estabilización avanzó por señal
- septiembre de 2020: tracing stable
- noviembre de 2021: métricas stable
- abril de 2023: logs stable
- Actualmente, la especificación de OTEL está en estado stable para todas las señales
- Como la señal de logs recién se estabilizó en 2023, muchos SDKs de OTEL todavía no la soportan
OpenTelemetry SDK y auto instrumentación
- El OTEL SDK ofrece instrumentación del lado cliente basada en la especificación de OTEL
- Cada SDK por lenguaje tiene un nivel de madurez distinto según la señal: métricas, logs o trazas
- Algunos SDKs admiten auto instrumentación (auto instrumentation) dependiendo del lenguaje de programación
- La auto instrumentación consiste en que el SDK inserta automáticamente señales en el código de la aplicación, sobre todo trazas, reduciendo así la carga de la instrumentación manual
- En lenguajes compilados como
goyrust, la auto instrumentación no funciona - Aun así, fuera del SDK se puede obtener inyección automática de trazas usando herramientas basadas en eBPF o service mesh
OTLP 1.0 y el estándar de transporte de datos
- OTLP es un protocolo wire común para transportar datos de observabilidad
- Hay dos métodos oficiales de transporte
- HTTP y Protocol Buffers
- gRPC
- Esta especificación se considera stable y puede implementarse en cualquier servicio que reciba, procese y exporte datos de OTEL
- OTLP es implementado por OpenTelemetry Collector, y también por agentes de vendors de observabilidad como Grafana y Datadog
OpenTelemetry Collector 0.83.0
- OTEL Collector es un agente neutral frente a vendors para recolectar, transformar y enviar datos de observabilidad
- Collector está compuesto por los siguientes componentes
- receivers: reciben datos desde múltiples fuentes mediante push/pull
- processors: transforman, filtran, enriquecen y derivan los datos en tránsito
- exporters: envían los datos a destinos downstream
- connectors: actúan tanto como receiver como exporter y enlazan varios pipelines
- pipelines: cadenas compuestas por receiver, cero o más processor y exporter
- extensions: proporcionan funciones ajenas al procesamiento de telemetría, como basic auth o health check
- En conjunto, estos componentes funcionan como un pipeline de observabilidad que permite recolectar telemetría desde cualquier fuente, procesarla en tránsito y enviarla al destino deseado
- Collector se divide en dos proyectos
- otel-collector: incluye solo los componentes centrales de Collector y contiene principalmente la lógica directamente relacionada con el procesamiento de datos OTLP
- otel-collector-contrib: es un paquete de integraciones que incluye exporters y receivers para la mayoría de los proveedores de observabilidad
- Al momento de escribir esto,
otel-collector-contribincluye 91 receivers, 48 exporters y 24 processors - Se recomienda que los usuarios finales usen OpenTelemetry Collector Builder para crear una build personalizada de
otel-collector-contribcon solo los componentes necesarios - Vendors como AWS y Splunk también ofrecen sus propias distribuciones de OTEL
OpAMP y la gestión remota de agentes
- OpAMP es un protocolo de red para la gestión remota de agentes
- Es un estándar relativamente nuevo, añadido a OTEL en 2022, que ofrece una forma neutral frente a vendors de controlar un conjunto de agentes
- Lo que se administra puede ser una instancia de
otel-collectoro un agente propietario de algún vendor que implemente OpAMP - Con OpAMP se pueden habilitar las siguientes funciones
- despliegue dinámico de configuración
- actualización de agentes
- gestión de credenciales
- Actualmente, la implementación en Go de la especificación OpAMP está en desarrollo
Semantic Conventions y proyectos adicionales
- OTEL Semantic Conventions define un conjunto común de atributos usados en los datos de observabilidad
- Su alcance incluye recursos cloud, bases de datos, excepciones y sistemas
- Semantic Conventions es usado por los SDKs de OTEL, y en los SDKs con soporte de auto instrumentación se aplica automáticamente
- Una semántica común permite correlacionar señales distintas entre sí
- También existen otros componentes importantes dentro de OTEL
- OpenTelemetry Transformation Language (OTTL): un lenguaje común de transformación para telemetría, diseñado e implementado en
otel-collector-contribcon foco en rendimiento y flexibilidad - OTEL Demo: un sitio de compras basado en microservicios que muestra las capacidades de OTEL y de la mayoría de sus SDKs por lenguaje
- OpenTelemetry Transformation Language (OTTL): un lenguaje común de transformación para telemetría, diseñado e implementado en
4 años de cambios
- OTEL nació de la fusión de especificaciones de tracing que competían entre sí y evolucionó hasta convertirse en un estándar de la industria para observabilidad
- Los últimos 4 años fueron el período en el que se construyó una base común entre vendors y herramientas
1 comentarios
Opiniones en Hacker News
OpenTelemetry tiene dos problemas
De forma similar, quería implementar un heartbeat sencillo para entender el uso en una app de escritorio, pero, considerando el nombre del proyecto, sorprendentemente era casi imposible. Hubo poca respuesta a las preguntas, así que abandoné por completo el plan de usar OpenTelemetry: https://github.com/open-telemetry/community/discussions/1598, https://github.com/open-telemetry/semantic-conventions/issue...
Por ejemplo, no se pueden definir buckets cerca del lugar donde se define un histograma. Hay que pasar a algún lugar como un exporter global una lista de “overrides” que mapean nombres de histogramas a buckets. Si hay una biblioteca que emite métricas, se vuelve muy desordenado: https://github.com/open-telemetry/opentelemetry-go/issues/38...
Incluso al mirar los sitios web de las principales empresas de observabilidad, los textos sobre instrumentación personalizada ocupan unas 4 páginas y solo cubren cosas muy básicas. OTel no está particularmente atrasado; la respuesta suele ser, en general, “depende”. Con más experiencia, estas partes que confunden a los principiantes también se pueden ir resolviendo
Me gusta mucho OpenTelemetry y quiero rastrear casi todos los spans. Si hubiera usado algún vendor, habría quebrado por los costos
Con instrumentación automática de Java incorporé OpenTelemetry casi sin esfuerzo, y lo envío a ClickHouse autohospedado, donde almaceno más de 700 millones de spans al día en una EC2 de 100 dólares: https://clickhouse.com/blog/how-we-used-clickhouse-to-store-...
Con una retención de 1 mes de trazas,
signoz_index_v2tiene 26.9 millones de filas y 17.06 GiB,trace_logtiene 123 millones de filas y 2.64 GiB, ysamples_v2tiene 949 millones de filas y 345 MiB, así que la compresión es buena. Si hubiera usado una máquina ClickHouse con las especificaciones recomendadas, habría reducido el tiempo de tuning, pero aun así funciona bienLa desventaja es que las IOPS del disco sc1 pequeño rondan 4, por lo que ClickHouse tarda unos 5 minutos en iniciar, y aunque la UI de SigNoz tiene funciones suficientes, es difícil esperar el nivel de pulido de Datadog
En un trabajo anterior solo recolectábamos el 5% de las trazas que no eran errores
OpenTelemetry me decepcionó bastante. En mi experiencia, es un amasijo confuso y sobrediseñado, y la experiencia de uso básica es muy hostil para el usuario.
Se promociona a sí mismo como un formato universal de tracing/métricas/logs y como un conjunto de librerías plug-and-play con adaptadores para todo lo necesario, pero en la práctica se parece más a un conjunto de librerías a medio hacer, con muchas filtraciones de la implementación interna, adaptadores de mala calidad y no tantas funcionalidades.
Muchas funciones vienen con pistas del tipo cuándo, dónde, cuánto, en qué fase de la luna, cuando Júpiter sea visible en el cielo y con qué longitud de string funcionan.
Aun así, si se ignoran las APIs del SDK con abstracciones que se filtran y las funcionalidades implementadas a medias, cumple en cierta medida la promesa de intercambiabilidad. Antes de OTel todo era un stack propietario, pero ahora puedes esperar conectar otro backend de logging a un SDK estándar y que, en general, funcione. Es peor que un stack verticalmente integrado, pero desde el punto de vista de arquitectura es una victoria parcial, porque permite competencia y evolución por partes sin tener que rehacer todo el stack de observabilidad.
El ejemplo solo muestra cómo parsear con herramientas de swagger la especificación OpenAPI (https://github.com/openzipkin/zipkin-api/blob/master/zipkin2...), generar automáticamente código pegamento en Go y luego llamar a una función autogenerada para registrar traces.
No había documentación ni otros ejemplos en absoluto, así que terminé preguntándome si alguien usaba realmente este enfoque, y al final usé directamente la API del servicio (https://zipkin.io/zipkin-api/#/) mediante llamadas REST. OTel es doloroso, pero las alternativas no son mejores. Dado que medir SLO y SLI se está volviendo cada vez más importante, ojalá esta área reciba más atención.
Las librerías oficiales de OTel todavía no funcionan bien en el frontend web. Por ejemplo, en el estado predeterminado no hay forma de vincular errores con sourcemaps.
El colector para navegadores web que publicó el proyecto OTel usa Zone.js para interceptar como contexto casi todo en el navegador. Si has usado Angular moderno, sabrás que Zone.js a veces puede ser bastante doloroso y, al tocar globales, generar comportamientos difíciles de predecir.
Tampoco conozco un estándar de OTel para cosas como session replay. Muchas plataformas de telemetría, como Sentry, Rollbar y DataDog, lo soportan. A los equipos de backend parece gustarles bastante, y me agrada la característica de los spans de cruzar límites, que permite seguir todo el sistema con una etiqueta única. Dicho eso, los payloads generados a veces son muy verbosos, y algunas plataformas de logging son más compactas. En la práctica no lo he sentido como un gran problema.
También probé instrumentación manual, pero era propensa a errores y verbosa. El navegador realmente necesita algo como https://nodejs.org/api/async_context.html#class-asynclocalst....
En nuestro paquete, sobre la implementación del SDK de navegador de Otel/Splunk agregamos session replay, mejor seguimiento de excepciones, etc. Lamentablemente, estas cosas están lejos de venir incluidas por defecto. Aun así, creo que poder vincular sesiones de frontend con traces/logs de backend cambió mucho la experiencia de desarrollo: https://www.hyperdx.io/blog/browser-based-distributed-tracin...
No resuelve el problema por completo, pero sirve como punto de partida.
Me pregunto si alguien ha empezado siquiera un poco con tracing frontend.
A algunos colegas y a mí se nos ocurrió una idea algo descabellada: que ya no necesitamos logs. En vez de mensajes de log, basta con adjuntar eventos de span: https://opentelemetry.io/docs/instrumentation/ruby/manual/#a...
Luego solo dejaríamos en el log el título del span y el enlace al span correspondiente en Jaeger. Solo lo probé en un proyecto personal, pero me pareció bastante bien; eso sí, ojalá la UI de Jaeger diera mejor soporte a este tipo de uso.
De hecho, esos colegas dieron una charla sobre este tema. Si estás cerca de Hannover, Alemania, busca “Nie wieder Log-Files!” en https://javaforumnord.de/2023/programm/
Usar spans para todas las operaciones significativas se parece a usar logs estructurados más potentes. Es difícil en muchos sistemas que tienen que arrastrar logs existentes, pero si es suficientemente greenfield, lo recomiendo.
Para usar trazas, muchas cosas tienen que funcionar correctamente. O quizá todavía me falta experiencia y por eso las herramientas me dan miedo.
Cuando vi una charla hace algunos años me pareció genial, pero pensé que sería muy difícil convencer a desarrolladores que no fueran SRE: https://github.com/stripe/veneur
OpenTelemetry es un proyecto impulsado por marketing; parece diseñado de forma ingenua e ineficiente por comité, con el objetivo principal de permitir que los CTO de Fortune X00 marquen una casilla en sus documentos de roadmap estratégico.
No es algo que deba usar alguien que tenga opción.
Aquí hay un ejemplo de un cambio que subimos: https://github.com/open-telemetry/opentelemetry-js/pull/4049
Me gustaría que compartieras por qué crees que nadie debería usarlo.
Datadog de hecho puso a mucha gente a gran escala a agregar soporte para Datadog en proyectos OSS. Meterse en codebases desconocidas es una habilidad poderosa, así que incluso pudo haber sido bastante bueno al inicio de una carrera.
OTel hace que los proyectos open source usen una capa de abstracción, de modo que los usuarios puedan comprar en vez de autohospedar. No me encanta, pero si se trata de un servicio operado por gente fuera de la empresa, ahora consideraría OTel. Porque así no bloqueamos a un usuario que quiera usar Datadog.
Cuando usé OTel muy al inicio, la API de Go era muy ineficiente y me decepcionó. Para incrementar un contador necesitaba
context.Context, y la abstracción también tenía fugas, por ejemplo no había forma de configurar los buckets de histogramas al exportar a Prometheus. Supongo que ahora ya lo habrán corregido.El procesador también es bastante capaz, y el conjunto contrib de receivers y exporters en general está bien. No digo que sea la mejor solución, y depende de cada caso de uso, pero una crítica tan fuerte no me parece justificada. Como referencia, formo parte del equipo de mantenimiento de fluent-bit.
Desde el punto de vista de operaciones, sea cual sea la observabilidad que los desarrolladores agreguen al código, se puede imponer el filtrado de forma centralizada, y las aplicaciones solo necesitan un punto de entrada central con el que comunicarse.
Como todo emite OTLP, si quieres cambiar a un backend nuevo solo cambias un archivo YAML, sin tener que reescribir la aplicación para dar soporte a un nuevo backend de logging. Antes que volver a la vieja forma de usar librerías de logging específicas de cada vendor, con sus defectos y todo, seguiría usando OTEL 10 de cada 10 veces.
Odio muchísimo el popup de suscripción de este blog. No hay botón
x, así que no queda nada claro que se pueda cerrar sin entregar el correo.Debajo del botón de suscripción hay un “continue reading” muy poco intuitivo; no pensé que eso fuera a funcionar, y hacer clic afuera tampoco lo cerraba. Estas cosas deberían mejorar.
Sobre OpenTelemetry, desde hace tiempo quería probar si ofrece todas las funciones que necesitamos al enviar datos a Datadog. Pero si además de las funciones básicas todavía necesito el agente de Datadog, entonces es una cosa más que administrar y enseñar, y eso me hace dudar.
Me interesa saber si alguien realmente lo conectó con Datadog. El objetivo no es necesariamente quedar atado a Datadog, pero ahora muchas de nuestras alertas y logs están ahí, así que si primero cambiamos a OpenTelemetry, en teoría más adelante podríamos migrar a otra cosa.
Presioné atrás y terminé de vuelta en HN.
Me pregunto si todavía existe un frontend que no se coma de forma importante los ingresos en términos de costos de personal, infraestructura y licencias.
Con más de 2,000 solicitudes por segundo, incluso mantener solo los logs es caro.
Nosotros operamos nuestro propio stack de Jaeger con un muestreo de 0.1%, y comparado con Datadog APM el costo es prácticamente despreciable.
Para métricas y logs, el muestreo no es tan útil, así que no hay una buena respuesta. Si el margen bruto de Datadog es del 80%, como mucho el 20% de lo que pagas son costos de infraestructura; y si el costo de mano de obra es menor que ese 80%, puedes ahorrar mucho operando tú mismo un stack open source. Incluso usando Datadog, tenemos un proyecto cada 3 meses para reducir el uso, así que de todos modos hay que estarlo cuidando constantemente.
El costo también es un problema, pero puede sorprenderte lo pesada que resulta la observabilidad para el servicio. Usa bastante CPU.
También escribí algunas consultas de Elasticsearch para crear reportes básicos que encontraran consultas lentas. Si sigues los tutoriales de OTEL/Jaeger, es una configuración bastante estándar.
Las trazas eran del orden de cientos por segundo y las recolectábamos todas, sin downsampling. El periodo de retención se podía configurar en 7 días y, cuando me fui, casi no había optimización real. Creo que el costo mensual era de decenas a cientos de dólares.
Puedes definir el comportamiento del sampler de tracing con variables de entorno configurables en el contenedor. Consulta
OTEL_TRACES_SAMPLERen la documentación: https://opentelemetry.io/docs/specs/otel/configuration/sdk-e...Actualmente usamos Datadog, pero todos sabemos que es demasiado caro.
La mayor parte de este hilo trata sobre enviar métricas/logs con OpenTelemetry a trabajos de collectors autohospedados.
Usar una biblioteca estándar soportada por varias herramientas de collector, como ClickHouse, ya es útil por sí mismo, pero otro beneficio es que la especificación permite propagar trace IDs a través de los límites del sistema.
Si tanto tú como tus dependencias implementan la especificación de OpenTelemetry, puedes obtener spans que muestran con detalle qué ocurrió durante el recorrido. Por ejemplo, puedes saber si la carga lenta de una página se debió a que la base de datos tuvo que cargar páginas desde disco, o si un span del plano de metadatos de un servicio cloud fue la causa de una latencia alta.
Estoy muy satisfecho con el avance de OpenTelemetry. Cuando impulsé su adopción hace unos años, los desarrolladores dudaban porque era nuevo y nunca lo habían escuchado; pero cuando lo volví a revisar hace un año, OpenTelemetry estaba por todas partes en nuestros sistemas y el proveedor de logs/tracing que usábamos también estaba migrando hacia eso.