ObservabilidadeOSS
Pré-requisitos
- clickhouse-local instalado na sua máquina. Consulte o guia de configuração do clickhouse-local para começar.
O que você vai criar
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.
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:Crie a tabela e carregue os dados
Inicie o Agora, carregue o CSV usando o engine de tabela Confirme se os dados foram carregados:Você verá 6.120 linhas.
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.file. Ajuste o caminho para o local em que você salvou o arquivo: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 Filtre por um valor de Verifique se uma chave está presente — nem todo span tem metadados do Kubernetes. Use 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
String):map — encontre todos os spans com um nome de serviço específico:mapContains para descobrir quais têm:map:Agregação em maps com o combinador -Map
O combinador de agregação Agora use O sufixo Você também pode combiná-lo com outros combinadores. Por exemplo, Por que isso é importante para OTel: Quando seu OTel Collector grava, no ClickHouse, a discriminação por minuto dos códigos de status,
-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):sumMap para somar as contagens por código de status de cada serviço:-Map funciona com qualquer função de agregação, então você pode usar minMap, maxMap ou avgMap com a mesma facilidade:sumMapIf permite fazer agregações condicionais — aqui, somando apenas as janelas de um minuto em que o serviço já apresentava erros: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.Otimize para chaves usadas com frequência em consultas
Se você perceber que está sempre filtrando pela mesma chave do map — Para os dados existentes, faça o backfill da coluna:Agora,
host.name é um exemplo comum —, pode extraí-la para uma coluna materializada. Assim, você evita a varredura linear no map a cada consulta: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, eLowCardinalitymanté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,mapFiltereARRAY JOINoferecem 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
- Crie sua primeira tabela MergeTree
- Crie sua primeira visão materializada
- Problemas comuns ao dar os primeiros passos
