저번 포스트에서는 간략하게 Sentry에 대하여 설명을 했는데, 이번에는 직접 NodeJS 프로젝트와 Sentry를 직접 연동해보겠다!
먼저 간단한 Typescript기반의 Nest 프레임워크를 이용한 NodeJS 프로젝트를 만들어보자!
# NestJS CLI 를 전역으로 설치
npm i -g @nestjs/cli
# NestJS 기반 프로젝트 생성
nest new sentry_example
이후 Sentry와 연동을 도와주는 Raven 모듈을 설치해야 하는데, 요즘 NestJS 프레임워크를 썼기에 좀 더 편하게 적용하기 위해서 NestJS용 Raven 모듈을 다운로드했다.
# Raven Library
https://www.npmjs.com/package/raven
# NestJS Library for Raven
https://www.npmjs.com/package/nest-raven
그러면 nest-raven 설치를 해준다.
# 먼저 Sentry clien for nodejs 라이브러리를 설치
yarn add @sentry/node@5.4.3
# NestJS 모듈로 래핑해주는 nest-raven 라이브러리를 설치
yarn add nest-raven
그다음 NestJS 프로젝트에서 Entry 파일인 main.ts에 Sentry 접속 정보와 함께 초기화해준다.
import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
import { init as SentryInit } from '@sentry/node';
async function bootstrap() {
const app = await NestFactory.create(AppModule);
SentryInit({
dsn: '프로젝트 DSN를 넣어주세요',
});
await app.listen(3000);
}
bootstrap();
그다음에는 App 모듈를 정의하는 app.module.ts 파일에 다음과 같이 RavenModule을 Import 시켜준다. 그 다음에는 APP에서 발생하는 예외를 모두 처리하도록 Global하게 RavenInterceptor를 등록해준다.
import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { RavenModule, RavenInterceptor } from 'nest-raven';
import { APP_INTERCEPTOR } from '@nestjs/core';
@Module({
imports: [RavenModule],
controllers: [AppController],
providers: [
{
provide: APP_INTERCEPTOR,
useValue: new RavenInterceptor(),
},
AppService,
],
})
export class AppModule {}
그 다음에는 AppController 역할을 하는 app.controller.ts 에서 Hello Wolrd를 리턴하는 getHello 함수 외에 따로 에러를 발생시키는 함수를 작성해보자.
import { Controller, Get } from '@nestjs/common';
import { AppService } from './app.service';
@Controller()
export class AppController {
constructor(private readonly appService: AppService) {}
@Get()
getHello(): string {
return this.appService.getHello();
}
@Get('/error')
getError(): void {
throw new Error('Hi Sentry!');
}
}
이제 해당 application을 실행해보자!
yarn start:dev
http://localhost:3000/으로 접속하면 helloworld를 출력하는 페이지가 다음과 같이 나타난다!
자 그러면 error를 발생시키는 http://localhost:3000/error로 요청을 다시 날려보자! 해당 요청이 들어오면 서버는 예외를 발생시키고, Sentry의 Raven 모듈이 관련 정보를 Sentry로 보낼 것이다!
접속 결과 에러 관련 정보가 브라우저에 표시되었다. 성공적으로 에러가 발생한 것이다! 그렇다면 서버 로그는 어떨까?
서버에서도 Hi Sentry!라는 에러 메시지와 stacktrace 정보가 잘 로깅되었다! 그렇다면 Sentry 프로젝트에 접속하여 로깅 결과를 살펴보자!
접속해보니 비어있는 이슈 리스트에 Error 항목이 새로 생겼다!!(두근두근) Sentry Node 모듈과 nest-raven 모듈이 성공적으로 에러 관련 정보를 가로채어 Sentry로 보낸 것이다! 자세히 보면 두 번째 줄에 Hi Sentry라는 텍스트로 에러 메시지가 표시되는 것을 볼 수 있다.
그렇다면 에러 관련 정보는 어떻게 표시될까? 한번 항목을 눌러 자세한 정보를 확인해보자!
에러가 발생한 코드의 위치와 관련 stacktrace의 정보 (항목을 누르면 더 자세한 내용이 표시된다.)와 에러 발생시간, IP 등 다양한 정보가 표시되며, 해당 이슈에 대한 태그와 또한 팀원에게 assign 할 것인지도 정할 수 있다.
정말이지 너무 좋다!!!!
Sentry로 로그를 보낼 때 여러 옵션과 설정 값들이 있다. 해당 정보들은 자세히 다루지 않을 예정이다 ㅎㅎ ( 목적에 맞게 찾아서 적용해보세요..)
간단하게 NodeJS application을 Sentry와 연동시켜 에러 로그를 수집하고 이를 모니터링할 수 있는 방법에 대하여 설명하였다. 다음엔 또 다른 모니터링 및 로그 관련 시스템에 대하여 설명하도록 하겠다!
'Programming > Server' 카테고리의 다른 글
[ELK] AWS Elastic Load Balancer Log 분석하고 대시보드 만들기[1] (0) | 2019.11.06 |
---|---|
[Network HTTP, HTTPS] CORS 정책에 따른 쿠키 보안 (0) | 2019.08.13 |
DataCommunication - 9장 (0) | 2017.05.10 |
DataCommunication - 7장 (0) | 2017.05.10 |
DataCommunication - 6장 (0) | 2017.05.10 |