Este guia mostra como instrumentar uma aplicação Node.js simples usando OpenTelemetry e enviar seus logs, métricas e traces para o Managed ClickStack. O backend é instrumentado sem exigir nenhuma alteração no código-fonte da aplicação.
O HackerNews Analyzer é um pequeno aplicativo Node.js que faz consultas ao conjunto de dados do HackerNews hospedado na instância demo pública do ClickHouse. Cada gráfico, tabela e caixa de busca é alimentado por uma consulta real ao ClickHouse, portanto cada interação produz um trace cujo span principal é a chamada HTTPS do backend para o ClickHouse.
Pré-requisitos
- Um OTel collector disponível e acessível, com ingestão no seu serviço Managed ClickStack. Você precisará do endpoint OTLP dele e de um token de ingestão.
- Node 18+ e npm.
Faça o clone e execute a aplicação
Clone o repositório, instale as dependências e crie seu arquivo .env:
git clone https://github.com/ClickHouse/hn-news-analyzer.git
cd hn-news-analyzer
npm install
cp .env.example .envA fonte de dados do ClickHouse tem como padrão o cluster demo público e somente leitura, portanto o aplicativo funciona sem nenhuma configuração adicional. Inicie-o:
./run.shAbra http://localhost:5001. Você verá um seletor de ano, estatísticas resumidas, um gráfico de atividade, tabelas com os principais usuários e domínios, e um campo de busca. Explore a interface: mude de ano, abra os detalhes das histórias.

Neste ponto, o aplicativo está em execução, mas ainda não foi instrumentado. O ClickStack não mostra dados: ele está aguardando telemetria. Este é o estado "antes".
Obtenha os detalhes da conexão
A aplicação precisa de dois valores para se comunicar com o coletor:
OTEL_EXPORTER_OTLP_ENDPOINT: o endpoint OTLP que seu coletor expõe (geralmente na porta4318para OTLP via HTTP).OTEL_EXPORTER_OTLP_HEADERS: o cabeçalho de autorização que contém seu token de ingestão, no formatoauthorization=<token>.
Abra o .env e defina esses valores:
OTEL_SERVICE_NAME=hn-analyzer-api
OTEL_EXPORTER_OTLP_ENDPOINT=https://<your-collector-endpoint>:4318
OTEL_EXPORTER_OTLP_HEADERS=authorization=<your-ingestion-token>O SDK usa OTEL_EXPORTER_OTLP_HEADERS para definir o header de autorização para os três sinais: traces, métricas e logs. Se o seu collector estiver em execução localmente e não exigir autenticação, você pode deixar o valor vazio (OTEL_EXPORTER_OTLP_HEADERS=authorization=), mas a variável precisa estar presente; o SDK ignora completamente a inicialização se ela não estiver definida ou se estiver totalmente vazia.
Instrumente a aplicação
A instrumentação tem três partes: instalar os SDKs, alterar o comando de inicialização e habilitar o SDK do navegador. Nada disso altera as regras de negócio da aplicação.
Instale os SDKs
Instale os SDKs do OpenTelemetry para o backend e para o navegador:
npm install @hyperdx/node-opentelemetry @hyperdx/browserUse a CLI opentelemetry-instrument
A aplicação é iniciada por run.sh, que tem duas linhas exec na parte inferior: uma ativa e outra comentada. Troque qual delas está ativa para que o Node seja iniciado com opentelemetry-instrument:
# BEFORE: plain node, no instrumentation, collector stays silent:
-exec node scripts/entrypoint.js
+# exec node scripts/entrypoint.js
# AFTER: same source, wrapped by opentelemetry-instrument CLI.
-# exec npx opentelemetry-instrument scripts/entrypoint.js
+exec npx opentelemetry-instrument scripts/entrypoint.jsEssa é toda a alteração no backend. A instrumentação automática é carregada por opentelemetry-instrument na inicialização do processo.
Ative o SDK do navegador
Para capturar traces distribuídos (do navegador para o backend) e replay de sessão, ative o SDK do navegador em src/web/telemetry.ts. Descomente a importação e o bloco HyperDX.init({...}):
import HyperDX from '@hyperdx/browser';
export function initTelemetry(): void {
HyperDX.init({
url: __OTLP_ENDPOINT__,
apiKey: __OTLP_AUTH_TOKEN__,
service: 'hn-analyzer-web',
tracePropagationTargets: [/localhost:5001/i, /\/api\//i],
consoleCapture: true,
advancedNetworkCapture: true,
});
}Nenhuma edição adicional no .env é necessária. __OTLP_ENDPOINT__ e __OTLP_AUTH_TOKEN__ são constantes de tempo de compilação injetadas por vite.config.ts: o endpoint é OTEL_EXPORTER_OTLP_ENDPOINT, e o token é extraído de OTEL_EXPORTER_OTLP_HEADERS, os mesmos valores usados pelo backend.
Gere tráfego e visualize a telemetria
Reinicie a aplicação para que o novo comando de inicialização e o bundle do navegador recém-compilado entrem em vigor:
# Ctrl-C the previous run, then:
./run.shRecarregue a aba do navegador para que o Vite sirva o bundle atualizado. Em seguida, atualize o app algumas vezes, alterne entre os anos e clique nas histórias para gerar tráfego.
Abra a UI do ClickStack:
- Vá para Busca e filtre pelos últimos 5 minutos. Os logs de
hn-analyzer-apicomeçarão a aparecer.

- Clique em uma requisição e suba pelo trace. Você verá o span do handler do Express, um span HTTP filho apontando para o cluster do ClickHouse com a duração real da rede, além de registros
console.logcorrelacionados no mesmo trace.

- Abra Session Replay para reproduzir um vídeo com linha do tempo navegável de uma sessão do navegador, sincronizado com a linha do tempo do trace.

Logs, métricas, traces e replays de sessão chegam à mesma UI, compartilham a mesma linguagem de consulta e são correlacionados automaticamente.
Saiba mais
- Session Replay: visão geral da funcionalidade, opções de SDK e controles de privacidade.
- Session Replay Demo: uma demonstração completa com uma instância local do ClickStack.
- ClickStack Primeiros passos: implante o ClickStack e faça a ingestão dos seus primeiros dados.
- Todos os datasets de exemplo: outros datasets de exemplo e guias.