앞서 Prometheus 모니터링 시스템을 도입하게 된 배경과 Loki와의 차이점, 그리고 다양한 메트릭 유형에 대해 알아보았다. 이전 글에서는 NestJS 애플리케이션에서 Prometheus를 활용해 기본 시스템 메트릭을 수집하는 방법을 살펴봤다. 이번 글에서는 API 호출 관련 메트릭을 수집하고 모니터링하는 방법을 알아보자.
시스템 메트릭은 CPU, 메모리, 이벤트 루프 지연 등 인프라 측면의 상태는 알 수 있지만, 실제 서비스의 사용 패턴이나 성능에 대한 인사이트를 얻기는 어렵다. 그래서 다음과 같은 정보를 얻기 위해 API 메트릭 수집이 필요하다
수집할 API 메트릭
API 모니터링을 위해 두 가지 핵심 메트릭을 수집하기로 했다.
PrometheusService 확장하기
이제 기존 PrometheusService에 API 메트릭 관련 코드를 추가해보자
import { Injectable, OnModuleInit } from '@nestjs/common';
import { collectDefaultMetrics, Counter, Histogram } from 'prom-client';
import { globalRegistry } from './registry';
@Injectable()
export class PrometheusService implements OnModuleInit {
// API 요청 카운터
public httpRequestsTotal: Counter;
// API 응답 시간 히스토그램
public httpRequestDuration: Histogram;
onModuleInit() {
const existingMetrics = globalRegistry.getMetricsAsArray();
const hasRequestsMetric = existingMetrics.some(
(m) => m.name === 'http_requests_total',
);
if (!hasRequestsMetric) {
// 기본 Node.js 메트릭 수집
collectDefaultMetrics({ register: globalRegistry });
// API 요청 카운터 추가
this.httpRequestsTotal = new Counter({
name: 'http_requests_total',
help: '총 HTTP 요청 수',
labelNames: ['method', 'path', 'status'],
registers: [globalRegistry],
});
this.httpRequestDuration = new Histogram({
name: 'http_request_duration_seconds',
help: 'HTTP 요청 처리 시간(초)',
labelNames: ['method', 'path', 'status'],
buckets: [0.01, 0.05, 0.1, 0.3, 0.5, 1, 3, 5, 10],
registers: [globalRegistry],
});
} else {
this.httpRequestsTotal = globalRegistry.getSingleMetric(
'http_requests_total',
) as Counter;
this.httpRequestDuration = globalRegistry.getSingleMetric(
'http_request_duration_seconds',
) as Histogram;
}
}
getMetrics(): Promise<string> {
return globalRegistry.metrics();
}
}
API 메트릭 선택과 의도
this.httpRequestsTotal = new Counter({
name: 'http_requests_total',
help: '총 HTTP 요청 수',
labelNames: ['method', 'path', 'status'],
registers: [globalRegistry],
});
요청이 들어올 때마다 값이 1씩 증가하는 단순 누적 카운터다. API별 호출 빈도를 정확히 측정하기 위해 이 타입을 선택했다. 일정 시간 동안 어떤 API가 얼마나 자주 호출되는지 파악하면 사용자들이 어떤 기능을 많이 쓰는지 알 수 있다.
이 카운터를 통해 "GET /post/:id 엔드포인트가 지난 1시간 동안 5,000번 호출됐다" 같은 정보를 얻을 수 있다. 또한 요청이 갑자기 급증하는 경우 자동 스케일링 같은 대응도 가능하다.