Guide pas à pas d'HyperDX
Configurez les sources de données ClickStack, recherchez la télémétrie en temps réel et recréez les tableaux de bord Kibana avec l'assistant IA.
HyperDX est l'interface d'observabilité intégrée à ClickStack, fournie avec chaque service ClickHouse Cloud. Ce guide vous accompagne dans les quatre opérations à effectuer dans HyperDX pour l'atelier de migration :
- Lancer ClickStack depuis la console Cloud.
- Créer trois sources de données, une pour les traces, une pour les journaux et une pour les métriques OTEL, qui pointent vers la base de données
otelalimentée à l'étape 2. - Rechercher des journaux en temps réel dans la vue Search afin de confirmer l'arrivée des données.
- Construire un graphique avec l'assistant IA pour illustrer la visualisation à la volée sans écrire de SQL.
Prérequis : l'étape 4 de README.md s'est terminée sans erreur :
otel.otel_logs_v2,otel.otel_tracesetotel.otel_metrics_*reçoivent tous des données, ce que vous pouvez confirmer avecbash scripts/validate_migration.sh.
Étape A — lancer ClickStack
- Connectez-vous à clickhouse.cloud et ouvrez le service provisionné à l'étape 1 du README.
- Dans la barre latérale gauche de la console SQL, faites défiler la page jusqu'en bas. Cliquez sur l'icône de lancement (↗) située à côté de ClickStack (Beta).
- ClickStack s'ouvre dans un nouvel onglet et vous authentifie au moyen du SSO Cloud ; aucune connexion distincte n'est nécessaire.

Ce que vous devez d'abord voir dans la console SQL : le sélecteur de base de données (en haut au centre) doit contenir la base
otel, avec les 11 tables, 3 vues matérialisées et 2 dictionnaires créés à l'étape 2 :otel_logs,otel_logs_v2,otel_traces,otel_metrics_*(5 tables),geoip_data+geoip_country/geoip_city(1 table + 2 dictionnaires),alert_error_rate*,logs_summary_1min*. S'il en manque, exécutez à nouveauclickhouse/dictionaries.sql,clickhouse/schema.sqletclickhouse/alert-tables.sqlavant de poursuivre.
Étape B — créer les trois sources de données
HyperDX interroge ClickHouse au moyen de « sources » nommées qui relient un onglet de l'interface (Search, Service Map, Chart Explorer, etc.) à une table donnée et à une convention de mise en correspondance des colonnes. Vous allez créer une source par type de signal.
Dans la barre latérale en bas à gauche, ouvrez Team Settings, puis Data → Sources. Cliquez sur Add source pour créer chacune des trois sources ci-dessous.
B.1 — source des traces
| Champ | Valeur |
|---|---|
| Name | Traces |
| Source Data Type | Trace |
| Server Connection | Default |
| Database | otel |
| Table | otel_traces |
| Timestamp Column | Timestamp |
| Default Select | Timestamp, ServiceName as service, StatusCode as level, round(Duration / 1e6) |
| Duration Expression | Duration |
| Duration Precision | Nanosecond |
| Trace Id / Span Id / Parent Span Id Expression | TraceId / SpanId / ParentSpanId |
| Span Name / Span Kind Expression | SpanName / SpanKind |
| Status Code / Status Message Expression | StatusCode / StatusMessage |

Cliquez sur Save Source. Le résumé Trace, Default, otel.otel_traces doit apparaître en haut de la liste Sources.
B.2 — source des journaux
Cliquez à nouveau sur Add source, puis configurez :
| Champ | Valeur |
|---|---|
| Name | log |
| Source Data Type | Log |
| Server Connection | Default |
| Database | otel |
| Table | otel_logs_v2 |
| Timestamp Column | TimestampTime |
| Default Select | Timestamp, ServiceName as service, SeverityText as level, Body |
Pourquoi
TimestampTimeet nonTimestamp?Timestampest de typeDateTime64(9)(nanosecondes). Le sélecteur de période et le regroupement de l'histogramme d'HyperDX emploient par défaut la précisionDateTime; les faire pointer vers la colonne matérialiséeTimestampTimeévite des conversions implicites dans chaque requête de tableau de bord.

B.3 — source OTEL Metrics
Cliquez à nouveau sur Add source, puis configurez :
| Champ | Valeur |
|---|---|
| Name | otel_metrics |
| Source Data Type | OTEL Metrics |
| Server Connection | Default |
| Database | otel |
| Gauge Table | otel_metrics_gauge |
| Histogram Table | otel_metrics_histogram |
| Sum Table | otel_metrics_sum |
| Summary Table | otel_metrics_summary |
| Exponential Histogram Table | otel_metrics_exponentialhistogram |
| Correlated Log Source | log |
La source OTEL Metrics couvre les cinq tables de métriques, car le modèle de données OTel encode les différents types de métriques dans des lignes et des formes distinctes. HyperDX dirige la requête vers la bonne table en fonction du type de métrique interrogé. Le réglage Correlated Log Source = log permet de passer en un clic d'un graphique de métriques aux journaux correspondants.

Une fois les trois sources enregistrées, la liste Sources doit afficher Traces, log et otel_metrics, sous la même forme que la capture d'écran ci-dessus (une entrée repliée par source).
Étape C — rechercher les journaux en temps réel
Dans la barre latérale gauche, cliquez sur Search. En haut de la page, sélectionnez la source log que vous venez de créer.
Vous devez voir :
- un histogramme du nombre d'événements au fil du temps (utilisez le sélecteur de période pour choisir « Last 15 minutes » ou « Last 1 hour ») ;
- une table de lignes de journaux comportant les colonnes
Timestamp,service,level,body; - une barre latérale de facettes à gauche, qui répertorie des champs à forte cardinalité tels que
ServiceName(avec le nombre d'événements par service) etSeverityText.

Quelques essais à effectuer :
- Filtrer sur un service : cliquez sur
inventory-service(ou tout autre service) sous la facetteServiceName; la table se recharge en une fraction de seconde avec les données de ce service uniquement. - Rechercher une chaîne : saisissez
errordans la barre de recherche supérieure. Les index de texte de ClickHouse (l'index de sauttext(tokenizer='sparseGrams')surBodydans schema.sql) accélèrent considérablement cette opération par rapport à une analyse complète. - Inspecter une ligne : cliquez sur une ligne de journal pour développer la vue structurée ; chaque clé de la Map
LogAttributesdevient un filtre cliquable.
Remarque concernant la période : le réglage
start_at: enddu collecteur de fichiers signifie que les lignes historiques antérieures à l'étape 3b ne figurent pas dansotel_logs_v2. Si « Last 24 hours » semble peu fourni pendant les premières heures, c'est normal : les données commencent au démarrage du collecteur.
Étape D — construire un graphique avec l'assistant IA
L'assistant IA d'HyperDX (actuellement désigné comme Experimental) traduit des descriptions en langage naturel en configurations de graphique.
-
Dans la barre latérale gauche, cliquez sur Chart Explorer.
-
En haut du volet du graphique, activez AI Assistant [A].
-
Après avoir sélectionné la source
log, saisissez une instruction en langage naturel dans le champ, par exemple :Error count by services for past 2 hours
-
Appuyez sur Entrée. L'assistant remplit la configuration du graphique ci-dessous : type de graphique (Line/Bar), source de données (
log), agrégation (Count of Events) et clauseWhere(SeverityText = 'ERROR'). -
Le graphique s'affiche immédiatement. Modifiez la période ou le type de graphique au moyen des onglets supérieurs (
Line/Bar,Table,Number,Pie,Search,Markdown).

Enregistrez les graphiques utiles en renseignant le champ Chart Name et en cliquant sur l'icône d'enregistrement ; ils apparaîtront sous Saved Searches / Dashboards dans la barre latérale et pourront être réutilisés.
Bibliothèque d'instructions — recréer tous les panneaux Kibana de la partie 1
Les six tableaux de bord Kibana de la partie 1 contiennent 30 panneaux au total. Les tableaux ci-dessous fournissent une instruction par panneau pour recréer chaque graphique dans HyperDX. Pour chaque entrée :
- Source — sélectionnez-la dans l'assistant IA avant d'envoyer l'instruction (
logpour tout ce qui provient d'otel_logs_v2,Tracespour tout ce qui provient d'otel_traces,otel_metricspour les graphiques de métriques). - Graphique — onglet du type de graphique HyperDX à sélectionner (ou laissez l'assistant choisir) avant l'enregistrement. Consultez la légende ci-dessous.
- Filtre — de nombreux panneaux Kibana étaient implicitement limités par flux de données (par exemple, le tableau de bord Web Traffic n'interrogeait que
logs-web_access-lab). Dans ClickHouse, vous exprimez cette contrainte avec une clauseWhere; les instructions ci-dessous incluent le filtre ou s'appuient sur celui de la source HyperDX. Si l'assistant IA ne reprend pas le filtre, passez le graphique en mode SQL et ajoutez l'expressionWhereproposée. - Solution de repli pour le nom des champs — l'assistant IA fait correspondre les termes en langage naturel aux colonnes du schéma. Si une instruction produit un graphique vide, modifiez manuellement le champ
Where/ d'agrégation généré à l'aide des indications de la colonne Indication de champ.
Types de graphiques HyperDX — légende de référence
Le volet Chart Explorer comporte six onglets en haut (Line/Bar, Table, Number, Pie, Search, Markdown). Voici la correspondance entre les types de graphiques HyperDX et les visualisations Kibana qu'ils remplacent :
| Onglet HyperDX | Affichage | Types Kibana remplacés | Quand l'utiliser |
|---|---|---|---|
| Line/Bar | Graphique bidimensionnel (ligne, aire ou barres/colonnes), avec le temps sur l'axe X lorsqu'une agrégation est regroupée par champ de date. Le même onglet gère les barres verticales, les barres horizontales, les lignes et les aires empilées ; la forme du graphique est un réglage dans l'onglet, et non un onglet distinct. | line, area, vertical_bar, horizontal_bar | Tout graphique chronologique, graphique à barres des N premières valeurs ou graphique en aires empilées par catégorie. Les 30 panneaux Kibana sur 30, sauf 5 graphiques en secteurs et 4 valeurs numériques, correspondent à cet onglet. |
| Table | Lignes tabulaires aux colonnes triables ; prend en charge groupBy et plusieurs agrégations (count, avg, quantile, etc.). | data_table, vue de table lens | Lorsque vous souhaitez des valeurs exactes dans une liste triable plutôt qu'une représentation visuelle (par exemple, « 100 principaux chemins, avec côte à côte leur nombre, leur latence p50 et leur taux d'erreur »). |
| Number | Une vignette affichant un grand nombre, généralement une seule agrégation (count, sum, avg, quantile). | metric, goal | Indicateurs synthétiques uniques (« nombre d'erreurs 5xx », « temps de réponse moyen »). |
| Pie | Graphique en anneau/secteurs représentant la proportion de chaque groupe. | pie | Répartition par catégorie, lorsque la proportion importe plus que le volume absolu (répartition des codes d'état, de la gravité ou des langages). |
| Search | Panneau de recherche de journaux à facettes et en temps réel, identique à la vue de la barre latérale Search, mais épinglé dans un emplacement de graphique. | Saved Search Kibana intégrée comme panneau | Ajoutez un flux des erreurs récentes à un tableau de bord, à côté de graphiques chronologiques. |
| Markdown | Bloc de texte statique comportant des liens et des titres. | Visualisation Markdown Kibana | Ajoutez du contexte, des runbooks ou des liens entre tableaux de bord. |
Où se trouve « Histogram » ? Kibana propose une visualisation « Histogram » distincte (nombre d'événements regroupés par champ numérique ou de date). HyperDX l'intègre à l'onglet Line/Bar : choisissez un champ de date ou numérique pour
groupBy, sélectionnez la forme bar, et vous obtenez un histogramme. La bande d'histogramme autonome vue en haut de la vue Search à l'étape C est générée automatiquement ; il ne s'agit pas d'un graphique à créer manuellement.
Principales différences de noms de colonnes par rapport à ECS dans Kibana :
request_path→RequestPath(brut) ouRequestPage(chemin uniquement, recommandé pour le regroupement) ;request_type→RequestType(méthode HTTP) ;status→StatusCode;geo.country_name→GeoCountry;user_agent_parsed.name→BrowserFamily;service/service.name→ServiceName;level→LogLevelouSeverityText;event.severity→SeverityText;hostname→HostName;event.outcome→ dérivé deStatusCode(succès pour 1xx–3xx / échec pour 4xx–5xx dans les traces) ;transaction.duration.us(μs) →Duration(nanosecondes ; diviser par 1 000 pour obtenir des μs).
Web Traffic Overview — 8 panneaux
Filtrez-les tous pour ne conserver que les journaux d'accès web : dans l'assistant IA ou le champ Where du graphique, ajoutez RequestType != ''.
| N° | Panneau Kibana d'origine | Instruction pour l'assistant IA | Source | Graphique | Indication de champ |
|---|---|---|---|---|---|
| 1 | Requests Over Time | Requests over time grouped by minute for the past 1 hour where RequestType is not empty | log | Line/Bar (ligne) | count() regroupé par période |
| 2 | Status Code Distribution | Distribution of StatusCode as a pie chart for the past 1 hour where RequestType is not empty | log | Pie | groupBy(StatusCode) |
| 3 | 5xx Error Count | Total count of events where StatusCode is greater than or equal to 500 in the past 1 hour | log | Number | countIf(StatusCode >= 500) |
| 4 | Avg Response Time (s) | Average of LogAttributes['run_time'] for the past 1 hour where RequestType is not empty | log | Number | avg(toFloat64OrZero(LogAttributes['run_time'])) |
| 5 | Top Request Paths | Top 10 RequestPage by event count for the past 1 hour where RequestType is not empty | log | Line/Bar (barres horizontales) | groupBy(RequestPage) décroissant |
| 6 | Top Countries | Top 10 GeoCountry by event count for the past 1 hour where RequestType is not empty and GeoCountry is not empty | log | Line/Bar (barres horizontales) | groupBy(GeoCountry) |
| 7 | HTTP Method Distribution | Distribution of RequestType (GET, POST, etc.) as a pie chart for the past 1 hour | log | Pie | groupBy(RequestType) |
| 8 | Top User Agents | Top 10 BrowserFamily by event count for the past 1 hour where RequestType is not empty and BrowserFamily is not empty | log | Line/Bar (barres horizontales) | groupBy(BrowserFamily) |
Application Health — 5 panneaux
Les journaux d'application sont les lignes où le niveau est défini, mais où RequestType est vide (les accès web comportent les deux). Filtre : LogLevel != '' AND RequestType = ''.
| N° | Panneau Kibana d'origine | Instruction pour l'assistant IA | Source | Graphique | Indication de champ |
|---|---|---|---|---|---|
| 9 | Log Volume by Severity | Log volume over time stacked by SeverityText for the past 1 hour where RequestType is empty and SeverityText is not empty | log | Line/Bar (aire empilée) | count() regroupé par période, groupBy(SeverityText) |
| 10 | Log Level Distribution | Distribution of SeverityText as a pie chart for the past 1 hour where RequestType is empty | log | Pie | groupBy(SeverityText) |
| 11 | Error Count | Count of error logs for the past 1 hour where SeverityText equals 'ERROR' and RequestType is empty | log | Number | countIf(SeverityText='ERROR') |
| 12 | Errors by Service | Top 10 ServiceName by error count for the past 1 hour where SeverityText equals 'ERROR' and RequestType is empty | log | Line/Bar (barres horizontales) | groupBy(ServiceName) des erreurs |
| 13 | Error Volume Over Time | Error log volume over time grouped by minute for the past 1 hour where SeverityText equals 'ERROR' and RequestType is empty | log | Line/Bar (ligne) | count() regroupé par période |
Infrastructure Overview — 4 panneaux
Les lignes d'infrastructure (syslog) ont un ServiceName qui commence par k8s- (regex_parser promeut le nom d'hôte syslog en service.name). Filtre : ServiceName LIKE 'k8s-%'.
| N° | Panneau Kibana d'origine | Instruction pour l'assistant IA | Source | Graphique | Indication de champ |
|---|---|---|---|---|---|
| 14 | Syslog Volume by Host | Log volume over time stacked by ServiceName for the past 1 hour where ServiceName starts with k8s- | log | Line/Bar (aire empilée) | ServiceName représente ici l'hôte |
| 15 | Top Processes | Top 10 LogAttributes['process'] by event count for the past 1 hour where ServiceName starts with k8s- | log | Line/Bar (barres horizontales) | groupBy(LogAttributes['process']) — passez en mode SQL si l'assistant ne comprend pas la syntaxe de clé de Map |
| 16 | Severity Distribution | Distribution of SeverityText as a pie chart for the past 1 hour where ServiceName starts with k8s- | log | Pie | groupBy(SeverityText) |
| 17 | Log Volume by Process | Log volume over time grouped by minute and stacked by LogAttributes['process'] for the past 1 hour where ServiceName starts with k8s- | log | Line/Bar (aire empilée) | même réserve que pour le n° 15 concernant les clés de Map |
OTel Demo — APM Traces — 6 panneaux
Les traces arrivent dans otel.otel_traces. Avant d'exécuter ces instructions, sélectionnez la source de données Traces dans l'assistant IA.
| N° | Panneau Kibana d'origine | Instruction pour l'assistant IA | Source | Graphique | Indication de champ |
|---|---|---|---|---|---|
| 18 | APM Trace Volume | Trace span volume over time grouped by minute for the past 1 hour | Traces | Line/Bar (ligne) | count() regroupé par période |
| 19 | Trace Outcome Distribution | Pie chart of trace outcome (StatusCode = 0 or empty as success, otherwise failure) for the past 1 hour | Traces | Pie | Solution SQL de repli : if(StatusCode IN ('','STATUS_CODE_OK','STATUS_CODE_UNSET'),'success','failure') comme clé de regroupement |
| 20 | HTTP Status Codes | Distribution of SpanAttributes['http.response.status_code'] as a pie chart for the past 1 hour | Traces | Pie | seuls les spans de serveur HTTP comportent cet attribut ; ajoutez Where SpanAttributes['http.response.status_code'] != '' |
| 21 | Service Language Breakdown | Pie chart of ResourceAttributes['telemetry.sdk.language'] for the past 1 hour | Traces | Pie | La démo OTel émet cet attribut de ressource ; son nom est telemetry.sdk.language (et non service.language.name comme dans ECS) |
| 22 | Top Services by Span Count | Top 10 ServiceName by span count for the past 1 hour | Traces | Line/Bar (barres horizontales) | groupBy(ServiceName) |
| 23 | Top Transaction Names | Top 10 SpanName by event count for the past 1 hour where SpanKind equals 'SPAN_KIND_SERVER' or SpanKind equals 'Server' | Traces | Line/Bar (barres horizontales) | groupBy(SpanName) limité aux spans de serveur (les « transactions » de Kibana) |
OTel Demo — Latency — 4 panneaux
| N° | Panneau Kibana d'origine | Instruction pour l'assistant IA | Source | Graphique | Indication de champ |
|---|---|---|---|---|---|
| 24 | Avg Transaction Duration Over Time | Average Duration in milliseconds over time grouped by minute for the past 1 hour where SpanKind is 'SPAN_KIND_SERVER' | Traces | Line/Bar (ligne) | avg(Duration / 1e6) pour des ms (Duration est en ns). Kibana affichait des μs ; utilisez 1e3 pour reproduire l'unité |
| 25 | Avg Duration by Service | Top 10 ServiceName by average Duration in milliseconds for the past 1 hour where SpanKind is 'SPAN_KIND_SERVER' | Traces | Line/Bar (barres horizontales) | avg(Duration / 1e6) regroupé par ServiceName |
| 26 | Failed Transactions by Service | Top 10 ServiceName by count of spans where StatusCode equals 'STATUS_CODE_ERROR' for the past 1 hour | Traces | Line/Bar (barres horizontales) | le marqueur d'échec est StatusCode = 'STATUS_CODE_ERROR' |
| 27 | Failed Transactions Over Time | Count of spans over time grouped by minute where StatusCode equals 'STATUS_CODE_ERROR' for the past 1 hour | Traces | Line/Bar (ligne) | même filtre que pour le n° 26 |
OTel Demo — Logs — 3 panneaux
Les journaux OTel Demo provenant des services de la démonstration (frontend-proxy, cart, checkout, etc.) arrivent dans otel.otel_logs_v2. Ni RequestType ni LogLevel n'y sont matérialisés ; distinguez-les avec ServiceName NOT LIKE 'k8s-%' AND RequestType = ''.
| N° | Panneau Kibana d'origine | Instruction pour l'assistant IA | Source | Graphique | Indication de champ |
|---|---|---|---|---|---|
| 28 | OTel Log Volume by Service | Log volume over time stacked by ServiceName for the past 1 hour where ServiceName not like 'k8s-%' and RequestType is empty | log | Line/Bar (aire empilée) | count() regroupé par période, groupBy(ServiceName) |
| 29 | Top Services by Log Volume | Top 10 ServiceName by log count for the past 1 hour where ServiceName not like 'k8s-%' and RequestType is empty | log | Line/Bar (barres horizontales) | groupBy(ServiceName) |
| 30 | OTel Logs by Service Language | Pie chart of ResourceAttributes['telemetry.sdk.language'] for the past 1 hour where ServiceName not like 'k8s-%' and RequestType is empty | log | Pie | Même réserve que pour la trace n° 21 : le champ est telemetry.sdk.language, et non service.language.name |
Conseils lorsque l'assistant IA se trompe
- Passez en mode SQL dans le sélecteur
Where. L'assistant IA génère un graphique partiellement renseigné ; vous pouvez modifier manuellement chaque champ. Le sélecteur de schéma (bouton Schema à côté de la source de données) affiche chaque colonne et son type. - Fixez la période. L'assistant comprend « for the past N hours / today / yesterday », mais utilise par défaut le sélecteur de période du graphique si vous ne la précisez pas. Réglez explicitement la période dans le sélecteur avant l'enregistrement.
- Les colonnes de type Map (
LogAttributes,ResourceAttributes,SpanAttributes) posent souvent problème à l'assistant. S'il génèreWHERE process = 'kernel'au lieu deWHERE LogAttributes['process'] = 'kernel', corrigez l'expression en mode SQL. - Enregistrez la version opérationnelle après avoir renseigné Chart Name, puis ajoutez les graphiques à un tableau de bord HyperDX pour obtenir une vue sur une seule page qui reproduit le tableau de bord Kibana d'origine.
Et ensuite ?
- Service Map (barre latérale, version bêta) — représente le graphe des appels entre microservices d'OTel Demo à partir d'
otel_traces. Aucune configuration supplémentaire n'est nécessaire après la création de la source Traces. - Alerts — définissez des alertes sur toute recherche enregistrée ou tout graphique. Vous les utiliserez à l'étape 8 du README principal ; consultez README.md § Étape 8 Option A pour les deux alertes recommandées (
web-5xx-errors, battement de cœur du service). - Notebooks (aperçu) — combinez des graphiques, des requêtes et des commentaires Markdown pour créer des investigations partageables.
Une fois l'exploration terminée, revenez à l'étape 6 de README.md pour vérifier la configuration du TTL.
Résolution des problèmes
La liste des sources est vide après l'enregistrement.
HyperDX met en cache les définitions des sources pour chaque session du navigateur. Forcez le rechargement de l'onglet (Cmd-Maj-R / Ctrl-Maj-R). Si la liste reste vide, vérifiez Team Settings → Data → Server Connection : la valeur doit être Default et désigner le même service CH Cloud.
Search n'affiche aucune ligne, mais validate_migration.sh en signale des milliers.
- Vérifiez le sélecteur de période ; la valeur par défaut est « Last 15 minutes ». Passez à « Last 24 hours » si votre collecteur a démarré récemment.
- Vérifiez que le
Default Selectde la source utiliseTimestampTime(et nonTimestamp). Symptôme : l'histogramme s'affiche, mais la table indique « no rows ». - Vérifiez que la valeur Database de la source est
otel(et nondefault).
L'assistant IA répond « I couldn't translate that. » L'assistant est limité au schéma de la source sélectionnée. Solutions courantes :
- Changez de source de données : les questions portant sur des traces (« latence p95 ») nécessitent la source
Traces, et nonlog. - Précisez le champ :
count by ServiceNamefonctionne mieux quecount by service.