NestJS项目中如何将Bull队列作业处理错误全局上报至Sentry
全局上报Bull作业错误到Sentry的实现方案
完全不需要修改现有作业处理器代码,可通过NestJS+Bull的全局事件监听机制实现全量错误捕获上报,具体实现如下:
前置准备
确保项目内Sentry已完成基础初始化,main.ts 中已正确配置DSN、环境标识、采样率等核心参数。
实现步骤
1. 创建全局Bull事件监听服务
新建一个处理器类,使用无参数的@Processor()装饰器标注为全局处理器,监听队列的failed事件即可捕获所有队列的作业执行错误:
import { Injectable } from '@nestjs/common'; import { Processor, OnQueueEvent, BullQueueEvents } from '@nestjs/bull'; import * as Sentry from '@sentry/node'; @Processor() // 空参数即代表全局生效,监听所有队列事件 @Injectable() export class GlobalBullErrorListener { @OnQueueEvent(BullQueueEvents.FAILED) async handleFailedJob(job: any, error: Error) { // 上报错误到Sentry,附带作业上下文信息方便排查 Sentry.captureException(error, { extra: { jobId: job.id, queueName: job.queue.name, jobData: job.data, attemptsMade: job.attemptsMade, failedTimestamp: new Date().toISOString() } }); // 可按需添加额外逻辑:比如写入本地日志、触发告警等 } }
2. 注册全局监听服务
将上述GlobalBullErrorListener添加到根模块AppModule的providers数组中即可生效:
@Module({ imports: [ BullModule.forRoot({ // 原有Bull的Redis配置保持不变 redis: { host: process.env.REDIS_HOST, port: parseInt(process.env.REDIS_PORT, 10), }, }), // 其他业务模块 ], providers: [ GlobalBullErrorListener, // 原有其他服务 ], }) export class AppModule {}
扩展配置
- 可根据需求监听其他队列事件,比如
BullQueueEvents.STALLED(作业卡顿)、BullQueueEvents.FAILED_ATTEMPT(单次重试失败),按需上报不同级别的日志或异常 - 可在
handleFailedJob方法中添加过滤逻辑,跳过业务预期内的已知错误,避免无效上报 - 若使用
@nestjs/bullmq包,逻辑完全一致,仅需调整导入的装饰器和事件枚举来自@nestjs/bullmq即可
内容的提问来源于stack exchange,提问作者Bart van den Burg
相关产品推荐
相关产品推荐

