Guia passo a passo do HyperDX
Configure fontes de dados do ClickStack, pesquise telemetria em tempo real e recrie os dashboards do Kibana com o AI Assistant.
O HyperDX é a interface de observabilidade integrada ao ClickStack — incluída em todos os serviços do ClickHouse Cloud. Este guia apresenta as quatro tarefas que você precisa realizar no HyperDX para o laboratório de migração:
- Iniciar o ClickStack pelo console do Cloud.
- Criar três fontes de dados — uma para traces, uma para logs e uma para métricas OTEL — apontando para o banco de dados
otelpreenchido na Etapa 2. - Pesquisar logs em tempo real na visualização Search para confirmar o fluxo dos dados.
- Criar um gráfico com o assistente de IA para demonstrar a visualização ad hoc sem escrever SQL.
Pré-requisitos: A Etapa 4 do README.md foi concluída sem erros —
otel.otel_logs_v2,otel.otel_traceseotel.otel_metrics_*estão recebendo dados, e você pode confirmar combash scripts/validate_migration.sh.
Etapa A — Iniciar o ClickStack
- Entre em clickhouse.cloud e abra o serviço provisionado na Etapa 1 do README.
- Na barra lateral esquerda do console SQL, role até o final. Clique no ícone de abertura (↗) ao lado de ClickStack (Beta).
- O ClickStack é aberto em uma nova guia e autentica você pelo SSO do Cloud — não é necessário um login separado.

O que você deve ver primeiro no console SQL: o banco de dados
otelno seletor de bancos de dados (parte superior central), com as 11 tabelas, 3 views materializadas e 2 dicionários criados na Etapa 2 —otel_logs,otel_logs_v2,otel_traces,otel_metrics_*(5 tabelas),geoip_data+geoip_country/geoip_city(1 tabela + 2 dicionários),alert_error_rate*,logs_summary_1min*. Se algum item estiver ausente, execute novamenteclickhouse/dictionaries.sql,clickhouse/schema.sqleclickhouse/alert-tables.sqlantes de continuar.
Etapa B — Criar as três fontes de dados
O HyperDX consulta o ClickHouse por meio de "fontes" nomeadas que vinculam uma guia da interface (Search, Service Map, Chart Explorer etc.) a uma tabela específica e a uma convenção de mapeamento de colunas. Você criará uma fonte por tipo de sinal.
Abra Team Settings na barra lateral inferior esquerda e depois Data → Sources. Clique em Add source para criar cada uma das três fontes abaixo.
B.1 — Fonte de traces
| Campo | Valor |
|---|---|
| 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 |

Clique em Save Source. O resumo Trace, Default, otel.otel_traces deve aparecer no topo da lista Sources.
B.2 — Fonte de logs
Clique novamente em Add source e configure:
| Campo | Valor |
|---|---|
| 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 |
Por que
TimestampTimee nãoTimestamp?TimestampéDateTime64(9)(nanossegundos). O seletor de intervalo de tempo e os buckets de histograma do HyperDX usam por padrão a precisão deDateTime; apontar para a coluna materializadaTimestampTimeevita conversões implícitas em todas as consultas de dashboard.

B.3 — Fonte de métricas OTEL
Clique novamente em Add source e configure:
| Campo | Valor |
|---|---|
| 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 |
A fonte de métricas OTEL abrange todas as cinco tabelas de métricas, pois o modelo de dados do OTel codifica tipos diferentes de métricas em linhas/formatos diferentes. O HyperDX direciona a consulta à tabela correta conforme o tipo de métrica. Definir Correlated Log Source = log permite ao HyperDX saltar de um gráfico de métricas para os logs correspondentes com um clique.

Depois de salvar as três fontes, a lista Sources deve mostrar Traces, log e otel_metrics — com o mesmo formato da captura acima (uma entrada recolhida por fonte).
Etapa C — Pesquisar logs em tempo real
Clique em Search na barra lateral esquerda. No topo, selecione a fonte log que acabou de criar.
Você deve ver:
- Um histograma das contagens de eventos ao longo do tempo (use o seletor de intervalo para definir "Last 15 minutes" ou "Last 1 hour")
- Uma tabela de linhas de log com as colunas
Timestamp,service,level,body - Uma barra lateral de facetas à esquerda, listando campos de alta cardinalidade como
ServiceName(com contagens por serviço) eSeverityText

Experimente:
- Filtrar por um serviço: clique em
inventory-service(ou qualquer serviço) na facetaServiceName— a tabela é recarregada, filtrada por esse serviço, em uma fração de segundo. - Pesquisar por string: digite
errorna barra de pesquisa superior. Os índices de texto do ClickHouse (o índice de saltotext(tokenizer='sparseGrams')emBodyno schema.sql) aceleram muito essa busca em comparação com uma varredura completa. - Inspecionar uma linha: clique em qualquer linha de log para expandir a visualização estruturada — cada chave do Map
LogAttributesse torna um filtro clicável.
Observação sobre o intervalo de tempo: a configuração
start_at: endno coletor baseado em arquivos significa que as linhas históricas existentes antes da Etapa 3b não estão emotel_logs_v2. Se "Last 24 hours" parecer ter poucos dados nas primeiras horas, isso é esperado — os dados começam quando o coletor foi iniciado.
Etapa D — Criar um gráfico com o assistente de IA
O AI Assistant do HyperDX (atualmente identificado como Experimental) traduz descrições em linguagem natural em configurações de gráficos.
-
Clique em Chart Explorer na barra lateral esquerda.
-
Clique no botão AI Assistant [A] na parte superior do painel do gráfico.
-
Com a fonte
logselecionada, digite uma instrução em linguagem natural na caixa de entrada, por exemplo:Error count by services for past 2 hours
-
Pressione Enter. O assistente preenche a configuração do gráfico abaixo: tipo de gráfico (Line/Bar), fonte de dados (
log), agregação (Count of Events) e uma cláusulaWhere(SeverityText = 'ERROR'). -
O gráfico é renderizado imediatamente. Ajuste o intervalo de tempo ou o tipo de gráfico nas guias superiores (
Line/Bar,Table,Number,Pie,Search,Markdown).

Salve gráficos úteis pelo campo Chart Name e pelo ícone de salvar — eles aparecerão em Saved Searches / Dashboards na barra lateral para reutilização posterior.
Biblioteca de instruções — recrie todos os painéis do Kibana da Parte 1
Os seis dashboards do Kibana da Parte 1 contêm 30 painéis no total. As tabelas abaixo oferecem uma receita de uma instrução por painel para você reconstruir cada gráfico no HyperDX. Para cada entrada:
- Fonte — defina-a no AI Assistant antes de enviar a instrução (
logpara tudo deotel_logs_v2,Tracespara tudo deotel_traces,otel_metricspara gráficos de métricas). - Gráfico — a guia de tipo de gráfico do HyperDX a selecionar (ou deixe o assistente escolher) antes de salvar. Consulte a legenda abaixo.
- Filtro — muitos painéis do Kibana tinham escopo implícito por fluxo de dados (por exemplo, o dashboard Web Traffic consultava apenas
logs-web_access-lab). No ClickHouse, isso é expresso por uma cláusulaWhere; as instruções abaixo incluem o filtro ou usam o filtro da fonte no HyperDX. Se o AI Assistant não aplicar o filtro, altere o gráfico para o modo SQL e adicione a expressãoWheresugerida. - Alternativa para o nome do campo — o AI Assistant mapeia termos em linguagem natural às colunas do esquema. Se uma instrução produzir um gráfico vazio, edite manualmente o campo
Where/ agregação gerado usando as dicas da coluna Dica de campo.
Tipos de gráfico do HyperDX — legenda de referência
O painel Chart Explorer tem seis guias na parte superior (Line/Bar, Table, Number, Pie, Search, Markdown). O mapeamento entre os tipos de gráfico do HyperDX e as visualizações do Kibana que eles substituem é:
| Guia do HyperDX | O que mostra | Tipos do Kibana substituídos | Quando usar |
|---|---|---|---|
| Line/Bar | Gráfico 2D — linha, área ou barra/coluna — com tempo no eixo X quando uma agregação é dividida em buckets por um campo de data. A mesma guia oferece barras verticais e horizontais, linhas e áreas empilhadas; o formato do gráfico é uma configuração dentro da guia, não uma guia separada. | line, area, vertical_bar, horizontal_bar | Qualquer gráfico de série temporal, gráfico de barras com os "N principais por contagem" ou gráfico de área empilhado por categoria. Dos 30 painéis do Kibana, todos menos 5 pizzas e 4 números métricos são mapeados para esta guia. |
| Table | Linhas tabulares com colunas ordenáveis; aceita groupBy + várias agregações (count, avg, quantile etc.). | data_table, visualização de tabela lens | Quando você quer números exatos em uma lista ordenável, em vez de codificação visual (por exemplo, "os 100 principais caminhos com contagem, latência p50 e taxa de erros lado a lado"). |
| Number | Um bloco com um único número grande — geralmente uma agregação (count, sum, avg, quantile). | metric, goal | KPIs com uma única estatística ("contagem de erros 5xx", "tempo médio de resposta"). |
| Pie | Gráfico de rosca/pizza mostrando a proporção de cada grupo. | pie | Distribuição categórica na qual interessa a proporção, não o volume absoluto (distribuição de códigos de status, severidade ou linguagens). |
| Search | Painel de pesquisa de logs em tempo real com facetas — a mesma visualização Search da barra lateral, fixada em um espaço de gráfico. | Saved Search do Kibana incorporada como painel | Adicione um fluxo de erros recentes a um dashboard junto às séries temporais. |
| Markdown | Bloco de texto estático, incluindo links e títulos. | Visualização Markdown do Kibana | Adicione uma narrativa, runbooks ou links entre dashboards. |
Onde está "Histogram"? O Kibana tem uma visualização explícita "Histogram" (contagens divididas em buckets por campo numérico ou de data). O HyperDX a incorpora à guia Line/Bar — escolha um
groupBynumérico ou de data, selecione bar como formato e você terá um histograma. A faixa de histograma independente exibida no topo da visualização Search na Etapa C é renderizada automaticamente e não é um gráfico criado manualmente.
Principais diferenças de nomes de colunas em relação ao ECS do Kibana:
request_path→RequestPath(bruto) ouRequestPage(somente caminho, recomendado para agrupamento);request_type→RequestType(método 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→ derivado deStatusCode(1xx–3xx sucesso / 4xx–5xx falha nos traces);transaction.duration.us(μs) →Duration(nanossegundos — divida por 1000 para μs).
Visão geral do tráfego web — 8 painéis
Filtre todos apenas para logs de acesso web: no AI Assistant ou no campo Where do gráfico, adicione RequestType != ''.
| # | Painel original do Kibana | Instrução do AI Assistant | Fonte | Gráfico | Dica de campo |
|---|---|---|---|---|---|
| 1 | Solicitações ao longo do tempo | Requests over time grouped by minute for the past 1 hour where RequestType is not empty | log | Line/Bar (linha) | count() dividido em buckets de tempo |
| 2 | Distribuição de códigos de status | Distribution of StatusCode as a pie chart for the past 1 hour where RequestType is not empty | log | Pie | groupBy(StatusCode) |
| 3 | Contagem de erros 5xx | Total count of events where StatusCode is greater than or equal to 500 in the past 1 hour | log | Number | countIf(StatusCode >= 500) |
| 4 | Tempo médio de resposta (s) | Average of LogAttributes['run_time'] for the past 1 hour where RequestType is not empty | log | Number | avg(toFloat64OrZero(LogAttributes['run_time'])) |
| 5 | Principais caminhos de solicitação | Top 10 RequestPage by event count for the past 1 hour where RequestType is not empty | log | Line/Bar (barra horizontal) | groupBy(RequestPage) decrescente |
| 6 | Principais países | Top 10 GeoCountry by event count for the past 1 hour where RequestType is not empty and GeoCountry is not empty | log | Line/Bar (barra horizontal) | groupBy(GeoCountry) |
| 7 | Distribuição de métodos HTTP | Distribution of RequestType (GET, POST, etc.) as a pie chart for the past 1 hour | log | Pie | groupBy(RequestType) |
| 8 | Principais 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 (barra horizontal) | groupBy(BrowserFamily) |
Integridade dos aplicativos — 5 painéis
Logs de aplicativos são as linhas nas quais o nível está definido, mas RequestType está vazio (o acesso web tem ambos). Filtro: LogLevel != '' AND RequestType = ''.
| # | Painel original do Kibana | Instrução do AI Assistant | Fonte | Gráfico | Dica de campo |
|---|---|---|---|---|---|
| 9 | Volume de logs por severidade | Log volume over time stacked by SeverityText for the past 1 hour where RequestType is empty and SeverityText is not empty | log | Line/Bar (área empilhada) | count() dividido em buckets de tempo, groupBy(SeverityText) |
| 10 | Distribuição de níveis de log | Distribution of SeverityText as a pie chart for the past 1 hour where RequestType is empty | log | Pie | groupBy(SeverityText) |
| 11 | Contagem de erros | Count of error logs for the past 1 hour where SeverityText equals 'ERROR' and RequestType is empty | log | Number | countIf(SeverityText='ERROR') |
| 12 | Erros por serviço | Top 10 ServiceName by error count for the past 1 hour where SeverityText equals 'ERROR' and RequestType is empty | log | Line/Bar (barra horizontal) | groupBy(ServiceName) dos erros |
| 13 | Volume de erros ao longo do tempo | Error log volume over time grouped by minute for the past 1 hour where SeverityText equals 'ERROR' and RequestType is empty | log | Line/Bar (linha) | count() dividido em buckets de tempo |
Visão geral da infraestrutura — 4 painéis
As linhas de infraestrutura (syslog) têm ServiceName começando por k8s- (o regex_parser promove o hostname do syslog a service.name). Filtro: ServiceName LIKE 'k8s-%'.
| # | Painel original do Kibana | Instrução do AI Assistant | Fonte | Gráfico | Dica de campo |
|---|---|---|---|---|---|
| 14 | Volume de syslog por host | Log volume over time stacked by ServiceName for the past 1 hour where ServiceName starts with k8s- | log | Line/Bar (área empilhada) | ServiceName é o host aqui |
| 15 | Principais processos | Top 10 LogAttributes['process'] by event count for the past 1 hour where ServiceName starts with k8s- | log | Line/Bar (barra horizontal) | groupBy(LogAttributes['process']) — troque para o modo SQL se o assistente tiver dificuldade com a sintaxe de chave de Map |
| 16 | Distribuição de severidade | Distribution of SeverityText as a pie chart for the past 1 hour where ServiceName starts with k8s- | log | Pie | groupBy(SeverityText) |
| 17 | Volume de logs por processo | 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 (área empilhada) | mesma ressalva sobre chave de Map do nº 15 |
OTel Demo — Traces APM — 6 painéis
Os traces fluem para otel.otel_traces. Troque a fonte de dados do AI Assistant para Traces antes de executar estas instruções.
| # | Painel original do Kibana | Instrução do AI Assistant | Fonte | Gráfico | Dica de campo |
|---|---|---|---|---|---|
| 18 | Volume de traces APM | Trace span volume over time grouped by minute for the past 1 hour | Traces | Line/Bar (linha) | count() dividido em buckets de tempo |
| 19 | Distribuição de resultados dos traces | Pie chart of trace outcome (StatusCode = 0 or empty as success, otherwise failure) for the past 1 hour | Traces | Pie | Alternativa em SQL: if(StatusCode IN ('','STATUS_CODE_OK','STATUS_CODE_UNSET'),'success','failure') como chave de agrupamento |
| 20 | Códigos de status HTTP | Distribution of SpanAttributes['http.response.status_code'] as a pie chart for the past 1 hour | Traces | Pie | Apenas spans de servidor HTTP têm este atributo; adicione Where SpanAttributes['http.response.status_code'] != '' |
| 21 | Distribuição de linguagens dos serviços | Pie chart of ResourceAttributes['telemetry.sdk.language'] for the past 1 hour | Traces | Pie | A OTel Demo emite este atributo de recurso; o nome do campo é telemetry.sdk.language (não service.language.name como no ECS) |
| 22 | Principais serviços por contagem de spans | Top 10 ServiceName by span count for the past 1 hour | Traces | Line/Bar (barra horizontal) | groupBy(ServiceName) |
| 23 | Principais nomes de transações | Top 10 SpanName by event count for the past 1 hour where SpanKind equals 'SPAN_KIND_SERVER' or SpanKind equals 'Server' | Traces | Line/Bar (barra horizontal) | groupBy(SpanName) filtrado por spans de servidor (as "transações" do Kibana) |
OTel Demo — Latência — 4 painéis
| # | Painel original do Kibana | Instrução do AI Assistant | Fonte | Gráfico | Dica de campo |
|---|---|---|---|---|---|
| 24 | Duração média das transações ao longo do tempo | Average Duration in milliseconds over time grouped by minute for the past 1 hour where SpanKind is 'SPAN_KIND_SERVER' | Traces | Line/Bar (linha) | avg(Duration / 1e6) para ms (Duration está em ns). O Kibana mostrava μs — use 1e3 se quiser corresponder |
| 25 | Duração média por serviço | Top 10 ServiceName by average Duration in milliseconds for the past 1 hour where SpanKind is 'SPAN_KIND_SERVER' | Traces | Line/Bar (barra horizontal) | avg(Duration / 1e6) agrupado por ServiceName |
| 26 | Transações com falha por serviço | Top 10 ServiceName by count of spans where StatusCode equals 'STATUS_CODE_ERROR' for the past 1 hour | Traces | Line/Bar (barra horizontal) | O marcador de falha é StatusCode = 'STATUS_CODE_ERROR' |
| 27 | Transações com falha ao longo do tempo | Count of spans over time grouped by minute where StatusCode equals 'STATUS_CODE_ERROR' for the past 1 hour | Traces | Line/Bar (linha) | Mesmo filtro do nº 26 |
OTel Demo — Logs — 3 painéis
Os registros de log da OTel Demo chegam a otel.otel_logs_v2 a partir dos serviços da OTel Demo (frontend-proxy, cart, checkout etc.). Eles não têm RequestType nem LogLevel materializados — diferencie-os com ServiceName NOT LIKE 'k8s-%' AND RequestType = ''.
| # | Painel original do Kibana | Instrução do AI Assistant | Fonte | Gráfico | Dica de campo |
|---|---|---|---|---|---|
| 28 | Volume de logs OTel por serviço | Log volume over time stacked by ServiceName for the past 1 hour where ServiceName not like 'k8s-%' and RequestType is empty | log | Line/Bar (área empilhada) | count() dividido em buckets de tempo, groupBy(ServiceName) |
| 29 | Principais serviços por volume de logs | Top 10 ServiceName by log count for the past 1 hour where ServiceName not like 'k8s-%' and RequestType is empty | log | Line/Bar (barra horizontal) | groupBy(ServiceName) |
| 30 | Logs OTel por linguagem do serviço | Pie chart of ResourceAttributes['telemetry.sdk.language'] for the past 1 hour where ServiceName not like 'k8s-%' and RequestType is empty | log | Pie | Mesma ressalva do trace nº 21 — o campo é telemetry.sdk.language, não service.language.name |
Dicas para quando o AI Assistant errar
- Troque para o modo SQL no seletor
Where. O AI Assistant gera um gráfico parcialmente preenchido; você pode editar qualquer campo manualmente. O seletor de esquema (botão Schema ao lado da fonte de dados) mostra todas as colunas e seus tipos. - Fixe o intervalo de tempo. O assistente respeita "for the past N hours / today / yesterday", mas usa o seletor de intervalo do gráfico por padrão se você omitir isso. Defina explicitamente o intervalo no seletor antes de salvar.
- Colunas do tipo Map (
LogAttributes,ResourceAttributes,SpanAttributes) costumam ser um obstáculo para o assistente. Se ele gerarWHERE process = 'kernel'em vez deWHERE LogAttributes['process'] = 'kernel', corrija no modo SQL. - Salve a versão funcional com Chart Name preenchido e adicione os gráficos a um dashboard do HyperDX para ter uma visualização de página única equivalente ao dashboard original do Kibana.
Próximos passos
- Service Map (barra lateral, beta) — visualiza o grafo de chamadas dos microsserviços da OTel Demo a partir de
otel_traces. Nenhuma configuração além da fonte Traces é necessária. - Alerts — defina alertas em qualquer pesquisa ou gráfico salvo. Você usará esse recurso na Etapa 8 do README principal; consulte README.md § Etapa 8 Opção A para ver os dois alertas recomendados (
web-5xx-errors, heartbeat do serviço). - Notebooks (prévia) — combine gráficos, consultas e comentários em Markdown em investigações compartilháveis.
Quando terminar a exploração, volte à Etapa 6 do README.md para verificar se o TTL está configurado.
Solução de problemas
A lista Sources fica vazia após salvar.
O HyperDX armazena em cache as definições de fontes por sessão do navegador. Faça uma recarga forçada da guia (Cmd-Shift-R / Ctrl-Shift-R). Se continuar vazia, verifique Team Settings → Data → Server Connection — deve ser Default e apontar para o mesmo serviço do CH Cloud.
Search não mostra linhas, mas validate_migration.sh relata milhares.
- Verifique o seletor de intervalo — o padrão é "Last 15 minutes". Aumente para "Last 24 hours" se o coletor foi iniciado recentemente.
- Confirme que
Default Selectda fonte usaTimestampTime(nãoTimestamp). Sintoma: o histograma aparece, mas a tabela mostra "no rows". - Confirme que Database da fonte é
otel(nãodefault).
O AI Assistant retorna "I couldn't translate that." O assistente é limitado ao esquema da fonte selecionada. Correções comuns:
- Troque a fonte de dados: perguntas sobre traces ("p95 latency") precisam da fonte
Traces, não delog. - Seja explícito quanto ao campo:
count by ServiceNamefunciona melhor quecount by service.