Sentry를 NestJS 예약 작업과 통합
8705 단어 nestjstypescriptsentrycron
약간의 조사 끝에
Interceptor
및 ExceptionFilter
에 대한 NestJS의 기본 개념이 실행 컨텍스트가 어떻게든 요청 생성된다는 아이디어를 기반으로 구축되었음을 발견했습니다. 즉, 이러한 구성은 예를 들어 다음을 통해 서버에 대한 외부 요청에 의해 오류가 트리거될 것으로 예상합니다. HTTP 또는 GraphQL.불행히도
Cron
에서 @nestjs/schedule
데코레이터를 사용할 때 내 코드는 실제로 외부 요청에 의해 트리거되지 않으므로 이러한 컨텍스트에서 발생한 오류는 일반 인터셉터 또는 예외 필터 파이프라인까지 버블링되지 않는 것 같습니다.이 문제를 해결하기 위해 저는 이StackOverflow answer에서 영감을 얻어
Cron
메서드를 Sentry에 직접 보고하는 오류 처리기에서 메서드를 래핑하는 데 사용할 수 있는 데코레이터를 만들었습니다.다음과 같이 보입니다.
// decorators/sentry-overwatch.decorator.ts
import { Inject } from "@nestjs/common";
import { SentryService } from "@ntegral/nestjs-sentry";
export const SentryOverwatchAsync = () => {
const injectSentry = Inject(SentryService);
return (
target: any,
_propertyKey: string,
propertyDescriptor: PropertyDescriptor,
) => {
injectSentry(target, "sentry");
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
const originalMethod: () => Promise<void> = propertyDescriptor.value;
propertyDescriptor.value = async function (...args: any[]) {
try {
return await originalMethod.apply(this, args);
} catch (error) {
const sentry = this.sentry as SentryService;
sentry.instance().captureException(error);
throw error;
}
};
};
};
이 특정 함수는 비동기 함수를 장식하도록 설계되었습니다. 비동기 버전이 아닌 경우
async
정의에서 propertyDescriptor.value
를 제거하고 await
를 호출할 때 originalMethod
를 제거하면 됩니다.조금 더 작업하면 반환 값이 Promise인지 여부를 감지하고 올바른 작업을 수행하기 위해 보다 일반화된 것을 작성할 수 있지만 내 사용 사례는 간단합니다.
그런 다음 원래 기능을 다음과 같이 래핑할 수 있습니다.
// decorators/cron.decorator.ts
// Decorator ordering is important here. Swapping the order
// results in Nest failing to recognize this as a scheduled
// job
@Cron("*/5 * * * *")
@SentryOverwatchAsync()
async scheduledTask(): Promise<void> {
// ...
}
그러나 이제
@SentryOverwatchAsync()
예약된 작업을 선언할 때마다 @Cron
를 추가해야 합니다. 조금 짜증나고, 언젠가는 잊어버릴 것 같아요.그래서 decorator composition을 사용하여 기본 Nest 데코레이터를 새 사용자 지정 데코레이터와 함께 패키징하는 내 고유 버전의
@Cron
데코레이터를 다시 내보내기로 결정했습니다.import { applyDecorators } from "@nestjs/common";
import { Cron as NestCron, CronOptions } from "@nestjs/schedule";
import { SentryOverwatchAsync } from "./sentry-overwatch.decorator";
export const Cron = (cronTime: string | Date, options?: CronOptions) => {
// Ordering is important here, too!
// The order these must appear in seems to be the reverse of
// what you'd normally expect when decorating functions
// declaratively. Likely because the order you specify here
// is the order the decorators will be applied to the
// function in.
return applyDecorators(SentryOverwatchAsync(), NestCron(cronTime, options));
};
이제 내가 해야 할 일은
Cron
의 모든 사용법을 내 내부 Cron
데코레이터로 바꾸는 것이며 Sentry overwatch를 완료했습니다.마음의 평화: 달성!
Reference
이 문제에 관하여(Sentry를 NestJS 예약 작업과 통합), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/chiubaka/integrating-sentry-with-nestjs-scheduled-jobs-19bj텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)