Sentry

Sentry 是一个错误追踪和性能监控平台,可帮助开发者实时识别并修复问题。本指南展示如何将 Sentry 的 NestJS SDK 集成到您的 NestJS 应用中。

安装

首先,安装所需依赖:

$ npm install --save @sentry/nestjs @sentry/profiling-node

info 注意 @sentry/profiling-node 是可选项,但建议用于性能分析。

基础设置

要开始使用 Sentry,您需要创建一个名为 instrument.ts 的文件,该文件应在应用程序中其他模块之前导入:

@@filename(instrument)
const Sentry = require("@sentry/nestjs");
const { nodeProfilingIntegration } = require("@sentry/profiling-node");

// Ensure to call this before requiring any other modules!
Sentry.init({
  dsn: SENTRY_DSN,
  integrations: [
    // Add our Profiling integration
    nodeProfilingIntegration(),
  ],

  // Add Tracing by setting tracesSampleRate
  // We recommend adjusting this value in production
  tracesSampleRate: 1.0,

  // Set sampling rate for profiling
  // This is relative to tracesSampleRate
  profilesSampleRate: 1.0,
});

更新您的 main.ts 文件,确保在其他导入之前引入 instrument.ts

@@filename(main)
// Import this first!
import "./instrument";

// Now import other modules
import { NestFactory } from "@nestjs/core";
import { AppModule } from "./app.module";

async function bootstrap() {
  const app = await NestFactory.create(AppModule);
  await app.listen(3000);
}

bootstrap();

随后,将 SentryModule 作为根模块添加到您的主模块中:

@@filename(app.module)
import { Module } from "@nestjs/common";
import { SentryModule } from "@sentry/nestjs/setup";
import { AppController } from "./app.controller";
import { AppService } from "./app.service";

@Module({
  imports: [
    SentryModule.forRoot(),
    // ...other modules
  ],
  controllers: [AppController],
  providers: [AppService],
})
export class AppModule {}

异常处理

如果您正在使用全局捕获所有异常的过滤器(即通过 app.useGlobalFilters() 注册的过滤器,或在应用模块 providers 中注册的带有无参数 @Catch() 装饰器的过滤器),请在该过滤器的 catch() 方法上添加 @SentryExceptionCaptured() 装饰器。此装饰器会将全局错误过滤器接收到的所有意外错误报告给 Sentry:

import { Catch, ExceptionFilter } from '@nestjs/common';
import { SentryExceptionCaptured } from '@sentry/nestjs';

@Catch()
export class YourCatchAllExceptionFilter implements ExceptionFilter {
  @SentryExceptionCaptured()
  catch(exception, host): void {
    // your implementation here
  }
}

默认情况下,只有未被错误过滤器捕获的未处理异常才会报告给 Sentry。HttpExceptions(包括派生类 )默认也不会被捕获,因为它们主要用作控制流载体。

如果您没有全局捕获所有异常的过滤器,请将 SentryGlobalFilter 添加到主模块的 providers 中。该过滤器会将其他错误过滤器未捕获的任何未处理错误报告给 Sentry。

warning 警告 需要在注册其他异常过滤器之前注册 SentryGlobalFilter

@@filename(app.module)
import { Module } from "@nestjs/common";
import { APP_FILTER } from "@nestjs/core";
import { SentryGlobalFilter } from "@sentry/nestjs/setup";

@Module({
  providers: [
    {
      provide: APP_FILTER,
      useClass: SentryGlobalFilter,
    },
    // ..other providers
  ],
})
export class AppModule {}

可读的堆栈跟踪

根据项目配置方式,Sentry 错误中的堆栈跟踪可能不会显示实际代码。

要解决此问题,请将源映射上传至 Sentry。最简单的方法是使用 Sentry 向导:

npx @sentry/wizard@latest -i sourcemaps

测试集成功能

要验证您的 Sentry 集成是否正常工作,可以添加一个会抛出错误的测试端点:

@Get("debug-sentry")
getError() {
  throw new Error("My first Sentry error!");
}

访问应用程序中的 /debug-sentry,您应该能在 Sentry 仪表板中看到该错误。

摘要

有关 Sentry 的 NestJS SDK 完整文档(包括高级配置选项和功能),请访问 Sentry 官方文档

虽然 Sentry 专长是处理软件错误,但我们自己也会写出 bug。如果您在安装我们的 SDK 时遇到任何问题,请提交 GitHub Issue 或在 Discord 上联系我们。