Observabilidade · infrastructure/observability
Adapter pronto para produçãoSentry,
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.
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_DSNopcionalunset → Sentry no-ops (dev/CI never report)
SENTRY_TRACES_SAMPLE_RATEopcionaldefault 0.1
Onde ele vive
apps/server/src/infrastructure/observability/sentry.tsapps/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.