개발일지

Nest.JS 헬스 체크

index.ys 2023. 8. 18. 01:38

헬스 체크( Health check)

  • 서버 운영중 트래픽이 증가하여 DB에 부하가 생기거나 네트워크 연결에 장애가 발생할 수 있음
  • 서버는 HTTP, DB, 메모리, 디스크 상태 등을 체크하는 헬스 체크 장치가 있어야함
  • 상태가 좋지 않은경우 슬랙같은 메신저를 통해 서버 상태를 파악하고 에러 메세지를 전송해야함
  • 모니터링 전략을 세워 서버의 상태를 파악해야함

헬스 체크 라이브러리

  • Nest는 Terminus(@nestjs/terminus) 헬스 체크 라이브러리를 제공함
  • Terminus는 다양한 상태 표시기 health indicator를 제공함
  • HttpHealthIndicator
  • MongooseHealthInicator
  • TypeOrmHealthIndicator
  • SequelizeHealthIndicator
  • MicroServiceHealthIndicator
  • MemoryHealthIndicator
  • GRPCHealthIndicator
  • DiskHealthIndicator

라이브러리 설치

npm i @nestjs/terminus

헬스 체크 컨트롤러

  • 상태확인은 특정 라우터 엔드포인트에 요청을 보내고 응답을 확인하는 방법을 사용
  • HttpHealthIndicator가 제공하는 pingCheck함수를 이룔하여 서비스가 제공하는 다른 서버가 잘 동작하고 있는지 확인
  • pingCheck함수 첫번째 인자로는 nestjs-docs로 응답을 받는 객체
  • 두번째 인자로는 요청을 보낼 url 주소 ex) https://www.naver.com/
import { Controller, Get } from '@nestjs/common';
import {
  HealthCheckService,
  HttpHealthIndicator,
  HealthCheck,
  TypeOrmHealthIndicator,
} from '@nestjs/terminus';
import { DogHealthIndicator } from './dog.health';

//healthc-check 컨트롤러 생성
@Controller('health-check')
export class HealthCheckController {
  constructor(
    private health: HealthCheckService,
    private http: HttpHealthIndicator,

    //컨트롤러에 typeOrmHealthindicator DI주입
    private db: TypeOrmHealthIndicator,
    private dogHealthIndicator: DogHealthIndicator,
  ) {}

  @Get()
  @HealthCheck()
  check() {
    return this.health.check([
      //https://docs.nestjs.com에 요청을 보내서 응답을 잘 받으면 응답 결과를 ''nestjs-docs'로 응답
      //상태값 up은 정상동작하는 상태
      () => this.http.pingCheck('nestjs-docs', 'https://docs.nestjs.com'),
      //데이터 베이스의 상태를 확인하는 헬스체크
      () => this.db.pingCheck('database'),
      //() => this.dogHealthIndicator.isHealthy('dog'),
    ]);
  }
}

HttpHealthIndicator

  • 동작과정에서 axios요청을 필요로함 axis는 HTTP 클라이언트 패키지로서 HTTP 네트워크 통신 구현
npm i @nestjs/axios

app.module.ts

  • app.module에 httpModule을 추가하여 다른 컴포넌트에서도 사용가능 하도록 주입
import { HttpModule } from '@nestjs/axios';

@Module({
	imports:[
    ...다른 모듈들
    HttpModule]
})

요청/응답