Skip to main content
All quickstarts
ObservabilidadeOSS

Pré-requisitos

O que você vai criar

No OpenTelemetry, cada span de trace carrega um conjunto de atributos de recurso — metadados de chave-valor que descrevem a entidade que produziu a telemetria (nome do serviço, host, região de nuvem, pod do Kubernetes etc.). O conjunto de chaves varia entre serviços e ambientes, o que torna o tipo Map do ClickHouse uma escolha natural: as chaves são dinâmicas e específicas da aplicação, mas cada linha normalmente tem apenas algumas delas. Neste guia de início rápido, você usará o clickhouse-local para carregar dados reais de traces do OTel de um arquivo CSV em uma tabela com colunas Map(LowCardinality(String), String) e aprenderá a consultar, filtrar, agregar e otimizar dados em map.
1

Baixe os dados de exemplo

O conjunto de dados contém 6.120 trace spans do OTel exportados de um aplicativo de demonstração com microsserviços. Cada linha inclui as colunas ResourceAttributes e SpanAttributes, que contêm pares chave-valor dinâmicos em maps JSON. Salve o arquivo em um diretório fácil de referenciar, por exemplo ~/data/data-otel-traces.csv.Baixar data-otel-traces.csv (2.9 MB)Veja como é uma única linha:
2

Crie a tabela e carregue os dados

Inicie o clickhouse-local e crie a tabela a seguir com um esquema correspondente ao CSV. A coluna-chave é ResourceAttributes Map(LowCardinality(String), String) - usando LowCardinality no tipo da chave porque as chaves de atributo do OTel vêm de um conjunto relativamente pequeno e recorrente.
Agora, carregue o CSV usando o engine de tabela file. Ajuste o caminho para o local em que você salvou o arquivo:
Confirme se os dados foram carregados:
Você verá 6.120 linhas.
3

Consulte os dados

Acesse uma chave específica — use a sintaxe de colchetes para obter um valor do map. Se a chave não existir em uma determinada linha, você receberá o valor padrão do tipo do valor (string vazia para String):
Filtre por um valor de map — encontre todos os spans com um nome de serviço específico:
Verifique se uma chave está presente — nem todo span tem metadados do Kubernetes. Use mapContains para descobrir quais têm:
Inspecione todas as chaves presentes no conjunto de dados — útil para entender o que a instrumentação está produzindo:
Desdobre um map em linhas com ARRAY JOIN — transforme cada par chave-valor em uma linha própria, útil para criar inventários de atributos ou alimentar dashboards:
Filtre maps com mapFilter — extraia apenas os atributos do Kubernetes de cada span:
Encontre spans com erro e seu contexto de recurso — combine filtros de coluna comuns com acesso a map:
4

Agregação em maps com o combinador -Map

O combinador de agregação -Map do ClickHouse permite aplicar qualquer função de agregação a uma coluna Map e fazer com que ela opere em cada chave de forma independente. O resultado também é um Map — uma entrada por chave, com o valor agregado. Isso é especialmente útil para métricas OTel, em que counters ou gauges são armazenados como valores de map.Para demonstrar, crie uma pequena tabela de métricas em que cada linha registra contagens de códigos de status HTTP como um Map(String, UInt64):
Agora use sumMap para somar as contagens por código de status de cada serviço:
O sufixo -Map funciona com qualquer função de agregação, então você pode usar minMap, maxMap ou avgMap com a mesma facilidade:
Você também pode combiná-lo com outros combinadores. Por exemplo, sumMapIf permite fazer agregações condicionais — aqui, somando apenas as janelas de um minuto em que o serviço já apresentava erros:
Por que isso é importante para OTel: Quando seu OTel Collector grava, no ClickHouse, a discriminação por minuto dos códigos de status, sumMap permite consolidá-la em totais por hora ou por dia em uma única consulta — sem ARRAY JOIN, sem fazer unpivot, sem precisar conhecer de antemão o conjunto completo de chaves. Qualquer chave que apareça em alguma linha é incluída automaticamente no resultado.
5

Otimize para chaves usadas com frequência em consultas

Se você perceber que está sempre filtrando pela mesma chave do map — host.name é um exemplo comum —, pode extraí-la para uma coluna materializada. Assim, você evita a varredura linear no map a cada consulta:
Para os dados existentes, faça o backfill da coluna:
Agora, WHERE HostName = 'prod-cart-01' lê uma única coluna dedicada, em vez do map inteiro. Esse é o padrão recomendado no schema do ClickHouse para OTel para qualquer atributo consultado com frequência.

Principais conclusões

  • Map(LowCardinality(String), String) é o tipo idiomático para atributos do OTel — flexível o bastante para lidar com conjuntos de chaves variáveis, e LowCardinality mantém o armazenamento dessas chaves eficiente.
  • A sintaxe com colchetes (map['key']) é a forma mais comum de acessar valores, mas lembre-se de que ela faz uma varredura linear — funciona bem para maps com dezenas de chaves, mas não é ideal para centenas.
  • Colunas materializadas são a saída: quando uma chave do map se torna um alvo frequente de filtro, promova-a a uma coluna real para ter acesso indexado e colunar.
  • mapContains, mapKeys, mapValues, mapFilter e ARRAY JOIN oferecem um conjunto poderoso de ferramentas para explorar e transformar dados de map sem sair do SQL.
  • O combinador de agregação -Map (sumMap, avgMap, maxMap, etc.) agrega cada chave de forma independente em todas as linhas — ideal para consolidar contadores de métricas do OTel sem precisar conhecer o conjunto de chaves com antecedência. Ele também se combina com outros combinadores (por exemplo, sumMapIf).

Próximos passos

Confira estes guias de início rápido: Ou aprofunde-se com a documentação de referência:
ClickHouse Academy — Master ClickHouse with expert-designed training for every skill level

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

Última modificação em 28 de agosto de 2026