En el mundo actual de la observabilidad de sistemas distribuidos, las trazas desempeñan un rol crucial para entender el flujo y comportamiento de las aplicaciones a lo largo de sus diferentes componentes. OpenTelemetry (OTEL) ha emergido como un estándar global para capturar esta telemetría, generando enormes volúmenes de datos estructurados en forma de trazas compuestas por spans – eventos o operaciones individuales con atributos clave como nombres de servicio, duración, timestamps y otras etiquetas personalizadas. Estos datos pueden crecer exponencialmente, alcanzando terabytes diarios en grandes plataformas, lo que hace esencial contar con un método eficiente para su almacenamiento y consulta. Aquí es donde los archivos columnarios, especialmente Apache Parquet, muestran una ventaja significativa frente a los formatos tradicionales basados en filas como JSON o CSV. Las trazas distribuidas representan la historia completa de una solicitud mientras ésta transita por múltiples servicios y componentes.
Cada traza empieza con un span raíz que marca el primer punto de entrada, y a partir de allí se ramifica en varios spans hijos que reflejan llamadas a servicios, consultas a bases de datos, accesos a cachés, y demás operaciones. Esta estructura jerárquica se puede visualizar como un árbol, donde la relación padre-hijo entre spans se mantiene por identificadores específicos, lo que permite recrear el recorrido completo y las dependencias temporales y causales dentro del sistema. Sin embargo, almacenar esta estructura directamente como grafos o árboles en bases de datos especializadas no es necesario para muchos casos, ya que una organización tabular donde cada fila representa un span con referencias a su padre suele ser suficiente y compatible con muchas técnicas de almacenamiento y consulta. El desafío real reside en manejar eficientemente estos volúmenes masivos de datos manteniendo la capacidad de realizar consultas rápidas y flexibles sobre cualquier atributo relevante. Los archivos columnarios como Parquet ofrecen un diseño donde cada columna se almacena de forma contigua y separada.
Esta característica habilita técnicas avanzadas como el "predicate pushdown" y "column pruning", que permiten leer exclusivamente las columnas necesarias para una consulta determinada, evitando el I/O excesivo que ocurriría en formatos basados en filas. Por ejemplo, si se requiere analizar todos los spans relacionados con un servicio específico como "auth-service", solo se accede a la columna de nombres de servicio, saltándose el resto de los datos innecesarios. Esto puede reducir el acceso a disco en más de un 90%, acelerando enormemente las respuestas y reduciendo la carga del sistema. Además de acelerar las consultas, Parquet implementa técnicas de compresión muy efectivas debido al orden columnar y la alta redundancia natural de los datos de trazas. Muchos spans comparten valores comunes en atributos clave, como códigos de estado, nombres de operación o etiquetas de servicio.
Al almacenar estos valores en columnas agrupadas, la compresión aprovecha la baja entropía para reducir sustancialmente el tamaño en disco. Por ejemplo, un archivo JSON de un terabyte con datos de spans puede comprimirse hasta aproximadamente 130 gigabytes en formato Parquet, con un beneficio adicional en la velocidad de escaneo de datos que puede multiplicarse por 30 o más. Esta eficiencia de almacenamiento y procesamiento también se ve reflejada en el manejo de la alta cardinalidad, uno de los mayores retos en la observabilidad. En lugar de que las combinaciones de etiquetas y valores se disparen exponencialmente (como ocurre en las bases de datos tradicionales), la organización en columnas permite almacenar solo los valores únicos de cada campo, evitando la explosión combinatoria. Esto reduce significativamente el tamaño de índices y el consumo de memoria, facilitando el escalado en sistemas de trazas de miles de servicios y millones de operaciones diarias.
En el caso particular del sistema ParseableDB, se adopta un enfoque donde la estructura de árbol de las trazas se aplana en forma de filas con columnas que registran identificadores como trace_id, span_id y parent_span_id. Esta simplificación mantiene la capacidad de reconstruir el árbol para visualización o análisis posterior, a la vez que permite aprovechar las ventajas del almacenamiento columnar para consultas selectivas y rápidas. Los atributos de los spans se dividen entre columnas estructuradas dedicadas para datos comunes y predecibles y una columna única para atributos dinámicos y menos frecuentes, encapsulados como pares clave-valor. Esta segmentación permite optimizar las consultas frecuentes manteniendo flexibilidad para explorar metadatos menos comunes sin sacrificar rendimiento. El modelo columnar también es especialmente favorable para el procesamiento vectorizado, que aprovecha las capacidades actuales de las CPU para trabajar con bloques de datos contiguos aplicando filtros y agregaciones a gran velocidad mediante instrucciones SIMD y otras optimizaciones a nivel de caché.
Esto se traduce en un doble beneficio: menor latencia en la lectura desde disco y procesamiento interno mucho más rápido durante la ejecución de consultas. En conjunto, estos factores hacen que los sistemas basados en Parquet y otras tecnologías de datos columnarios puedan manejar cargas de trabajo de observabilidad a escalas industriales con gran eficiencia. No es casualidad que grandes plataformas y proyectos relevantes como Tempo y OpenTelemetry estén adoptando el almacenamiento columnar para sus pipelines de trazas. Tempo ha demostrado que a escala de miles de millones de spans, es posible realizar consultas ricas y complejas sin depender de índices personalizados pesados, usando directamente ecosistemas robustos como Apache Spark, Presto o Apache Arrow para el análisis. Por su parte, el proyecto OpenTelemetry explora nuevas propuestas para el transporte y almacenamiento columnar, buscando estandarizar un backend más eficiente que el tradicional uso de protobuf y archivos basados en filas.
En resumen, la combinación de formatos columnarios como Parquet con arquitecturas diseñadas desde cero para observabilidad, como Parseable, establece un nuevo paradigma para el almacenamiento y análisis de trazas distribuidas. Este enfoque no solo mitiga problemas clásicos asociados a la alta cardinalidad y la redundancia, sino que también permite consultas más rápidas, menor uso de recursos y un escalado natural en infraestructuras modernas basadas en la nube. Dado el crecimiento exponencial de datos de telemetría en la industria, estas prácticas son fundamentales para mantener la visibilidad y confiabilidad operativa en sistemas complejos. Para equipos y organizaciones que enfrentan límites en sus arquitecturas actuales de observabilidad, adoptar un diseño columnar para sus datos de trazas puede resultar en beneficios sustanciales tanto en costos como en tiempos de respuesta. Más allá de las mejoras técnicas, esta evolución facilita la exploración ad-hoc, la detección temprana de problemas y la optimización continua que define una observabilidad efectiva en el entorno tecnológico actual.
Sin duda, el futuro del almacenamiento de OTEL Traces está muy ligado a estas innovaciones en formatos y sistemas diseñados para la era de datos masivos y distribuidos.