You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 12:36:03