Skip to main content

Sentry

Мониторинг ошибок и производительности.

Настройка

SENTRY_DSN=https://...@o....ingest.sentry.io/...

Если SENTRY_DSN не задан — Sentry инициализируется без DSN, ошибки не отправляются (безопасно для локальной разработки).

Инициализация

Sentry инициализируется в apps/api/src/instrument.ts и импортируется первым в main.ts:

// main.ts
import './instrument' // должен быть до всего остального
// instrument.ts
const isProd = process.env.NODE_ENV === 'production'

Sentry.init({
dsn: process.env.SENTRY_DSN,
integrations: [nodeProfilingIntegration()],
enableLogs: true,
tracesSampleRate: isProd ? 0.1 : 1.0,
profileSessionSampleRate: isProd ? 0.1 : 1.0,
profileLifecycle: 'trace',
})

В production выборка трассировок и профилей снижена до 10% для экономии квоты.

Интеграция с NestJS

SentryModule.forRoot() подключается первым в imports массиве AppModule — чтобы Sentry успел обернуть все остальные модули:

@Module({
imports: [
SentryModule.forRoot(), // первым
ConfigModule.forRoot({ ... }),
// ...
],
})

Перехват ошибок

Глобальный HttpExceptionFilter использует декоратор @SentryExceptionCaptured() для автоматической отправки исключений:

@Catch()
export class HttpExceptionFilter extends BaseFilter {
@SentryExceptionCaptured()
catch(exception: unknown, host: ArgumentsHost) {
// ...
}
}

Все необработанные исключения (5xx) автоматически попадают в Sentry.

Debug-эндпоинт

GET /api/v1/debug-sentry

Вызывает тестовую ошибку с логом и метрикой — для проверки интеграции:

Sentry.logger.info('User triggered test error')
Sentry.metrics.count('test_counter', 1)
throw new Error('My first Sentry error!')
warning

Убери или защити этот эндпоинт перед production-деплоем.