ObservabilidadOSS
Prerrequisitos
- clickhouse-local instalado en su equipo. Consulte la guía de configuración de clickhouse-local para empezar.
Lo que crearás
Map de ClickHouse: las claves son dinámicas y específicas de la aplicación, pero una fila cualquiera normalmente solo tiene unas pocas.
En esta guía de inicio rápido usarás clickhouse-local para cargar datos reales de trazas de OTel desde un archivo CSV a una tabla con columnas Map(LowCardinality(String), String), y aprenderás a consultar, filtrar, agregar y optimizar datos de tipo Map.
Descarga los datos de muestra
El conjunto de datos contiene 6.120 spans de trazas de OTel exportados de una aplicación de microservicios de demostración. Cada fila incluye las columnas
ResourceAttributes y SpanAttributes, que contienen pares clave-valor dinámicos en forma de mapas JSON.
Guarda el archivo en un directorio que puedas localizar fácilmente, por ejemplo ~/data/data-otel-traces.csv.Descargar data-otel-traces.csv (2.9 MB)Este es el aspecto de una sola fila:Cree la tabla y cargue los datos
Inicie Ahora carga el CSV con el motor de tabla Confirma que se hayan cargado los datos:Deberías ver 6.120 filas.
clickhouse-local y cree la siguiente tabla con un esquema que coincida con el del CSV.
La columna clave es ResourceAttributes Map(LowCardinality(String), String); se usa LowCardinality en el tipo de clave porque las claves de los atributos de OTel provienen de un conjunto relativamente pequeño y repetitivo.file. Ajusta la ruta a la ubicación donde guardaste el archivo:Consultar los datos
Acceder a una clave específica — usa la sintaxis de corchetes para obtener un valor del mapa. Si esa clave no existe en una fila concreta, obtendrás el valor predeterminado del tipo de valor (cadena vacía para Filtrar por un valor de Map — encuentra todos los spans de un nombre de servicio específico:Comprueba si existe una clave — no todos los spans incluyen metadatos de Kubernetes. Usa Inspecciona todas las claves presentes en el conjunto de datos — útil para entender qué está generando la instrumentación:Desglosa un Map en filas con ARRAY JOIN â convierte cada par clave-valor en una fila independiente, lo que resulta útil para crear inventarios de atributos o usarlos en paneles:Filtrar maps con mapFilter — extrae solo los atributos de Kubernetes de cada span:Encuentra spans con errores y su contexto de recurso — combina filtros de columna comunes con acceso a map:
String):mapContains para identificar cuáles sí los incluyen:Agregar en mapas con el combinador -Map
El combinador de agregación Ahora usa El sufijo También puedes combinarlo con otros combinadores. Por ejemplo, Por qué esto es importante para OTel: Cuando tu OTel Collector escribe en ClickHouse desgloses por minuto de códigos de estado,
-Map de ClickHouse permite aplicar cualquier aggregate function a una columna Map y hacer que opere sobre cada clave de forma independiente. El resultado es también un Map: una entrada por clave, con el valor agregado. Esto resulta especialmente útil para las metrics de OTel, donde los counters o gauges se almacenan como valores de mapas.Para demostrarlo, crea una pequeña table de metrics en la que cada fila registre los recuentos de códigos de estado HTTP como un Map(String, UInt64):sumMap para sumar el recuento por código de estado de cada servicio:-Map funciona con cualquier función de agregación, por lo que puedes usar minMap, maxMap o avgMap igual de fácilmente:sumMapIf te permite agregar de forma condicional: aquí, solo se suman las ventanas de un minuto en las que el servicio ya tenía errores:sumMap te permite consolidarlos en totales por hora o por día en una sola consulta — sin ARRAY JOIN, sin despivotar y sin necesidad de conocer de antemano el conjunto completo de claves. Cualquier clave que aparezca en cualquier fila se incluye automáticamente en el resultado.Optimiza para las claves que se consultan con frecuencia
Si ves que filtras constantemente por la misma clave del Para los datos existentes, rellene la columna retroactivamente:Ahora
map — host.name es una de las más comunes — puedes extraerla como una columna materializada. Esto evita el escaneo lineal por el map en cada consulta:WHERE HostName = 'prod-cart-01' lee una única columna dedicada en lugar del mapa completo. Este es el patrón recomendado en el esquema de OTel de ClickHouse para cualquier atributo que consultes con frecuencia.Puntos clave
Map(LowCardinality(String), String)es el tipo más idiomático para los atributos de OTel: ofrece la flexibilidad necesaria para manejar conjuntos de claves variables, yLowCardinalitymantiene eficiente el almacenamiento de las claves.- La sintaxis con corchetes (
map['key']) es la forma más habitual de acceder a los valores, pero recuerda que hace un escaneo lineal: funciona bien para mapas con decenas de claves, pero no es lo ideal para cientos. - Las columnas materializadas son la vía de escape: cuando una clave de mapa se convierte en un filtro frecuente, promuévela a una columna real para obtener acceso indexado y columnar.
mapContains,mapKeys,mapValues,mapFilteryARRAY JOINte proporcionan un completo conjunto de herramientas para explorar y transformar datos de tipo Map sin salir de SQL.- El combinador de agregación
-Map(sumMap,avgMap,maxMap, etc.) agrega cada clave de forma independiente en todas las filas: es ideal para consolidar contadores de métricas de OTel sin necesidad de conocer de antemano el conjunto de claves. También se puede combinar con otros combinadores (por ejemplo,sumMapIf).
