Pular para o conteúdo principal

Observabilidade e Monitoramento

Este documento descreve a stack de observabilidade do projeto: rastreamento de erros e traces (HyperDX), analytics de comportamento de usuário (GA4, Clarity, Meta Pixel), logs de processo (PM2) e monitoramento de uptime.


1. Stack de Observabilidade

FerramentaPropósitoOnde ConfigurarVariável de Ambiente
HyperDXTraces, logs server-side, erros de aplicaçãoDashboard HyperDXHYPERDX_API_KEY, OTEL_SERVICE_NAME
PM2Logs de processo e métricas de runtimeServidor de produção— (configurado no ecosystem.config.js)
Google Analytics 4Comportamento do usuário, funil de compraAdmin GA4 + NEXT_PUBLIC_GA4_IDNEXT_PUBLIC_GA4_ID
Microsoft ClarityMapas de calor, gravações de sessãoDashboard Clarity + NEXT_PUBLIC_CLARITY_IDNEXT_PUBLIC_CLARITY_ID
Meta PixelConversões de anúncios, remarketingAdmin da loja (SiteSettings)NEXT_PUBLIC_MP_PIXEL_ID
UptimeRobotMonitoramento de disponibilidade 24/7Dashboard UptimeRobot— (configurado externamente)

2. HyperDX

2.1 Setup via instrumentation.ts

O HyperDX é inicializado via o Next.js Instrumentation Hook (instrumentation.ts na raiz do projeto). Esse hook é executado uma única vez no início do processo Node.js, antes de qualquer requisição ser processada.

// instrumentation.ts
export async function register() {
if (process.env.NEXT_RUNTIME === "nodejs") {
const { init } = await import("@hyperdx/node-opentelemetry");
init({
apiKey: process.env.HYPERDX_API_KEY,
service: process.env.OTEL_SERVICE_NAME ?? "ljvemasearomas",
});
}
}

O guard process.env.NEXT_RUNTIME === "nodejs" é obrigatório para evitar que o SDK tente inicializar no Edge Runtime, que não suporta os módulos OpenTelemetry nativos.

2.2 Variáveis de Ambiente

VariávelDescriçãoExemplo
HYPERDX_API_KEYChave de API do projeto no HyperDXhdx_...
OTEL_SERVICE_NAMENome do serviço exibido no dashboardljvemasearomas-prod

2.3 O Que é Capturado Automaticamente

  • Traces HTTP: todas as requisições recebidas e externas (fetch, axios)
  • Logs server-side: console.log, console.error, console.warn são automaticamente capturados e correlacionados com o trace correspondente
  • Erros não tratados: exceções que escapam para o runtime são capturadas e enviadas com stack trace
  • Métricas de banco de dados: queries Prisma aparecem como spans filhos dos traces HTTP

2.4 Como Acessar o Dashboard

  1. Acesse app.hyperdx.io
  2. Selecione o projeto ljvemasearomas
  3. Na aba Search, filtre por service.name = ljvemasearomas-prod
  4. Para ver erros: filtre por level = error ou exception.type exists
  5. Para ver traces lentos: ordene por duration decrescente

2.5 Como Adicionar um Span Customizado

Para instrumentar uma operação específica (ex.: geração de NF-e, cálculo de frete):

import { trace } from "@opentelemetry/api";

const tracer = trace.getTracer("ljvemasearomas");

export async function calcularFrete(cep: string, peso: number) {
return tracer.startActiveSpan("frete.calcular", async (span) => {
try {
span.setAttribute("frete.cep", cep);
span.setAttribute("frete.peso_gramas", peso);

const resultado = await chamarApiCorreios(cep, peso);

span.setAttribute("frete.opcoes_retornadas", resultado.length);
return resultado;
} catch (err) {
span.recordException(err as Error);
span.setStatus({ code: 2, message: (err as Error).message });
throw err;
} finally {
span.end();
}
});
}

3. PM2 — Logs de Processo

3.1 Comandos Essenciais

# Ver logs em tempo real (últimas 100 linhas + streaming)
pm2 logs ljvemasearomas

# Ver apenas as últimas N linhas (sem streaming)
pm2 logs ljvemasearomas --lines 200 --nostream

# Monitor interativo (CPU, memória, logs em tempo real)
pm2 monit

# Status de todos os processos
pm2 status

# Reiniciar sem downtime (reload gracioso)
pm2 reload ljvemasearomas

# Reiniciar com downtime (mata e reinicia)
pm2 restart ljvemasearomas

3.2 Paths dos Arquivos de Log

Configurados no ecosystem.config.js (ou pm2 start com flags):

/home/<usuario>/.pm2/logs/ljvemasearomas-out.log → stdout (logs normais)
/home/<usuario>/.pm2/logs/ljvemasearomas-error.log → stderr (erros)

Para localizar os paths exatos no servidor:

pm2 info ljvemasearomas | grep "log file"

3.3 Rotação de Logs

Para evitar que os arquivos de log cresçam indefinidamente, instalar o módulo de rotação:

pm2 install pm2-logrotate

# Configurar rotação diária, mantendo 7 dias
pm2 set pm2-logrotate:max_size 50M
pm2 set pm2-logrotate:retain 7
pm2 set pm2-logrotate:compress true
pm2 set pm2-logrotate:rotateInterval "0 0 * * *"

4. Google Analytics 4

4.1 Configuração

O GA4 é carregado via components/ui/analytics-scripts.tsx, que injeta o script gtag.js no <head> da aplicação quando NEXT_PUBLIC_GA4_ID está definido.

NEXT_PUBLIC_GA4_ID=G-XXXXXXXXXX

Se a variável não estiver definida, o script não é injetado (sem erros no console).

4.2 Eventos Disparados

Evento GA4Quando é disparadoDados Enviados
view_itemPágina de produto visualizadaitem_id, item_name, price
add_to_cartProduto adicionado ao carrinhoitem_id, item_name, price, quantity
begin_checkoutUsuário inicia o checkoutvalue, currency, items[]
purchasePedido confirmado com sucessotransaction_id, value, items[]

4.3 Onde Configurar no Admin

A ativação e desativação do GA4 é gerenciada via variável de ambiente — não há toggle no painel admin. Para desabilitar, remover NEXT_PUBLIC_GA4_ID do ambiente e reiniciar o servidor.


5. Microsoft Clarity

5.1 Configuração

O Clarity é carregado via components/ui/clarity-script.tsx:

NEXT_PUBLIC_CLARITY_ID=xxxxxxxxxx

5.2 Funcionalidades

  • Mapas de calor: visualização agregada de cliques, toques e scroll por página
  • Gravações de sessão: replay de sessões reais de usuários (anonimizado)
  • Insights automáticos: Clarity detecta "rage clicks", cliques em elementos não interativos e dead clicks

5.3 Acessar o Dashboard

  1. Acesse clarity.microsoft.com
  2. Selecione o projeto correspondente ao site
  3. Aba Recordings para sessões individuais
  4. Aba Heatmaps para visualização agregada por URL

LGPD: as gravações do Clarity são anonimizadas por padrão. Verificar se o aviso de cookies do site informa sobre este tipo de rastreamento comportamental.


6. Meta Pixel

6.1 Configuração

O ID do Pixel é configurado via painel admin da loja (SiteSettings), não via .env fixo. O valor é lido da tabela SiteSettings no banco e exposto como:

NEXT_PUBLIC_MP_PIXEL_ID=<id-do-pixel>

Isso permite trocar o Pixel sem redeploy — apenas salvar nas configurações do admin e aguardar o próximo request (valor é lido em Server Component com cache: 'no-store' ou similar).

6.2 Eventos de Conversão

Evento Meta PixelQuando é disparado
ViewContentPágina de produto visualizada
AddToCartProduto adicionado ao carrinho
InitiateCheckoutInício do checkout
PurchasePedido confirmado (com value e currency)

6.3 Verificação

Usar a extensão Meta Pixel Helper (Chrome/Firefox) para verificar se os eventos estão sendo disparados corretamente em cada etapa do funil.


7. Alertas de Uptime

7.1 UptimeRobot (Plano Gratuito)

O UptimeRobot gratuito permite até 50 monitores com verificação a cada 5 minutos, com alertas por e-mail.

Passo a passo para configurar:

  1. Criar conta em uptimerobot.com
  2. Clicar em + Add New Monitor
  3. Preencher:
    • Monitor Type: HTTP(s)
    • Friendly Name: ljvemasearomas - Produção
    • URL: https://seu-dominio.com.br
    • Monitoring Interval: 5 minutes
  4. Em Alert Contacts, adicionar o e-mail para receber alertas
  5. Clicar em Create Monitor

Alertas configurados por padrão:

  • Notificação quando o site fica fora do ar (status != 200)
  • Notificação quando o site volta ao ar

7.2 Better Uptime (Alternativa com Mais Recursos)

O Better Uptime oferece plano gratuito com verificação a cada 3 minutos, alertas por e-mail, Slack e telefone, além de página de status pública.

Vantagens em relação ao UptimeRobot:

  • Verificação a cada 3 minutos (vs 5 min no plano free do UptimeRobot)
  • Página de status pública em status.seu-dominio.com (útil para comunicar incidentes)
  • Integração nativa com Slack e PagerDuty

8. Health Check

8.1 Endpoint /api/health

Se o endpoint /api/health estiver implementado, ele deve retornar:

{
"status": "ok",
"timestamp": "2024-01-15T10:30:00.000Z",
"version": "1.0.0",
"database": "connected"
}

Use este endpoint como probe nos monitores de uptime — é mais confiável que monitorar / porque:

  • Não depende de CDN ou cache
  • Verifica ativamente a conectividade com o banco de dados
  • Resposta leve (sem renderização HTML)

8.2 Configuração no UptimeRobot com Health Check

Monitor Type: HTTP(s)
URL: https://seu-dominio.com.br/api/health
Keyword: "status":"ok" ← falha se essa string não aparecer na resposta

8.3 Teste Manual do Health Check

curl -s https://seu-dominio.com.br/api/health | jq .

# Resposta esperada:
# {
# "status": "ok",
# "database": "connected"
# }

Se a rota /api/health não existir, usar GET / como probe básico (verifica apenas que o servidor está respondendo).