Observabilidad · infrastructure/observability
Adapter listo para producciónSentry,
apagado hasta que lo actives.
El servidor usa @sentry/bun (no @sentry/node), el cliente usa @sentry/nextjs. La inicialización es un no-op cuando SENTRY_DSN no está seteada, así dev y CI nunca reportan — y los errores que deberían pagear a alguien pasan por un helper explícito captureError, no por una llamada silenciosa al logger.
Sin DSN, sin reporte
initSentry corta en corto cuando falta el DSN y es idempotente, así que es seguro llamarlo desde el composition root. Un clon fresco no reporta nada hasta que le pasás 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 };
Cómo está cableado
SDK nativo de Bun
El SDK del servidor es @sentry/bun — la elección correcta en el runtime de Bun, no @sentry/node.
Tags scopeados por request
sentryRequestScope taggea cada scope con el id de la request, así los errores no manejados llevan el identificador de traza.
Captura explícita
logger.error NO auto-captura. Usá captureError(err, ctx) para los errores que deberían pagear a alguien — la señal se mantiene fuera del ruido.
Cliente + servidor
El cliente Next.js usa @sentry/nextjs vía instrumentation-client.ts e instrumentation.ts.
Referencia de configuración
Variables de entorno
SENTRY_DSNopcionalunset → Sentry no-ops (dev/CI never report)
SENTRY_TRACES_SAMPLE_RATEopcionaldefault 0.1
Dónde vive
apps/server/src/infrastructure/observability/sentry.tsapps/server/src/infrastructure/observability/capture-error.ts
Señal de errores sin el ruido.
Shippeá con Sentry cableado para Bun y para el cliente — el reporte apagado hasta que seteás un DSN, y pageando solo lo que importa.