Javascript/NestJS

NestJS Health Check API

kyoulho 2023. 3. 29. 13:52

Health check API

서버나 애플리케이션의 상태를 모니터링하기 위한 API입니다. 일반적으로 HTTP GET 요청을 통해 접근할 수 있으며, 서버나 애플리케이션의 상태를 나타내는 정보를 반환합니다. 클라우드 서비스나 마이크로서비스 아키텍처를 사용하는 애플리케이션에서 널리 사용됩니다.

AWS CodeDeploy의 배포는 Health Check API를 호출하여 지정된 상태값이 돌아오는지 확인 후에 배포를 마무리하기도 합니다.

또한 프라이빗 서브넷에 존재하는 데이터베이스의 상태를 쉽게 확인할 수 있는 방법이기도 합니다.

이 글은 NestJS의 공식 문서를 기반으로 작성되었습니다.

 

@nestjs/terminus 설치하기

NestJS 프레임워크에서 사용할 수 있는 Health check 모듈입니다. 이 모듈을 사용하면 API 서버의 상태를 모니터링하고, 서버 상태에 대한 정보를 클라이언트에게 반환할 수 있습니다.  이 모듈은 HTTP 요청뿐만 아니라 TCP, UDP, DNS 등의 프로토콜을 지원하며, 사용자 정의 체크도 추가할 수 있습니다. @nestjs/terminus는 NestJS의 @nestjs/swagger와 같은 방식으로 사용할 수 있으며, health 엔드포인트를 등록하여 서버의 상태 정보를 반환할 수 있습니다. 이를 통해 API 서버의 가용성과 안정성을 모니터링할 수 있습니다.

 

$ npm install --save @nestjs/terminus

 

@nestjs/axios 설치하기

Axios는 Promise 기반의 HTTP 클라이언트이며, Node.js와 브라우저에서 모두 사용할 수 있습니다. NestJS에서 @nestjs/axios를 사용하면 간단하고 효율적인 방식으로 HTTP 요청을 보낼 수 있습니다.

@nestjs/axios는 다음과 같은 기능을 제공합니다.

  • 간단한 HTTP 요청 보내기
  • HTTP 요청을 취소하기
  • HTTP 응답을 인터셉트하고 변형하기
  • 인터셉터를 사용하여 요청과 응답을 변형하기
  • 다중 인스턴스로 클라이언트 구성하기
  • HTTP 요청을 캐싱하기
npm install --save @nestjs/axios

 

Health Module

nest g module health
import { Module } from '@nestjs/common';
import { HealthController } from './health.controller';
import { TerminusModule } from '@nestjs/terminus';
import { HttpModule } from '@nestjs/axios';

@Module({
  imports: [
    TerminusModule,
    HttpModule.register({ timeout: 5000, maxRedirects: 5 }),
  ],
  controllers: [HealthController],
})
export class HealthModule {}

 

Health Controller

nest g controller health
import { Controller, Get } from '@nestjs/common';
import {
  DiskHealthIndicator,
  HealthCheck,
  HealthCheckService,
  HttpHealthIndicator,
  TypeOrmHealthIndicator,
} from '@nestjs/terminus';

@Controller('/api/health')
export class HealthController {
  constructor(
    private health: HealthCheckService,
    private http: HttpHealthIndicator,
    private db: TypeOrmHealthIndicator,
    private disk: DiskHealthIndicator,
  ) {}

  @Get()
  @HealthCheck()
  check() {
    return this.health.check([
      () => this.http.pingCheck('nestjs-docs', 'https://docs.nestjs.com'),
      () => this.db.pingCheck('database'),
      () =>
        this.disk.checkStorage('storage', { path: '/', thresholdPercent: 0.5 }),
    ]);
  }
}

HealthCheckService, HttpHealthIndicator, TypeOrmHealthIndicator, DiskHealthIndicator 네 가지 종속성을 생성자를 통해 주입받습니다. 이들은 Terminus 라이브러리에서 제공되며, 애플리케이션의 다양한 구성 요소에 대해 건강 상태 검사를 수행하는 데 사용됩니다.

@HealthCheck() 데코레이터는 check() 메서드가 건강 상태 검사를 수행해야 함을 나타냅니다.

check() 메서드는 HealthCheckService의 check() 메서드를 호출하여 다양한 건강 상태 검사를 수행하는 함수들의 배열을 전달합니다. 이 경우, 외부 HTTP 리소스(nestjs-docs)의 가용성, 데이터베이스(database)의 가용성 및 서버 디스크(storage)의 여유 공간 양을 확인합니다. 건강 상태 검사 중 어떤 검사도 실패하지 않으면, check() 메서드는 애플리케이션이 건강함을 나타내는 응답을 반환하고, 검사 중 하나라도 실패하면 애플리케이션이 건강하지 않음을 나타내는 응답을 반환합니다.

 

확인하기