Observabilidade · infrastructure/observability

Adapter pronto para produção

Sentry,
desligado até você optar por ligar.

O servidor usa @sentry/bun (não @sentry/node), o cliente usa @sentry/nextjs. A inicialização é um no-op quando SENTRY_DSN não está setada, então dev e CI nunca reportam — e os erros que deveriam acionar o plantão passam por um helper explícito captureError, não por uma chamada silenciosa ao logger.

Sem DSN, sem reporte

initSentry faz short-circuit quando o DSN está ausente e é idempotente, então é seguro chamá-lo do composition root. Um clone novo não reporta nada até você fornecer SENTRY_DSN.

sentry.ts
 1  import * as Sentry from '@sentry/bun';
 2  
 3  export const initSentry = (cfg: SentryConfig): boolean => {
 4    if (!cfg.dsn || initialized) return initialized;  // no-op
 5    Sentry.init({
 6      dsn: cfg.dsn,
 7      tracesSampleRate: cfg.tracesSampleRate,
 8    });
 9    initialized = true;
10    return true;
11  };

Como está conectado

SDK nativo do Bun

O SDK do servidor é @sentry/bun — a escolha correta no runtime do Bun, não @sentry/node.

Tags scoped por request

sentryRequestScope marca cada scope com o id da request, então erros não tratados carregam o identificador de trace.

Captura explícita

logger.error NÃO auto-captura. Use captureError(err, ctx) para os erros que devem acionar o plantão — o sinal fica fora do ruído.

Cliente + servidor

O cliente Next.js usa @sentry/nextjs via instrumentation-client.ts e instrumentation.ts.

Referência de configuração

Variáveis de ambiente

  • SENTRY_DSNopcional

    unset → Sentry no-ops (dev/CI never report)

  • SENTRY_TRACES_SAMPLE_RATEopcional

    default 0.1

Onde ele vive

  • apps/server/src/infrastructure/observability/sentry.ts
  • apps/server/src/infrastructure/observability/capture-error.ts

Sinal de erro sem o ruído.

Publique com o Sentry conectado para o Bun e para o cliente — o reporte desligado até você setar um DSN, e acionando o plantão só no que importa.