본문 바로가기

[Project] 프로젝트 삽질기24 (feat Sentry Slack 연동)

어가며

사이드 프로젝트에서 푸시 알림을 활용한 서비스를 개발하고 있습니다. 서버를 개발하면서, 서버가 새벽에 박살이 나서 밤샘을 하며 서버를 고친 경험이 있습니다. 고치면서 이제는 서버에 문제가 생길 때 왜 문제가 생겼는지 분석해주는 툴을 도입해야겠다고 생각했습니다. 이번 기회에 로그를 분석하는 툴을 도입하고, 서버가 문제가 생길 시 슬랙으로 알림이 오도록 구성하고 싶었습니다. 이 글은 제가 어떻게 Sentry와 Slack을 활용하여 서비스 장애에 대처할 수 있게 설정했는지 설명하는 글입니다. 

 

 
 

 


 
 
 
 

 

 

 

 

Sentry

Sentry는 애플리케이션에서 오류가 발생하면 알려주는 에러 트래킹 서비스입니다. (무료 혹은 유료) 클라이언트의 오류 발생 시 메일을 보내주고, 슬랙과 연동하면 슬랙 메시지를 통해 오류 발생과 해당 오류에 대한 정보 파악이 가능합니다. Javascript, vue.js, node.js, java, python 등의 다양한 언어, 프레임워크, 라이브러리를 지원하여 여러 프로젝트의 이슈를 한 곳에서 관리함으로써 에러 모니터링을 일원화할 수 있습니다. 이런 sentry를 NestJS에 적용시켜보겠습니다.

 

 

Sentry 설정

먼저 Sentry를 활용하기 위해 먼저 Sentry에 들어가서 가입하겠습니다. 특정 방식으로 가입하면 다음과 같이 나옵니다. 

 

 

저는 다음과 같이 test로 작성하고 Create Organization을 클릭하겠습니다. 

 

 

 

그럼 위와 같이 나오는데, NestJS를 활용한다면, NODE.JS를 활용하는 것이기에 NODE.JS를 선택합니다. 

 

 

 

그다음 Project name을 입력하고 입력이 모두 끝났으면 Create Project를 클릭합니다. 

 

 

 

 

 

그럼 다음과 같은 화면이 뜨는데, 프로젝트에서 필요한 것은 Sentry.init에서 dsn에 적혀있는 문자열입니다. 이를 복사하여 프로젝트 환경변수에 추가합니다. 그 후 Take me to Issues 버튼을 클릭합니다. 

 

 

그럼 다음과 같이 설정되었다면 이제 Sentry를 사용할 준비가 끝났습니다. 그럼 이제 NestJS로 돌아가서, Sentry에 대해 설정하겠습니다. 

 

 

 

 

NestJS Sentry 설정

NestJS에서 Sentry를 설정하기 위해 관련 라이브러리를 설치하겠습니다.

 

$ npm i @sentry/node nest-raven

 

 

그 후 main.ts에 sentry를 연결하겠습니다.

 

main.ts

import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
import * as Sentry from '@sentry/node';

async function bootstrap() {
  const app = await NestFactory.create(AppModule);
  Sentry.init({
    dsn: process.env.SENTRY_DSN,
  });
  await app.listen(3000);
}
bootstrap();

 

 

위와 같이 설정했다면, Sentry를 사용할 준비가 끝났습니다. 그럼 에러 코드가 출력되면 Sentey에서 확인하면서, 동시에 Slack에서도 확인하고 싶다면 어떻게 해야 할까요? 여기서는 Interceptor를 활용하여 알아보겠습니다.

 

 

 

Slack Hook 설정

Slack Hook 설정을 위해 먼저 앱을 클릭합니다.

 

 

 

 

앱은 더 보기를 클릭하면 나옵니다.

 

 

 

 

그 후 입력창에 incoming을 입력하면 incoming WebHooks이 나옵니다. 이를 추가합니다. 

 

 

 

 

 

 

그럼 다음과 같이 나오는데, Slack에 추가 버튼을 누릅니다.

 

 

 

 

 

이 화면이 나오면, 채널 선택을 눌러서, 웹 훅으로 알림을 받고 싶은 채널을 선택합니다. 

 

 

 

 

 

 

여기서 나온 웹 훅 URL을 복사하여 환경변수에 추가합니다. 여기까지 설정했다면, 이제 NestJS에서 Slack을 활용하기 위한 라이브러리를 설치합니다. 

 

 

$ npm i @slack/webhook

 

다음과 같이 라이브러리를 설치하고, 아래의 인터셉터를 구성하여 main.ts에 app.useGlobalInterceptors에 추가합니다.

 

 

 

main.ts

import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
import * as Sentry from '@sentry/node';
import { WebhookInterceptor } from './common/webhook.interceptor';

async function bootstrap() {
  const app = await NestFactory.create(AppModule);
  Sentry.init({
    dsn: process.env.SENTRY_DSN,
  });
  app.useGlobalInterceptors(new WebhookInterceptor());
  await app.listen(3000);
}
bootstrap();

 

 

webhook.interceptor

import {CallHandler, ExecutionContext, Injectable, NestInterceptor} from '@nestjs/common';
import {catchError} from 'rxjs/operators';
import {IncomingWebhook} from '@slack/client';
import slackConfig from '../config/slack.config';
import {of} from 'rxjs';
import * as Sentry from '@sentry/minimal';

@Injectable()
export class SentryInterceptor implements NestInterceptor {
  intercept(_: ExecutionContext, next: CallHandler) {
    return next.handle().pipe(
      catchError(error => {
        Sentry.captureException(error);
        const webhook = new IncomingWebhook(process.env.SLACK_WEBHOOK);
        webhook.send({
          attachments: [
            {
              color: 'danger',
              text: '🚨ah-ha-api-server 버그 발생🚨',
              fields: [
                {
                  title: `Request Message: ${error.message}`,
                  value: error.stack,
                  short: false,
                },
              ],
              ts: Math.floor(new Date().getTime() / 1000).toString(),
            },
          ],
        });
        return of(error);
      }),
    );
  }
}

 

 

const webhook 변수에 new IncomingWebhook 안에 Slack Webhook 환경변수를 주입한 객체를 값으로 할당합니다. 이렇게 설정하면 에러가 발생할 경우 다음과 같이 알림이 전달됩니다. 

 

 

 

 

 

 

 

저희 팀의 경우 Slack으로 오는 문구를 다음과 같이 커스터마이징 했습니다. 위의 경우처럼 Slack으로 오는 에러 메시지를 자유롭게 변경할 수 있습니다.

 

 

 

 

 

Sentry를 처음 사용하는 경우 무료로 사용하면 됩니다. 무료 사용 시 제한 사항은 다음과 같습니다.

 

 

[무료 사용 시 제한 사항]

  1. 멤버 수 제한 : 하나의 계정으로 로그인해야 해당 이슈들을 조회할 수 있습니다. (유료 사용의 경우 무제한)
  2. 에러 수 제한 : 무료 사용 시 5,000개로 제한 (유료 사용 시 100,000개 이상 ~ )
  3. 히스토리 저장 : 오류에 대한 히스토리를 30일만 저장 (유료 사용 시 90일)
  4. 기타 소소한 추가 기능들은 링크를 통해 확인 가능합니다. Sentry 유료 정책

 

 

 

 

 


 

 

 

 

마치며

앞으로도 팀의 발전을 돕는 개발자가 되기 위해 노력하려 합니다. 팀에 필요한 부분이 무엇일지 고민하면서, 팀에 도움이 된다면, 열심히 공부해서 실무에 적용할 수 있는 개발자가 되기 위해 노력하고 싶습니다. 팀의 성장에 기여할 수 있는 개발자가 되겠습니다. 

 

 

 

 

 


 

 

 

 

 

 

참고 및 출처

 

Sentry로 사내 에러 로그 수집 시스템 구축하기 - LINE ENGINEERING

안녕하세요. LINE Plus UIT 팀 복다훈입니다. 이번 글에서는 Sentry 온 프레미스(On-Premise) 구축기를 공유하겠습니다. LINE에서 왜 Sentry를 사용하게 됐는지 먼저 말씀드리고 클라우드 대신 온 프레미스

engineering.linecorp.com

 

[DevOps] 로그 수집 및 모니터링 시스템 - Sentry (2탄)

저번 포스트에서는 간략하게 Sentry에 대하여 설명을 했는데, 이번에는 직접 NodeJS 프로젝트와 Sentry를 직접 연동해보겠다! 먼저 간단한 Typescript기반의 Nest 프레임워크를 이용한 NodeJS 프로젝트를

johnmarc.tistory.com

 

[NestJS] Sentry를 이용한 Bug Tracking

Sentry 웹 → Project → Create a new Project → Node 선택 → 프로젝트 생성후 DSN 복사main에 sentry 연결webhook.interceptorSlack API 홈페이지 → Create New App → 이름 및 workspac

velog.io

 

프론트엔드 에러 로그 시스템 Sentry 적용기

안녕하세요. 프론트엔드 개발을 하고 있는 gyu입니다. 어반베이스에서는 현재 운영되고 있는 서비스들의 화면과 기능을 개발하고, API 적용, 3D SDK 개발 등의 업무를 진행하고 있습니다. 서비스를

urbanbase.github.io

 

Slack Webhook API 생성하기

요즘 대부분의 개발도구들은 Slack과의 통합 (Integration)을 지원하지만, 여전히 미지원 하는 도구들도 많습니다. 이런 미지원 도구들을 Slack에 연동할때 Slack Webhook을 사용합니다. 저도 종종 사용하

jojoldu.tistory.com

 

nest-raven

Sentry Raven Module for Nest Framework. Latest version: 8.0.0, last published: 8 months ago. Start using nest-raven in your project by running `npm i nest-raven`. There are 9 other projects in the npm registry using nest-raven.

www.npmjs.com

 

[DevOps] 로그 수집 및 모니터링 시스템 - Sentry (1탄)

대부분의 개발자들은 자기가 만든 프로그램을 잘 믿지 않는다. 서버 개발자인 나는 처음으로 외주 작업을 진행했을 때, 내 프로그램이 장애 없이 잘 돌아가는지 계속해서 확인해보기도 하고, 원

johnmarc.tistory.com

 

Slack으로 process가 정상적으로 시작되었는지 나타내는 이쁜 메시지 만들기(Incoming webhook과 Attachment

Slack은 개발자들이 사랑하는 커뮤니케이션 도구 중 하나이다. Slack의 webhook을 사용하여 back-end서버에 개발한 application process가 정상적으로 실행되고 있는지, 정상적으로 꺼졌는지 여부 등을 알림

blog.voidmainvoid.net

 

Sentry 적용 편하게 이슈를 Tracking 하즈아!

Sentry 개발을 하다 보면 에러 로그를 Tracking 해야 할 때가 무조건 있다? 아니 무조건 해야 한다. 오류의 레벨? 에 따라 치명적 일 수도 있기 때문이다. 이런 로그들을 한 곳에서 관리 하고 그 로그

kykkyn2.tistory.com