Observabilidad · infrastructure/observability

Adapter listo para producción

Sentry,
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.

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  };

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_DSNopcional

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

  • SENTRY_TRACES_SAMPLE_RATEopcional

    default 0.1

Dónde vive

  • apps/server/src/infrastructure/observability/sentry.ts
  • apps/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.