Skip to main content
All quickstarts
ObservabilidadOSS

Prerrequisitos

Lo que crearás

En OpenTelemetry, cada span de traza lleva un conjunto de atributos de recurso: metadatos clave-valor que describen la entidad que produjo la telemetría (nombre del servicio, host, región de Cloud, pod de Kubernetes, etc.). El conjunto de claves varía entre servicios y entornos, por lo que encaja de forma natural con el tipo 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.
1

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:
2

Cree la tabla y cargue los datos

Inicie 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.
Ahora carga el CSV con el motor de tabla file. Ajusta la ruta a la ubicación donde guardaste el archivo:
Confirma que se hayan cargado los datos:
Deberías ver 6.120 filas.
3

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 String):
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 mapContains para identificar cuáles sí los incluyen:
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:
4

Agregar en mapas con el combinador -Map

El combinador de agregación -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):
Ahora usa sumMap para sumar el recuento por código de estado de cada servicio:
El sufijo -Map funciona con cualquier función de agregación, por lo que puedes usar minMap, maxMap o avgMap igual de fácilmente:
También puedes combinarlo con otros combinadores. Por ejemplo, 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:
Por qué esto es importante para OTel: Cuando tu OTel Collector escribe en ClickHouse desgloses por minuto de códigos de estado, 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.
5

Optimiza para las claves que se consultan con frecuencia

Si ves que filtras constantemente por la misma clave del maphost.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:
Para los datos existentes, rellene la columna retroactivamente:
Ahora 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, y LowCardinality mantiene 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, mapFilter y ARRAY JOIN te 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).

Próximos pasos

A continuación, consulta estas guías de inicio rápido: O profundiza con la documentación de referencia:
ClickHouse Academy — Master ClickHouse with expert-designed training for every skill level

Check out the ClickHouse academy for on-demand and live training

Última modificación el 28 de agosto de 2026