Notice
Recent Posts
Recent Comments
Link
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
Tags more
Archives
Today
Total
관리 메뉴

레커

[NestJs] Sentry 를 이용해 Slack에 알림 본문

개발/TIL

[NestJs] Sentry 를 이용해 Slack에 알림

Prism Wrecker 2024. 1. 26. 00:55

 

- Sentry 

Sentry는 실시간 로그 취합 및 분석 도구이자 모니터링 플랫폼입니다. 로그에 대해 다양한 정보를 제공하고 이벤트별, 타임라인으로 얼마나 많은 이벤트가 발생하는지 알 수 있고 설정에 따라 알림을 받을 수 있습니다. 그리고 로그를 수집하는데서 그치지 않고 발생한 로그들을 시각화 도구로 쉽게 분석할 수 있도록 도와주며 다양한 플랫폼을 지원합니다.

 

 

  • 프로젝트 설정 -> Client Key(DNS) 클릭 -> DSN 키 복사 하여 .env에 추가
  • 슬랙에 가입-> 새로운 워크스페이 생성-> 채널생성-> 설정 및 관리 -> 앱관리 클릭
  • 앱 생성-> Incomming Webhoos 클릭 -> 웹 훅 권한 수락 -> .env에 생성된 webhook url 추가
npm i @sentry/node
npm i @slack/webhook
  • config/sentry.config.ts 설정
import { registerAs } from "@nestjs/config";

export default registerAs('sentry', () => ({
  dsn: process.env.SENTRY_DSN,
}))
  • interceptor/sentry.interceptor.ts
import { CallHandler, ExecutionContext, Injectable, NestInterceptor } from "@nestjs/common";
import { Observable, catchError } from "rxjs";
import { Request as ExpressRequest } from 'express'
import * as Sentry from '@sentry/node';
import { IncomingWebhook } from "@slack/webhook";

@Injectable()
export class SentryInterceptor implements NestInterceptor{
  intercept(context: ExecutionContext, next: CallHandler<any>): Observable<any> | Promise<Observable<any>>{
    const http = context.switchToHttp();
    const request = http.getRequest<ExpressRequest>();
    const { url } = request

    return next.handle().pipe(catchError((error) =>{
        Sentry.captureException(error)
        const webhook = new IncomingWebhook(process.env.SLACK_WEBHOOK)
        webhook.send({
          attachments: [{
              text: '에러',
              fields: [{
                  title: `Error Message : ${error.response?.message}||${error.message}`,
                  value: `URL : ${url}\n${error.stack}`,
                  short: false,
                }],
              ts: Math.floor(new Date().getTime() / 1000).toString(),
            }]
          })
        throw error;
      })
    )
  }
}

 

  • main.ts. 에서 인터셉터 초기화 및 등록
// main.ts
...
Sentry.init({ dsn: configService.get('SENTRY_DSN') });
app.useGlobalInterceptors(new TransformInterceptor());

 

서버에 에러가 발생 시 슬랙에서 에러가 알림이 전송됩니다.

센트리 사이트에서도 에러 현황을 볼 수 있다.

 

 

 

'개발 > TIL' 카테고리의 다른 글

Rate limit_nest.js  (0) 2024.01.24
Nest.js Passport-kakao  (0) 2024.01.22
Interceptor  (0) 2024.01.19
CORS  (0) 2024.01.19
Container  (0) 2024.01.17