2

我最近将 Bull 添加到我的项目中,以卸载诸如将文档同步到 3rd 方服务之类的事情,并且一切都运行良好,除了处理作业时发生的错误不会最终出现在 Sentry 中。他们只登录作业本身,但由于我们在多个配置上运行我们的应用程序,这意味着我必须不断监视所有这些实例以查找作业处理错误。

我知道我可以向处理器添加错误处理程序,但我已经有很多处理器了,所以我更喜欢另一个更全局的解决方案

有什么方法可以确保这些错误也发送给 Sentry?

4

1 回答 1

0

我无法在全局范围内找到执行此操作的方法,但我能够创建一个实现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
  }
}
于 2022-01-25T21:22:18.223 回答