Instrumentação Frontend com Grafana Faro Web SDK
Guia completo para instrumentar aplicações frontend com o Grafana Faro Web SDK, enviando dados de observabilidade para o Collector FE da Elven.
O Collector FE é implantado na infraestrutura do cliente e recebe os dados do Faro SDK via HTTP, encaminhando para o Grafana Loki. Consulte a documentação do Collector FE para detalhes de deploy.
Índice
O que o Faro captura
Instalação
Configuração base
React
React Router v7 (Data Router)
React Router v6 (Data Router)
ErrorBoundary
Component Profiling
Identificação do usuário logado
Next.js
App Router (Next.js 14+)
Pages Router
Angular
Vue.js
Vanilla JavaScript / HTML
OpenTelemetry Tracing
Sinais customizados
Eventos
Logs
Medições
User Actions
Session Tracking
Web Vitals
Identificação de usuário
View Tracking
Sampling
CORS e segurança
Variáveis de ambiente por framework
Boas práticas
Troubleshooting
FAQ
O que o Faro captura
O Faro Web SDK v2 coleta automaticamente:
Web Vitals
LCP, INP, CLS, FCP, TTFB (Web Vitals v5)
LCP = 2.1s
Erros JavaScript
Exceções não tratadas, com stacktrace
TypeError: Cannot read property 'x' of undefined
Console
Interceptação de console.log/warn/error/info
console.error('Falha no checkout')
Navegação
Mudanças de rota (SPA) e page loads
/home → /checkout
Sessões
Tracking de sessão com lifecycle events
session_start, session_resume
Eventos customizados
Interações de negócio
Clique em "Comprar", busca realizada
Logs customizados
Logs estruturados enviados manualmente
Debug info, warnings
Medições
Métricas de performance da aplicação
Tempo de renderização, tempo de busca
User Actions
Interações do usuário com spans automáticos
Click, submit, drag
Traces
Distributed tracing via OpenTelemetry-JS
Fetch requests com trace context
Instalação
NPM / Yarn / pnpm
O pacote @grafana/faro-react já inclui tudo de @grafana/faro-web-sdk, então para projetos React basta instalar @grafana/faro-react + @grafana/faro-web-tracing.
CDN (sem bundler)
Configuração base
Crie um arquivo dedicado para o Faro e importe-o antes de qualquer outro código no entry point da aplicação.
src/faro.ts
src/faro.tsURL do Collector FE
A URL segue o formato:
O <tenant> identifica o produto/cliente no Loki, e o <jwt-token> é o JWT de autenticação. Consulte a documentação do Collector FE para gerar o token.
React
React Router v7 (Data Router)
React Router v6 (Data Router)
ErrorBoundary
O @grafana/faro-react inclui um ErrorBoundary que captura erros de renderização e envia automaticamente para o Faro:
Pode ser usado em qualquer nível da árvore de componentes para capturar erros granularmente:
Component Profiling
Meça o tempo de renderização de componentes específicos:
Os dados de profiling são enviados como measurements com o tipo component_render e incluem tempos de mount e update.
Identificação do usuário logado
Sincronize o usuário autenticado com o Faro para correlacionar sessões com usuários reais:
Next.js
App Router (Next.js 14+)
Com o App Router, o Faro deve ser inicializado apenas no client side:
Sincronizar usuário logado (Next.js + NextAuth/Auth.js):
Pages Router
Angular
O Faro não tem um pacote específico para Angular, mas integra-se usando o SDK base com um service:
ErrorHandler global para capturar erros Angular:
Vue.js
Vanilla JavaScript / HTML
OpenTelemetry Tracing
O tracing conecta o frontend ao backend, permitindo rastrear uma requisição do clique do usuário até o banco de dados.
Configuração com TracingInstrumentation
TracingInstrumentationCriar spans manuais
Span com contexto propagado
Sinais customizados
Eventos
Eventos rastreiam interações de negócio e comportamento do usuário:
Logs
Logs estruturados com nível e contexto:
Medições
Métricas de performance específicas da aplicação:
User Actions
O Faro v2 rastreia interações do usuário automaticamente, criando spans que agrupam todos os efeitos colaterais (fetch requests, DOM updates, etc.) de uma ação.
Automático via atributo HTML
Programático
User actions completam automaticamente 100ms após o último evento vinculado. Para requests pendentes, o timeout é configurável até 10 segundos.
Session Tracking
Sessões agrupam todas as interações de um usuário em uma visita.
Comportamento padrão
Duração máxima: 4 horas
Timeout de inatividade: 15 minutos
Persistência: com
persistent: true, a sessão sobrevive a reloads da página (vialocalStorage)Eventos de lifecycle:
session_start,session_resume,session_extend
Configuração
Acessar o ID da sessão
O header x-faro-session-id é automaticamente incluído nas requests para o Collector FE, permitindo correlação com dados de backend.
Web Vitals
O Faro v2 captura automaticamente as Web Vitals v5:
LCP
Largest Contentful Paint
≤ 2.5s
≤ 4.0s
> 4.0s
INP
Interaction to Next Paint
≤ 200ms
≤ 500ms
> 500ms
CLS
Cumulative Layout Shift
≤ 0.1
≤ 0.25
> 0.25
FCP
First Contentful Paint
≤ 1.8s
≤ 3.0s
> 3.0s
TTFB
Time to First Byte
≤ 800ms
≤ 1800ms
> 1800ms
Faro v2: A métrica FID (First Input Delay) foi removida e substituída por INP (Interaction to Next Paint). A atribuição de Web Vitals é coletada por padrão.
Não é necessário nenhuma configuração adicional — as Web Vitals são capturadas automaticamente pelo getWebInstrumentations().
Identificação de usuário
Permite correlacionar sessões com usuários reais no Grafana:
Nunca envie dados sensíveis (CPF, senha, tokens) nos atributos do usuário.
View Tracking
Marque mudanças de "view" manualmente para SPAs que não usam router integrado:
Para frameworks com integração de router (React Router, Next.js), o view tracking é automático.
Sampling
Controle o volume de dados enviados:
Cenário
samplingRate recomendado
Desenvolvimento
1 (100%)
Staging
1 (100%)
Produção — baixo tráfego (< 10k DAU)
1 (100%)
Produção — médio tráfego (10k-100k DAU)
0.5 (50%)
Produção — alto tráfego (> 100k DAU)
0.1 - 0.25
O sampling é por sessão: quando uma sessão é amostrada, todos os eventos daquela sessão são capturados. Isso garante que você tem a visão completa de cada sessão amostrada.
CORS e segurança
ALLOW_ORIGINS no Collector FE
O Collector FE valida a origem das requests via CORS. Configure ALLOW_ORIGINS com os domínios da sua aplicação:
Content Security Policy (CSP)
Se sua aplicação usa CSP, adicione o domínio do Collector FE:
Dados sensíveis
O Faro captura URLs, console logs e payloads de erro. Garanta que:
Tokens e credenciais nunca apareçam em URLs
Console logs não contenham dados PII
Mensagens de erro não exponham dados de negócio
Variáveis de ambiente por framework
React (Vite)
React (Create React App)
Next.js
Angular
Vue.js (Vite)
Boas práticas
Inicialização
Inicialize o Faro antes de qualquer outro código — isso garante que erros durante a inicialização da app sejam capturados
Separe a configuração em um arquivo dedicado (
src/faro.ts) e importe no entry pointUse variáveis de ambiente para a URL do Collector FE — nunca hardcode tokens no código
Eventos e logs
Nomeie eventos com padrão consistente — use
snake_casee prefixos por domínio:checkout.completed,search.performed,auth.login_failedNão envie dados sensíveis — CPF, senhas, tokens, números de cartão nunca devem aparecer em eventos, logs ou atributos
Use domínios para agrupar eventos — o terceiro parâmetro de
pushEventagrupa eventos logicamente
Performance
Habilite batching — reduz o número de requests HTTP para o Collector FE
Habilite dedupe — evita envio de sinais duplicados (erros em loop, por exemplo)
Ajuste o samplingRate em produção — para apps com alto tráfego, 10-25% é suficiente
Tracing
Configure
propagateTraceHeaderCorsUrls— sem isso, as requests para APIs externas não terão trace contextInclua apenas APIs próprias — nunca propague trace headers para APIs de terceiros (pode vazar informação)
Deploy
Faça upload de source maps — sem eles, os stacktraces de erros ficam ilegíveis em produção
Versionamento — sempre preencha
app.versioncom a versão real do deploy para correlacionar erros com releases
Troubleshooting
Nenhum dado aparece no Grafana
Abra o DevTools do browser → aba Network
Filtre por
collectpara encontrar as requests do FaroVerifique:
Status 200: dados estão sendo enviados com sucesso
Status 0 / CORS error: o domínio não está em
ALLOW_ORIGINSdo Collector FEStatus 401: o JWT na URL é inválido
Nenhuma request: o Faro não foi inicializado (verifique o import no entry point)
Erros CORS no console
Solução: Adicione o domínio da sua aplicação em ALLOW_ORIGINS no Collector FE e reinicie o serviço.
Traces não propagam para o backend
Verifique que
TracingInstrumentationestá nas instrumentationsConfirme que a URL da API está em
propagateTraceHeaderCorsUrlsO backend deve aceitar os headers
traceparentetracestatevia CORS
Web Vitals não aparecem
Web Vitals são coletadas apenas em page loads reais (não em SPAs sem reload)
Algumas métricas (LCP, CLS) só são reportadas quando o usuário sai da página ou ela vai para background
Em desenvolvimento com Hot Module Replacement, os valores podem ser inconsistentes
Console logs não são capturados
Verifique que captureConsole: true está configurado:
Dados duplicados
Habilite o dedupe:
FAQ
O Faro SDK aumenta o bundle size da minha aplicação?
O @grafana/faro-web-sdk tem ~15 KB gzipped. O @grafana/faro-web-tracing adiciona mais ~45 KB gzipped (por incluir OpenTelemetry-JS). Use tree-shaking e lazy loading para minimizar o impacto.
Posso usar o Faro com micro-frontends / composable frontends?
Sim. Inicialize o Faro uma vez no shell/host application e compartilhe a instância com os micro-frontends. Use faro.api.setView() para marcar qual micro-frontend está ativo.
O Faro funciona com SSR (Server-Side Rendering)?
O Faro é client-side only. Em frameworks com SSR (Next.js, Nuxt), garanta que a inicialização ocorra apenas no browser (use typeof window !== 'undefined' ou diretivas 'use client').
Posso usar o Faro sem o TracingInstrumentation?
Sim. O tracing é opcional. Sem ele, você ainda captura Web Vitals, erros, console logs, eventos, medições e sessões.
O que acontece se o Collector FE estiver fora do ar?
O Faro descarta os dados silenciosamente — não causa erros visíveis para o usuário nem afeta a performance da aplicação.
Como faço para filtrar dados no Grafana por aplicação?
Use o label app no Loki:
Para filtrar por tipo de dado:
Qual a diferença entre pushEvent e pushLog?
pushEventé para interações de negócio (compras, buscas, cliques) — aparece como evento com nome e atributospushLogé para informações operacionais (debug, warnings, erros) — aparece como log com nível e contexto
Como funciona o sampling por sessão?
Quando samplingRate: 0.1, o Faro decide na criação da sessão se ela será amostrada (10% de chance). Se a sessão for amostrada, todos os dados daquela sessão são capturados. Sessões não amostradas não enviam nenhum dado.
Last updated
Was this helpful?

