앞서 Prometheus 모니터링 시스템을 도입하게 된 배경과 Loki와의 차이점, 그리고 다양한 메트릭 유형에 대해 알아보았다. 이번 글에서는 실제로 NestJS 애플리케이션에서 Prometheus를 활용해 기본 시스템 메트릭을 수집하는 방법에 대해 알아볼 것이다.
시스템 기본 메트릭의 중요성
시스템 기본 메트릭은 애플리케이션의 건강 상태를 나타내는 핵심 지표이다. CPU 사용량, 메모리 사용률, 이벤트 루프 지연 등의 기본 메트릭을 모니터링함으로써 시스템 병목 현상이나 자원 누수와 같은 문제를 조기에 발견할 수 있다. 이러한 메트릭은 성능을 최적화하거나 향후 시스템 확장을 계획할 때도 중요한 정보를 제공한다.
Prometheus 로그 수집 방식
프로메테우스의 로그 수집 방식은 로키와 다른 특징을 가지고 있다.
#프롬테일 세팅 예시
clients:
- url: <http://loki:3100/loki/api/v1/push>
#프로메테우스 pull 세팅 예시 /metrics(Http요청 경로)
scrape_configs:
- job_name: 'nodejs'
static_configs:
- targets: ['localhost:3005']
metrics_path: /metrics
로키는 프롬테일(Promtail) 같은 에이전트가 클라이언트 쪽에서 로그를 수집해서 푸시(Push) 하는 방식인 반면 프로메테우스는 풀(Pull) 방식으로 작동한다.
프로메테우스가 일정 간격으로 애플리케이션의 /metrics 같은 엔드포인트에 직접 HTTP 요청을 보내서 메트릭 데이터를 가져간다. 그래서 애플리케이션에서는 이 엔드포인트를 열어두고 메트릭 데이터를 Prometheus 포맷으로 제공해줘야 한다.
NestJS Prometheus 세팅
npm install prom-client
import { Injectable } from '@nestjs/common';
import { Registry, collectDefaultMetrics } from 'prom-client';
@Injectable()
export class PrometheusService {
private readonly registry: Registry;
constructor() {
// 새 레지스트리 생성
this.registry = new Registry();
// 기본 Node.js 메트릭 수집 설정
collectDefaultMetrics({ register: this.registry });
}
getMetrics(): Promise<string> {
return this.registry.metrics();
}
}
프로메테우스 클라이언트 라이브러리를 사용해 Registry를 생성하고 기본 Node.js 메트릭을 수집하도록 구성했다.
collectDefaultMetrics 함수는 CPU 사용량, 메모리 사용률, 이벤트 루프 지연 등 기본적인 Node.js 메트릭을 자동으로 수집한다.
이 정보들은 애플리케이션의 건강 상태를 모니터링하는 데 매우 중요한 기초 데이터다.