For the complete documentation index, see llms.txt. This page is also available as Markdown.

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:

Sinal
Descrição
Exemplo

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

URL 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

Criar 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 (via localStorage)

  • 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:

Métrica
Nome
Bom
Precisa melhorar
Ruim

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

  1. Inicialize o Faro antes de qualquer outro código — isso garante que erros durante a inicialização da app sejam capturados

  2. Separe a configuração em um arquivo dedicado (src/faro.ts) e importe no entry point

  3. Use variáveis de ambiente para a URL do Collector FE — nunca hardcode tokens no código

Eventos e logs

  1. Nomeie eventos com padrão consistente — use snake_case e prefixos por domínio: checkout.completed, search.performed, auth.login_failed

  2. Não envie dados sensíveis — CPF, senhas, tokens, números de cartão nunca devem aparecer em eventos, logs ou atributos

  3. Use domínios para agrupar eventos — o terceiro parâmetro de pushEvent agrupa eventos logicamente

Performance

  1. Habilite batching — reduz o número de requests HTTP para o Collector FE

  2. Habilite dedupe — evita envio de sinais duplicados (erros em loop, por exemplo)

  3. Ajuste o samplingRate em produção — para apps com alto tráfego, 10-25% é suficiente

Tracing

  1. Configure propagateTraceHeaderCorsUrls — sem isso, as requests para APIs externas não terão trace context

  2. Inclua apenas APIs próprias — nunca propague trace headers para APIs de terceiros (pode vazar informação)

Deploy

  1. Faça upload de source maps — sem eles, os stacktraces de erros ficam ilegíveis em produção

  2. Versionamento — sempre preencha app.version com a versão real do deploy para correlacionar erros com releases


Troubleshooting

Nenhum dado aparece no Grafana

  1. Abra o DevTools do browser → aba Network

  2. Filtre por collect para encontrar as requests do Faro

  3. Verifique:

    • Status 200: dados estão sendo enviados com sucesso

    • Status 0 / CORS error: o domínio não está em ALLOW_ORIGINS do Collector FE

    • Status 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

  1. Verifique que TracingInstrumentation está nas instrumentations

  2. Confirme que a URL da API está em propagateTraceHeaderCorsUrls

  3. O backend deve aceitar os headers traceparent e tracestate via 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 atributos

  • pushLog é 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?