我最近将 Bull 添加到我的项目中,以卸载诸如将文档同步到 3rd 方服务之类的事情,并且一切都运行良好,除了处理作业时发生的错误不会最终出现在 Sentry 中。他们只登录作业本身,但由于我们在多个配置上运行我们的应用程序,这意味着我必须不断监视所有这些实例以查找作业处理错误。
我知道我可以向处理器添加错误处理程序,但我已经有很多处理器了,所以我更喜欢另一个更全局的解决方案
有什么方法可以确保这些错误也发送给 Sentry?
我无法在全局范围内找到执行此操作的方法,但我能够创建一个实现OnQueueFailed 事件侦听器并向哨兵报告失败的基本处理器类。我的所有处理器都继承自它,它似乎运行良好。
基类:
import { OnQueueFailed } from '@nestjs/bull';
import { Logger } from '@nestjs/common';
import * as Sentry from '@sentry/node';
import { Job } from 'bull';
export abstract class BaseProcessor {
protected abstract logger: Logger;
@OnQueueFailed()
onError(job: Job<any>, error: any) {
Sentry.captureException(error);
this.logger.error(
`Failed job ${job.id} of type ${job.name}: ${error.message}`,
error.stack,
);
}
}
处理器:
import { InjectQueue, Process, Processor } from '@nestjs/bull';
import { Logger } from '@nestjs/common';
import { Job, Queue } from 'bull';
import { BaseProcessor } from 'src/common/BaseProcessor';
import { BULL_QUEUES } from 'src/common/queues';
@Processor(BULL_QUEUES.SOME_QUEUE_NAME)
export class SomeProcessor extends BaseProcessor {
protected readonly logger = new Logger(SomeProcessor.name);
constructor(
// dependencies
) {
super();
}
@Process()
async processTask(job: Job) {
// processor code here
}
}