project/NestJS + Kubernetes & 마이크로서비스 배포

📌 NestJS + Kubernetes & 마이크로서비스 배포: 실전 가이드 - NestJS + APM: 모니터링 및 성능 추적 시스템 도입

octo54 2025. 5. 29. 12:27
반응형

📌 NestJS + Kubernetes & 마이크로서비스 배포: 실전 가이드

37. NestJS + APM: 모니터링 및 성능 추적 시스템 도입


고도화된 SaaS 서비스 운영에서 필수적인 것은 서비스 상태에 대한 가시성 확보입니다.
NestJS는 다양한 APM (Application Performance Monitoring) 도구와 잘 통합되며,
에러 트래킹, 성능 모니터링, 로그 수집, 사용자 행동 추적까지 모두 연동할 수 있습니다.

이번 글에서는 NestJS 프로젝트에 Datadog, Sentry, Prometheus, Grafana 등을 통합하는 방법과 실전 적용 전략을 다룹니다. 📈


✅ 1. APM이란?

Application Performance Monitoring
실행 중인 애플리케이션의 상태, 성능, 오류, 리소스 사용률 등을 추적하여
문제 조기 탐지운영 효율성 향상을 목표로 함.


✅ 2. APM 도구 비교

도구 장점 용도

Sentry 에러 추적에 특화, stack trace, 사용자 세션 추적 예외 추적, 사용자 분석
Datadog APM 트레이싱 + 로그 + 인프라 통합 전체 서비스 추적 및 대시보드
Prometheus 오픈소스, 커스텀 메트릭 수집 가능 지표 수집 및 Grafana 연동
Grafana 시각화 도구로 Prometheus와 궁합 좋음 대시보드

✅ 3. Sentry 통합

📦 설치

npm install @sentry/node @sentry/integrations

📂 main.ts

import * as Sentry from '@sentry/node';

Sentry.init({
  dsn: process.env.SENTRY_DSN,
  tracesSampleRate: 1.0,
});

async function bootstrap() {
  const app = await NestFactory.create(AppModule);

  app.useGlobalFilters(new AllExceptionsFilter()); // Sentry 연동된 에러 필터
  await app.listen(3000);
}

📂 filters/all-exceptions.filter.ts

@Catch()
export class AllExceptionsFilter implements ExceptionFilter {
  catch(exception: unknown, host: ArgumentsHost) {
    Sentry.captureException(exception);
    throw exception;
  }
}

✅ 4. Datadog APM 연동 (Node.js)

반응형

📦 설치

npm install dd-trace

📂 main.ts

import 'dd-trace/init'; // 최상단에서 import
import { NestFactory } from '@nestjs/core';

Datadog Agent는 별도 Docker 또는 시스템 서비스로 구동 필요.


✅ 5. Prometheus + Grafana 통합

📦 설치

npm install prom-client

📂 metrics/metrics.service.ts

import { Injectable } from '@nestjs/common';
import * as client from 'prom-client';

@Injectable()
export class MetricsService {
  private readonly requestCounter = new client.Counter({
    name: 'http_requests_total',
    help: 'Total number of requests',
  });

  countRequest() {
    this.requestCounter.inc();
  }

  getMetrics(): Promise<string> {
    return client.register.metrics();
  }
}

📂 metrics.controller.ts

@Controller('metrics')
export class MetricsController {
  constructor(private readonly metricsService: MetricsService) {}

  @Get()
  async get() {
    return this.metricsService.getMetrics();
  }
}

Prometheus가 주기적으로 /metrics 엔드포인트를 수집하면 Grafana에서 시각화 가능.


✅ 6. 운영 환경에서 APM 적용 시 고려사항

항목 설명

성능 오버헤드 트레이싱 비율 조정 (sampling rate) 필수
보안 및 마스킹 로그에 개인정보 포함되지 않도록 주의
멀티 테넌시 대응 로그/메트릭에 tenant_id 포함하도록 확장
Slack/Email 연동 오류 알림 자동화 (Sentry, Datadog 가능)

✅ 7. APM 활용 예시

상황 해결 방식

특정 요청에서만 지연 발생 Datadog 트레이스 분석
고정된 API 호출에서 자주 오류 발생 Sentry로 발생 경로 파악
서비스 CPU 급증 Prometheus로 리소스 추적
테넌트별 트래픽 분석 필요 tenant_id 메트릭 분기 수집

✅ 결론: 안정적인 SaaS 운영을 위한 필수 전략

✅ 에러는 Sentry로 즉시 트래킹
✅ 리소스/지표는 Prometheus + Grafana로 실시간 대시보드 구성
✅ 전체 트레이싱은 Datadog APM으로 통합
✅ 모든 분석은 tenant_id, user_id 기준으로 세분화

다음 글에서는 NestJS 마이크로서비스 기반 아키텍처에서의 NATS, RabbitMQ, Kafka와 같은 메시지 브로커 도입 전략과 예제를 다룹니다! 🧩


🔍 다음 글 예고: NestJS + 메시지 브로커 실전 – NATS, Kafka, RabbitMQ 비교 및 적용

📌 다음 편: 38. NestJS 메시지 브로커 도입 가이드


 

NestJS APM,NestJS Sentry 연동,NestJS Datadog 사용법,NestJS Prometheus 지표,NestJS Grafana 대시보드,NestJS 성능 모니터링,NestJS 로그 수집,NestJS 에러 추적,NestJS SaaS 운영,NestJS 모니터링 시스템