Skip to main content

OpenTelemetry (OTEL)

Este módulo implementa a observabilidade completa do frontend da Smart NX, utilizando OpenTelemetry para coletar traces, métricas de performance (Web Vitals) e interações do usuário de forma segura, escalável e configurável via .env.


Estrutura de Diretórios​


src/services/observability/
│
├── context/
│ └── userContext.ts
│
├── core/
│ ├── config.ts
│ ├── logger.ts
│ └── provider.ts
│
├── hooks/
│ └── useRouteTracing.ts
│
├── instrumentations/
│ ├── rest.ts
│ └── userInteraction.ts
│
├── metrics/
│ └── webVitals.ts
│
└── index.ts

Cada módulo tem uma responsabilidade específica dentro do ecossistema OTEL — desde a configuração, até o registro e exportação dos dados de telemetria.


Configuração via .env​

A observabilidade é controlada 100% por variáveis de ambiente, permitindo ativar, ajustar o sampling e definir o endpoint OTLP de exportação.

VariávelTipoDescriçãoExemplo
VITE_ENVIRONMENTstringDefine o ambiente atual"local"
VITE_OTEL_EXPORTER_OTLP_TRACES_ENDPOINTstringEndpoint OTLP (SigNoz ou outro coletor)"https://signoz.smartnx.io/v1/traces"
VITE_OTEL_ENABLEDbooleanHabilita ou desabilita completamente a observabilidade"true"
VITE_OTEL_DEBUGbooleanExibe logs detalhados no console"true"
VITE_OTEL_USER_INTERACTIONSbooleanAtiva a instrumentação de UI (cliques, inputs, submits)"true"
VITE_OTEL_SAMPLING_ENABLEDbooleanControla se o sampling está ativo"true"
VITE_OTEL_SAMPLING_RATIOnumberPercentual de amostragem (0.0 a 1.0)"0.1"
VITE_OTEL_BATCH_DELAY_MSnumberIntervalo (ms) entre os envios de lote"7000"
VITE_OTEL_BATCH_SIZEnumberMáximo de spans por lote"256"
VITE_OTEL_QUEUE_SIZEnumberTamanho máximo da fila local"1024"
💡 Exemplo completo
VITE_ENVIRONMENT="local"
VITE_OTEL_EXPORTER_OTLP_TRACES_ENDPOINT="https://signoz.smartnx.io/v1/traces"
VITE_OTEL_ENABLED="true"
VITE_OTEL_DEBUG="true"
VITE_OTEL_USER_INTERACTIONS="true"
VITE_OTEL_SAMPLING_ENABLED="true"
VITE_OTEL_SAMPLING_RATIO="1.0"
VITE_OTEL_BATCH_DELAY_MS="7000"
VITE_OTEL_BATCH_SIZE="256"
VITE_OTEL_QUEUE_SIZE="1024"

Inicialização​

A inicialização ocorre logo na montagem do app:

import { initObservability } from "@services/observability";

initObservability();

Isso cria o TracerProvider, registra instrumentações automáticas e configura o exportador OTLP.

Instrumentações registradas
  • FetchInstrumentation → chamadas HTTP (fetch, XMLHttpRequest)
  • UserInteractionInstrumentation → cliques, inputs e submits
  • useRouteTracing → mudanças de rota (React Router / TanStack Router)
  • WebVitals → métricas de UX (LCP, CLS, INP, TTFB)

Contexto de Usuário​

O módulo context/userContext.ts cria um span chamado user.session com atributos seguros do usuário autenticado:

{
"user.id": "4",
"user.email": "matheus.telles@smartnx.com",
"user.name": "Matheus Telles",
"user.role": "Smart NX",
"user.type_id": 1,
"tenant.id": 2000,
"tenant.name": "SmartNX",
"session.license_type": 3
}
⚠️ Privacidade

Nenhum dado sensível (como CPF, senha ou token) é enviado — apenas identificadores públicos e metadados operacionais.


Tracing de Rotas​

O hook useRouteTracing cria spans automáticos de navegação:

"route.path": "/dashboard",
"route.action": "PUSH",
"screen.size": "1920x1080",
"device.type": "desktop",
"route.duration_ms": 245.37

Use-o no componente raiz da aplicação:

function App() {
useRouteTracing();
return <RouterProvider router={router} />;
}

Métricas — Web Vitals​

O módulo metrics/webVitals.ts coleta métricas UX via Web Vitals:

MétricaDescrição
LCPTempo para renderizar o maior elemento visível
CLSEstabilidade visual da interface
INPTempo de resposta às interações
TTFBTempo para o primeiro byte do servidor

Cada métrica é registrada como um span e também como um gauge no meter web-vitals.


Sampling e Batch​

Essas configurações controlam o volume e o custo do tracing:

  • Sampling (VITE_OTEL_SAMPLING_RATIO) Define o percentual de spans coletados.

    • 1.0 → coleta 100% dos traces (ideal em homolog/local)
    • 0.1 → coleta 10% (recomendado em produção)
  • Batch Export (VITE_OTEL_BATCH_DELAY_MS) Define a frequência de envio em lote ao coletor (ex: SigNoz).


Logs de Diagnóstico​

Todos os logs do OTEL passam por um logger central (core/logger.ts):

otelLog("TracerProvider registrado → env=local, sampling=1.0, batchDelay=7000ms");

Logs só são exibidos se VITE_OTEL_DEBUG="true".


Integração com SigNoz​

Os spans são exportados via OTLP/HTTP para o SigNoz:

  • Endpoint padrão: https://signoz.smartnx.io/v1/traces
  • Protocolo: OTLP/HTTP
  • Envio em lote: a cada VITE_OTEL_BATCH_DELAY_MS ms

No painel do SigNoz, filtre por:

service.name = smartnx-web-local

E visualize spans de:

  • router → navegação
  • fetch → requisições API
  • user.session → contexto do usuário
  • webvitals → performance UX

Boas Práticas​

  • Use apenas atributos genéricos e seguros no contexto de usuário.
  • Mantenha sampling reduzido em produção.
  • Habilite logs apenas em ambientes locais/homolog.
  • Nunca logue headers, tokens ou payloads sensíveis.
  • Centralize toda instrumentação no initObservability.

Resumo​

ComponenteFunção
provider.tsCria o TracerProvider e configura sampling/batch
config.tsDefine parâmetros e variáveis de ambiente OTEL
rest.tsInstrumenta chamadas HTTP
userInteraction.tsCaptura eventos de interação da UI
webVitals.tsColeta métricas de performance
userContext.tsRegistra contexto seguro do usuário autenticado
useRouteTracing.tsRastreia troca de rotas
index.tsInicializa a observabilidade globalmente

Referências​


🕓 Histórico de Versões​

DataVersãoAutor / RevisorAlterações
30/10/2025v1.0.0@Matheus TellesCriação inicial e estrutura base do documento