Guía paso a paso de HyperDX
Configura fuentes de ClickStack, busca telemetría en tiempo real y recrea los dashboards de Kibana con AI Assistant.
HyperDX es la interfaz de observabilidad integrada en ClickStack e incluida en cada servicio de ClickHouse Cloud. Esta guía cubre cuatro tareas:
- Iniciar ClickStack desde el console de Cloud.
- Crear tres fuentes de datos, para trazas, logs y métricas OTEL, apuntando a la base
otelrellenada en el Paso 2. - Buscar logs en tiempo real en Search para confirmar el flujo.
- Crear un gráfico con el asistente de IA sin escribir SQL.
Requisitos previos: El Paso 4 de README.md pasó sin errores;
otel.otel_logs_v2,otel.otel_tracesyotel.otel_metrics_*reciben datos, confirmado mediantebash scripts/validate_migration.sh.
Paso A — Iniciar ClickStack
- Entra en clickhouse.cloud y abre el servicio aprovisionado en el Paso 1 del README.
- En la barra lateral izquierda del console SQL, baja hasta el final. Haz clic en el icono ↗ junto a ClickStack (Beta).
- ClickStack se abre en otra pestaña y autentica mediante SSO de Cloud.

Qué debes ver primero: la base
otelen el selector, con las 11 tablas, 3 vistas materializadas y 2 diccionarios del Paso 2:otel_logs,otel_logs_v2,otel_traces,otel_metrics_*(5 tablas),geoip_data+geoip_country/geoip_city(1 tabla + 2 diccionarios),alert_error_rate*,logs_summary_1min*. Si falta algo, vuelve a ejecutarclickhouse/dictionaries.sql,clickhouse/schema.sqlyclickhouse/alert-tables.sql.
Paso B — Crear las tres fuentes de datos
HyperDX consulta ClickHouse mediante «fuentes» con nombre que vinculan una pestaña (Search, Service Map, Chart Explorer, etc.) a una tabla y una convención de columnas. Crea una por tipo de señal.
Abre Team Settings abajo a la izquierda y después Data → Sources. Haz clic en Add source.
B.1 — Fuente de trazas
| 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 |

Haz clic en Save Source. Debe aparecer el resumen Trace, Default, otel.otel_traces.
B.2 — Fuente de logs
Haz clic de nuevo en Add source y configura:
| 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 qué
TimestampTimey noTimestamp?TimestampesDateTime64(9)(nanosegundos). El selector temporal y los buckets de HyperDX usan precisiónDateTime; la columna materializadaTimestampTimeevita conversiones implícitas en cada consulta.

B.3 — Fuente de métricas OTEL
Haz clic en Add source y configura:
| 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 |
La fuente abarca las cinco tablas porque OTel representa cada tipo con formas distintas. HyperDX elige la tabla según la métrica. Correlated Log Source = log permite saltar de un gráfico a los logs relacionados.

Al guardar, Sources debe mostrar Traces, log y otel_metrics, una entrada por fuente.
Paso C — Buscar logs en tiempo real
Haz clic en Search y selecciona la fuente log.
Debes ver:
- Un histograma de recuentos (elige "Last 15 minutes" o "Last 1 hour")
- Una tabla con
Timestamp,service,level,body - Una barra de facetas con campos como
ServiceNameySeverityText

Prueba lo siguiente:
- Filtrar por servicio: pulsa
inventory-serviceen la facetaServiceName; la tabla se filtra en una fracción de segundo. - Buscar texto: escribe
error. El índice de saltotext(tokenizer='sparseGrams')deBodyen schema.sql lo acelera frente a una exploración completa. - Inspeccionar una fila: ábrela; cada clave de
LogAttributesse convierte en filtro.
Intervalo temporal:
start_at: endhace que las líneas anteriores al Paso 3b no estén enotel_logs_v2. Si "Last 24 hours" está vacío al principio, es normal: los datos comienzan con el collector.
Paso D — Crear un gráfico con el asistente de IA
AI Assistant de HyperDX (etiquetado Experimental) traduce lenguaje natural a gráficos.
-
Haz clic en Chart Explorer.
-
Activa AI Assistant [A].
-
Con
logseleccionado, escribe por ejemplo:Error count by services for past 2 hours
-
Pulsa Enter. El asistente rellena tipo (Line/Bar), fuente (
log), agregación (Count of Events) y cláusulaWhere(SeverityText = 'ERROR'). -
Ajusta intervalo o tipo con (
Line/Bar,Table,Number,Pie,Search,Markdown).

Guarda mediante Chart Name y el icono; aparecerá en Saved Searches / Dashboards.
Biblioteca de prompts — recrear todos los paneles de Kibana de la Parte 1
Los seis dashboards contienen 30 paneles. Las tablas ofrecen un prompt por panel:
- Fuente: selecciónala antes (
logparaotel_logs_v2,Tracesparaotel_traces,otel_metricspara métricas). - Gráfico: pestaña del tipo de gráfico; consulta la leyenda.
- Filtro: muchos paneles estaban limitados implícitamente por flujo. En ClickHouse se expresa con
Where; si no se detecta, cambia al modo SQL y añade elWheresugerido. - Alternativa de campo: si queda vacío, edita
Where/ agregación con la Pista de campo.
Tipos de gráficos de HyperDX — leyenda
Chart Explorer ofrece (Line/Bar, Table, Number, Pie, Search, Markdown):
| Pestaña | Qué muestra | Sustituye en Kibana | Cuándo usarla |
|---|---|---|---|
| Line/Bar | Gráfico 2D de líneas, áreas o barras, con tiempo en X al agrupar por fecha. La forma se elige dentro de la pestaña. | line, area, vertical_bar, horizontal_bar | Series, barras «top N» o áreas apiladas. Todos los paneles salvo 5 pizzas y 4 números se mapean aquí. |
| Table | Filas ordenables; admite groupBy + varias agregaciones (count, avg, quantile, etc.). | data_table, vista de tabla lens | Cifras exactas en listas, no codificación visual. |
| Number | Una cifra grande, normalmente una agregación (count, sum, avg, quantile). | metric, goal | KPI de una estadística. |
| Pie | Rosca/pizza con proporciones. | pie | Distribuciones donde importa la proporción. |
| Search | Panel de búsqueda en tiempo real con facetas. | Saved Search incrustada | Flujo de errores recientes junto a series. |
| Markdown | Texto estático con enlaces y encabezados. | Markdown | Narrativa, runbooks y enlaces. |
¿Dónde está "Histogram"? HyperDX lo integra en Line/Bar: elige un
groupBynumérico o de fecha y forma bar. El histograma de Search del Paso C se renderiza automáticamente y no se crea a mano.
Diferencias de columnas respecto a ECS:
request_path→RequestPathoRequestPage;request_type→RequestType;status→StatusCode;geo.country_name→GeoCountry;user_agent_parsed.name→BrowserFamily;service/service.name→ServiceName;level→LogLeveloSeverityText;event.severity→SeverityText;hostname→HostName;event.outcome→ derivado deStatusCode;transaction.duration.us(μs) →Duration(nanosegundos, divide por 1000 para μs).
Visión general del tráfico web — 8 paneles
Filtra a logs web añadiendo RequestType != '' en AI Assistant o Where.
En Kibana, este dashboard consultaba logs-web_access-lab.
| # | Panel original | Prompt de AI Assistant | Fuente | Gráfico | Pista de campo |
|---|---|---|---|---|---|
| 1 | Solicitudes en el tiempo | Requests over time grouped by minute for the past 1 hour where RequestType is not empty | log | Line/Bar (línea) | count() por tiempo |
| 2 | Distribución de estados | Distribution of StatusCode as a pie chart for the past 1 hour where RequestType is not empty | log | Pie | groupBy(StatusCode) |
| 3 | Recuento de errores 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 | Tiempo medio de respuesta (s) | Average of LogAttributes['run_time'] for the past 1 hour where RequestType is not empty | log | Number | avg(toFloat64OrZero(LogAttributes['run_time'])) |
| 5 | Rutas principales | Top 10 RequestPage by event count for the past 1 hour where RequestType is not empty | log | Line/Bar (barra horizontal) | groupBy(RequestPage) desc |
| 6 | Países principales | 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 | Distribución de métodos HTTP | Distribution of RequestType (GET, POST, etc.) as a pie chart for the past 1 hour | log | Pie | groupBy(RequestType) |
| 8 | Principales 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) |
Salud de aplicaciones — 5 paneles
Los logs de aplicación tienen nivel, pero RequestType vacío. Filtro: LogLevel != '' AND RequestType = ''.
| # | Panel original | Prompt de AI Assistant | Fuente | Gráfico | Pista de campo |
|---|---|---|---|---|---|
| 9 | Volumen por severidad | 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 apilada) | count() por tiempo, groupBy(SeverityText) |
| 10 | Distribución de niveles | Distribution of SeverityText as a pie chart for the past 1 hour where RequestType is empty | log | Pie | groupBy(SeverityText) |
| 11 | Recuento de errores | Count of error logs for the past 1 hour where SeverityText equals 'ERROR' and RequestType is empty | log | Number | countIf(SeverityText='ERROR') |
| 12 | Errores por servicio | 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) de errores |
| 13 | Errores en el tiempo | Error log volume over time grouped by minute for the past 1 hour where SeverityText equals 'ERROR' and RequestType is empty | log | Line/Bar (línea) | count() por tiempo |
Visión general de infraestructura — 4 paneles
Las filas syslog tienen ServiceName comenzando por k8s- (regex_parser promueve el hostname a service.name). Filtro: ServiceName LIKE 'k8s-%'.
| # | Panel original | Prompt de AI Assistant | Fuente | Gráfico | Pista de campo |
|---|---|---|---|---|---|
| 14 | Volumen syslog por host | Log volume over time stacked by ServiceName for the past 1 hour where ServiceName starts with k8s- | log | Line/Bar (área apilada) | ServiceName es el host |
| 15 | Procesos principales | 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']); usa SQL si falla la sintaxis Map |
| 16 | Distribución de severidad | Distribution of SeverityText as a pie chart for the past 1 hour where ServiceName starts with k8s- | log | Pie | groupBy(SeverityText) |
| 17 | Volumen por proceso | 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 apilada) | misma salvedad Map que nº 15 |
OTel Demo — Trazas APM — 6 paneles
Las trazas llegan a otel.otel_traces. Cambia la fuente a Traces.
| # | Panel original | Prompt de AI Assistant | Fuente | Gráfico | Pista de campo |
|---|---|---|---|---|---|
| 18 | Volumen de trazas APM | Trace span volume over time grouped by minute for the past 1 hour | Traces | Line/Bar (línea) | count() por tiempo |
| 19 | Distribución de resultados | Pie chart of trace outcome (StatusCode = 0 or empty as success, otherwise failure) for the past 1 hour | Traces | Pie | SQL: if(StatusCode IN ('','STATUS_CODE_OK','STATUS_CODE_UNSET'),'success','failure') como grupo |
| 20 | Estados HTTP | Distribution of SpanAttributes['http.response.status_code'] as a pie chart for the past 1 hour | Traces | Pie | Solo spans HTTP; añade Where SpanAttributes['http.response.status_code'] != '' |
| 21 | Lenguajes de servicios | Pie chart of ResourceAttributes['telemetry.sdk.language'] for the past 1 hour | Traces | Pie | El campo es telemetry.sdk.language, no service.language.name de ECS |
| 22 | Servicios por spans | Top 10 ServiceName by span count for the past 1 hour | Traces | Line/Bar (barra horizontal) | groupBy(ServiceName) |
| 23 | Nombres de transacciones | 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 a spans de servidor («transacciones» de Kibana) |
OTel Demo — Latencia — 4 paneles
| # | Panel original | Prompt de AI Assistant | Fuente | Gráfico | Pista de campo |
|---|---|---|---|---|---|
| 24 | Duración media en el tiempo | Average Duration in milliseconds over time grouped by minute for the past 1 hour where SpanKind is 'SPAN_KIND_SERVER' | Traces | Line/Bar (línea) | avg(Duration / 1e6) para ms; Kibana usaba μs, usa 1e3 |
| 25 | Duración media por servicio | 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) por ServiceName |
| 26 | Transacciones fallidas por servicio | Top 10 ServiceName by count of spans where StatusCode equals 'STATUS_CODE_ERROR' for the past 1 hour | Traces | Line/Bar (barra horizontal) | fallo: StatusCode = 'STATUS_CODE_ERROR' |
| 27 | Fallos en el tiempo | Count of spans over time grouped by minute where StatusCode equals 'STATUS_CODE_ERROR' for the past 1 hour | Traces | Line/Bar (línea) | mismo filtro que nº 26 |
OTel Demo — Logs — 3 paneles
Los logs de servicios OTel Demo llegan a otel.otel_logs_v2; no tienen RequestType ni LogLevel. Distínguelos con ServiceName NOT LIKE 'k8s-%' AND RequestType = ''.
| # | Panel original | Prompt de AI Assistant | Fuente | Gráfico | Pista de campo |
|---|---|---|---|---|---|
| 28 | Volumen OTel por servicio | 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 apilada) | count() por tiempo, groupBy(ServiceName) |
| 29 | Servicios por volumen | 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 por lenguaje | Pie chart of ResourceAttributes['telemetry.sdk.language'] for the past 1 hour where ServiceName not like 'k8s-%' and RequestType is empty | log | Pie | Igual que nº 21: telemetry.sdk.language, no service.language.name |
Consejos cuando AI Assistant se equivoca
- Cambia a SQL en
Where. Puedes editar cualquier campo; el selector Schema muestra columnas y tipos. - Fija el intervalo. Respeta "for the past N hours / today / yesterday", pero si se omite usa el selector del gráfico.
- Columnas Map (
LogAttributes,ResourceAttributes,SpanAttributes) suelen fallar. Si generaWHERE process = 'kernel'en lugar deWHERE LogAttributes['process'] = 'kernel', corrígelo en SQL. - Guarda la versión funcional con Chart Name y colócala en un dashboard de HyperDX.
Siguientes pasos
- Service Map (beta): visualiza las llamadas de OTel Demo desde
otel_traces; basta la fuente Traces. - Alerts: define alertas en búsquedas o gráficos. Se usan en el Paso 8; consulta README.md § Paso 8 Opción A para
web-5xx-errorsy heartbeat. - Notebooks (preview): combina gráficos, consultas y Markdown.
Al terminar, vuelve al Paso 6 de README.md y verifica TTL.
Solución de problemas
Sources queda vacío después de guardar.
HyperDX guarda definiciones por sesión. Fuerza la recarga (Cmd-Shift-R / Ctrl-Shift-R). Si sigue vacío, comprueba Team Settings → Data → Server Connection: debe ser Default y el mismo servicio CH Cloud.
Search no muestra filas, pero validate_migration.sh informa miles.
- Comprueba el intervalo, predeterminado "Last 15 minutes"; prueba "Last 24 hours".
Default Selectdebe usarTimestampTime, noTimestamp. Síntoma: histograma visible y tabla con "no rows".- Database debe ser
otel, nodefault.
AI Assistant devuelve "I couldn't translate that." El asistente se limita al esquema seleccionado:
- Preguntas de trazas ("p95 latency") necesitan
Traces, nolog. - Sé explícito:
count by ServiceNamefunciona mejor quecount by service.