ObservabilityOSS
Prérequis
- clickhouse-local installé sur votre machine. Consultez le guide d’installation de clickhouse-local pour démarrer.
Ce que vous allez créer
Map de ClickHouse : les clés sont dynamiques et spécifiques à l’application, mais une ligne donnée n’en contient généralement qu’une poignée.
Dans ce guide de démarrage rapide, vous utiliserez clickhouse-local pour charger de vraies données de trace OTel à partir d’un fichier CSV dans une table comportant des colonnes Map(LowCardinality(String), String), et vous apprendrez à interroger, filtrer, agréger et optimiser des données de type map.
Télécharger les données d’exemple
Le jeu de données contient 6 120 spans de traces OTel exportés à partir d’une application de microservices de démonstration. Chaque ligne comprend une colonne
ResourceAttributes et une colonne SpanAttributes contenant des paires clé-valeur dynamiques sous forme de mappages JSON.
Enregistrez le fichier dans un répertoire facile à retrouver, par exemple ~/data/data-otel-traces.csv.Télécharger data-otel-traces.csv (2,9 Mo)Voici à quoi ressemble une ligne :Créer la table et charger les données
Lancez Chargez maintenant le CSV à l’aide du moteur de table Vérifiez que les données ont bien été chargées :Vous devriez voir 6 120 lignes.
clickhouse-local et créez la table suivante avec un schéma correspondant à celui du CSV.
La colonne de clé est ResourceAttributes Map(LowCardinality(String), String) - LowCardinality est utilisé pour le type de clé, car les clés d’attribut OTel sont tirées d’un ensemble relativement restreint et répétitif.file. Adaptez le chemin à l’emplacement où vous avez enregistré le fichier :Interroger les données
Accéder à une clé spécifique — utilisez la syntaxe entre crochets pour récupérer une valeur dans la map. Si la clé n’existe pas pour une ligne donnée, vous obtenez la valeur par défaut du type de valeur (chaîne vide pour Filtrer par valeur de map — trouver tous les spans associés à un nom de service donné :Vérifiez si une clé existe — tous les spans ne contiennent pas de métadonnées Kubernetes. Utilisez Inspectez toutes les clés présentes dans le jeu de données — utile pour comprendre ce que produit l’instrumentation :Décomposer une map en lignes avec ARRAY JOIN — transformez chaque paire clé-valeur en ligne distincte, ce qui est pratique pour créer des inventaires d’attributs ou alimenter des tableaux de bord :Filtrer les maps avec mapFilter — extrayez uniquement les attributs relatifs à Kubernetes de chaque span :Repérez les spans d’erreur et leur contexte de ressource — combinez des filtres classiques sur les colonnes avec l’accès à la map :
String) :mapContains pour repérer ceux qui en ont :Agréger des maps avec le combinateur -Map
Le combinateur d’agrégation Utilisez maintenant Le suffixe Vous pouvez également le combiner avec d’autres combinateurs. Par exemple, Pourquoi c’est important pour OTel : lorsque votre OTel Collector écrit dans ClickHouse une ventilation par minute des codes de statut,
-Map de ClickHouse vous permet d’appliquer n’importe quelle fonction d’agrégation à une colonne Map afin qu’elle s’applique indépendamment à chaque clé. Le résultat est lui aussi une Map — une entrée par clé, avec la valeur agrégée. C’est particulièrement utile pour les métriques OTel, où les compteurs ou les gauges sont stockés dans des valeurs de map.Pour le montrer, créez une petite table de métriques dans laquelle chaque ligne enregistre le nombre de codes d’état HTTP sous forme de Map(String, UInt64) :sumMap pour obtenir le total des occurrences par code d’état pour chaque service :-Map fonctionne avec n’importe quelle fonction d’agrégation ; vous pouvez donc utiliser minMap, maxMap ou avgMap tout aussi facilement :sumMapIf permet d’agréger de manière conditionnelle — ici, en additionnant uniquement les fenêtres d’une minute où le service présentait déjà des erreurs :sumMap vous permet de les agréger en totaux horaires ou quotidiens dans une seule requête — sans ARRAY JOIN, sans dé-pivotage, et sans avoir à connaître à l’avance l’ensemble des clés. Toute clé présente dans n’importe quelle ligne est automatiquement incluse dans le résultat.Optimisez les clés fréquemment utilisées dans les requêtes
Si vous constatez que vous filtrez constamment sur la même clé de map — Pour les données existantes, remplissez la colonne rétroactivement :Désormais,
host.name est un cas courant — vous pouvez l’extraire dans une colonne matérialisée. Cela évite de parcourir linéairement la map à chaque requête :WHERE HostName = 'prod-cart-01' ne lit qu’une seule colonne dédiée au lieu de l’intégralité de la Map. C’est l’approche recommandée dans le schéma OTel de ClickHouse pour tout attribut que vous interrogez fréquemment.Points clés à retenir
Map(LowCardinality(String), String)est le type idiomatique pour les attributs OTel — suffisamment flexible pour gérer des ensembles de clés variables, etLowCardinalitypermet de stocker efficacement les clés.- La syntaxe entre crochets (
map['key']) est la façon la plus courante d’accéder aux valeurs, mais gardez à l’esprit qu’elle effectue un balayage linéaire — très bien pour des maps contenant quelques dizaines de clés, moins adapté pour des centaines. - Les colonnes matérialisées sont la solution de secours : lorsqu’une clé de map devient un filtre fréquemment utilisé, faites-en une vraie colonne pour un accès indexé et colonnaire.
mapContains,mapKeys,mapValues,mapFilteretARRAY JOINvous offrent une boîte à outils complète pour explorer et transformer des données de type map sans quitter SQL.- Le combinateur d’agrégation
-Map(sumMap,avgMap,maxMap, etc.) agrège chaque clé indépendamment d’une ligne à l’autre — idéal pour consolider des compteurs de métriques OTel sans avoir à connaître l’ensemble de clés à l’avance. Il se combine aussi avec d’autres combinateurs (par ex.sumMapIf).
Étapes suivantes
- Créer votre première table MergeTree
- Créer votre première vue matérialisée
- Problèmes courants de prise en main
