🤖

본 콘텐츠의 이미지 및 내용은 AI로 생성되었습니다.

⚠️

본 콘텐츠의 이미지 및 내용을 무단으로 복제, 배포, 수정하여 사용할 경우 저작권법에 의해 법적 제재를 받을 수 있습니다.

이미지 로딩 중...

Monitoring 테스트 전략 완벽 가이드 - 슬라이드 1/11
A

AI Generated

2025. 11. 3. · 9 Views

Monitoring 테스트 전략 완벽 가이드

프로덕션 환경에서 시스템을 안정적으로 운영하기 위한 모니터링 테스트 전략을 학습합니다. 헬스체크, 메트릭 수집, 알림 시스템 등 실전에서 바로 활용 가능한 모니터링 테스트 패턴을 다룹니다.


카테고리:TypeScript
언어:TypeScript
메인 태그:#TypeScript
서브 태그:
#Monitoring#HealthCheck#Metrics#Testing

들어가며

이 글에서는 Monitoring 테스트 전략 완벽 가이드에 대해 상세히 알아보겠습니다. 총 10가지 주요 개념을 다루며, 각각의 개념에 대한 설명과 실제 코드 예제를 함께 제공합니다.

목차

  1. 기본_헬스체크_엔드포인트
  2. 데이터베이스_연결_헬스체크
  3. 메트릭_수집_테스트
  4. 응답_시간_모니터링
  5. 에러_레이트_모니터링
  6. 로그_레벨_검증
  7. 알림_시스템_테스트
  8. 서킷_브레이커_패턴
  9. 리소스_사용량_모니터링
  10. 분산_추적_테스트

1. 기본 헬스체크 엔드포인트

개요

서비스의 생존 여부를 확인하는 가장 기본적인 헬스체크 엔드포인트를 구현하고 테스트합니다.

코드 예제

// health.controller.ts
export class HealthController {
  @Get('/health')
  checkHealth() {
    return { status: 'ok', timestamp: Date.now() };
  }
}

// health.controller.spec.ts
test('헬스체크 엔드포인트 응답 확인', async () => {
  const response = await request(app).get('/health');
  expect(response.status).toBe(200);
  expect(response.body.status).toBe('ok');
});

설명

헬스체크 엔드포인트는 로드밸런서나 오케스트레이션 도구가 서비스 상태를 확인하는데 사용됩니다. 테스트에서는 정상 응답과 타임스탬프를 검증합니다.


2. 데이터베이스 연결 헬스체크

개요

데이터베이스 연결 상태를 포함한 심화된 헬스체크를 구현하여 실제 서비스 가용성을 확인합니다.

코드 예제

export class HealthService {
  async checkDatabase(): Promise<boolean> {
    try {
      await this.db.query('SELECT 1');
      return true;
    } catch (error) {
      return false;
    }
  }
}

test('DB 연결 상태 확인', async () => {
  const isHealthy = await healthService.checkDatabase();
  expect(isHealthy).toBe(true);
});

설명

단순히 서버가 살아있는지뿐만 아니라 데이터베이스 연결 상태까지 확인하여 실제 서비스 가능 여부를 정확히 판단합니다.


3. 메트릭 수집 테스트

개요

Prometheus나 StatsD 같은 메트릭 수집 시스템과의 통합을 테스트하여 모니터링 데이터가 정확히 수집되는지 확인합니다.

코드 예제

import { Counter, Registry } from 'prom-client';

const requestCounter = new Counter({
  name: 'http_requests_total',
  help: 'Total HTTP requests'
});

test('메트릭 카운터 증가 확인', () => {
  requestCounter.inc();
  requestCounter.inc();
  const metrics = requestCounter.get();
  expect(metrics.values[0].value).toBe(2);
});

설명

메트릭이 정확히 수집되는지 테스트하여 모니터링 대시보드의 데이터 정확성을 보장합니다. 카운터, 게이지, 히스토그램 등 다양한 메트릭 타입을 검증합니다.


4. 응답 시간 모니터링

개요

API 응답 시간을 측정하고 임계값을 초과하는 경우를 감지하는 테스트를 작성합니다.

코드 예제

test('API 응답 시간 임계값 테스트', async () => {
  const startTime = Date.now();
  await request(app).get('/api/users');
  const duration = Date.now() - startTime;

  expect(duration).toBeLessThan(1000); // 1초 이내
});

// 히스토그램으로 응답 시간 추적
const histogram = new Histogram({
  name: 'http_request_duration_ms',
  help: 'HTTP request duration'
});

설명

성능 저하를 조기에 감지하기 위해 응답 시간을 모니터링하고 테스트합니다. SLA 준수 여부를 자동으로 검증할 수 있습니다.


5. 에러 레이트 모니터링

개요

에러 발생률을 추적하고 임계값을 초과하면 알림을 발생시키는 로직을 테스트합니다.

코드 예제

class ErrorRateMonitor {
  private errorCount = 0;
  private totalCount = 0;

  recordRequest(isError: boolean) {
    this.totalCount++;
    if (isError) this.errorCount++;
  }

  getErrorRate() {
    return this.errorCount / this.totalCount;
  }
}

test('에러율 임계값 초과 감지', () => {
  const monitor = new ErrorRateMonitor();
  monitor.recordRequest(true);
  monitor.recordRequest(false);
  expect(monitor.getErrorRate()).toBe(0.5);
});

설명

에러 발생률이 특정 임계값(예: 5%)을 초과하면 즉시 알림을 받아 장애를 빠르게 대응할 수 있습니다.


6. 로그 레벨 검증

개요

프로덕션 환경에서 적절한 로그 레벨이 사용되는지 검증하고, 민감한 정보가 로깅되지 않는지 테스트합니다.

코드 예제

test('프로덕션 로그 레벨 확인', () => {
  process.env.NODE_ENV = 'production';
  const logger = new Logger();

  expect(logger.level).toBe('info');
  expect(logger.level).not.toBe('debug');
});

test('민감정보 로깅 방지', () => {
  const logSpy = jest.spyOn(console, 'log');
  logger.info('User password: secret123');

  expect(logSpy).not.toHaveBeenCalledWith(
    expect.stringContaining('secret123')
  );
});

설명

과도한 로그는 성능에 영향을 주고, 민감정보 유출의 위험이 있으므로 로그 레벨과 내용을 테스트로 검증합니다.


7. 알림 시스템 테스트

개요

Slack, PagerDuty 등 알림 시스템과의 통합을 테스트하여 장애 발생 시 알림이 정상적으로 전송되는지 확인합니다.

코드 예제

class AlertService {
  async sendAlert(message: string) {
    await fetch('https://hooks.slack.com/webhook', {
      method: 'POST',
      body: JSON.stringify({ text: message })
    });
  }
}

test('임계값 초과 시 알림 전송', async () => {
  const mockFetch = jest.fn();
  global.fetch = mockFetch;

  await alertService.sendAlert('CPU usage > 80%');
  expect(mockFetch).toHaveBeenCalledTimes(1);
});

설명

알림 전송 로직을 모킹하여 실제 알림을 보내지 않고도 알림 시스템이 정상 작동하는지 검증합니다.


8. 서킷 브레이커 패턴

개요

외부 서비스 장애 시 연쇄 장애를 방지하는 서킷 브레이커 패턴을 테스트합니다.

코드 예제

class CircuitBreaker {
  private failureCount = 0;
  private state = 'CLOSED';

  async call(fn: Function) {
    if (this.state === 'OPEN') throw new Error('Circuit Open');
    try {
      return await fn();
    } catch (error) {
      if (++this.failureCount >= 3) this.state = 'OPEN';
      throw error;
    }
  }
}

test('3회 실패 후 서킷 오픈', async () => {
  const breaker = new CircuitBreaker();
  await expect(breaker.call(() => Promise.reject())).rejects.toThrow();
});

설명

외부 API 호출이 반복 실패하면 서킷을 오픈하여 더 이상 호출하지 않고 빠르게 실패하도록 합니다.


9. 리소스 사용량 모니터링

개요

CPU, 메모리 사용량을 모니터링하고 임계값 초과 시 경고를 발생시키는 테스트를 작성합니다.

코드 예제

import os from 'os';

class ResourceMonitor {
  getCpuUsage() {
    const cpus = os.cpus();
    const idle = cpus.reduce((acc, cpu) => acc + cpu.times.idle, 0);
    const total = cpus.reduce((acc, cpu) =>
      acc + Object.values(cpu.times).reduce((a, b) => a + b), 0);
    return 1 - idle / total;
  }
}

test('CPU 사용률 임계값 테스트', () => {
  const monitor = new ResourceMonitor();
  const usage = monitor.getCpuUsage();
  expect(usage).toBeLessThan(0.8); // 80% 미만
});

설명

시스템 리소스 사용량을 주기적으로 체크하여 과부하 상태를 미리 감지하고 스케일아웃 등의 조치를 취할 수 있습니다.


10. 분산 추적 테스트

개요

마이크로서비스 환경에서 요청 추적을 위한 Trace ID 전파를 테스트합니다.

코드 예제

// trace.middleware.ts
export function traceMiddleware(req, res, next) {
  req.traceId = req.headers['x-trace-id'] || generateId();
  res.setHeader('x-trace-id', req.traceId);
  next();
}

test('Trace ID 전파 확인', async () => {
  const traceId = 'test-trace-123';
  const response = await request(app)
    .get('/api/users')
    .set('x-trace-id', traceId);

  expect(response.headers['x-trace-id']).toBe(traceId);
});

설명

분산 시스템에서 하나의 요청을 여러 서비스에 걸쳐 추적할 수 있도록 Trace ID를 전파하고 검증합니다.


마치며

이번 글에서는 Monitoring 테스트 전략 완벽 가이드에 대해 알아보았습니다. 총 10가지 개념을 다루었으며, 각각의 사용법과 예제를 살펴보았습니다.

관련 태그

#TypeScript #Monitoring #HealthCheck #Metrics #Testing

#TypeScript#Monitoring#HealthCheck#Metrics#Testing

댓글 (0)

댓글을 작성하려면 로그인이 필요합니다.