본 콘텐츠의 이미지 및 내용은 AI로 생성되었습니다.
본 콘텐츠의 이미지 및 내용을 무단으로 복제, 배포, 수정하여 사용할 경우 저작권법에 의해 법적 제재를 받을 수 있습니다.
이미지 로딩 중...
AI Generated
2025. 11. 3. · 27 Views
Monitoring 테스트 전략 완벽 가이드
프로덕션 환경에서 시스템을 안정적으로 운영하기 위한 모니터링 테스트 전략을 학습합니다. 헬스체크, 메트릭 수집, 알림 시스템 등 실전에서 바로 활용 가능한 모니터링 테스트 패턴을 다룹니다.
들어가며
이 글에서는 Monitoring 테스트 전략 완벽 가이드에 대해 상세히 알아보겠습니다. 총 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
댓글 (0)
함께 보면 좋은 카드 뉴스
UX와 협업 패턴 완벽 가이드
AI 에이전트와 사용자 간의 효과적인 협업을 위한 UX 패턴을 다룹니다. 프롬프트 핸드오프부터 인터럽트 처리까지, 현대적인 에이전트 시스템 설계의 핵심을 배웁니다.
Logging, Observability & Debugging 완벽 가이드
AI 에이전트 시대에 필수적인 로깅, 관측성, 디버깅 기법을 다룹니다. 구조화된 로깅부터 분산 추적, 성능 프로파일링까지 실무에서 바로 적용할 수 있는 핵심 기술을 익혀봅니다.
AI 에이전트 신뢰성 완벽 가이드 - 가드레일과 평가 시스템
AI 에이전트가 예상치 못한 행동을 하지 않도록 안전장치를 설계하고, 품질을 체계적으로 평가하는 방법을 배웁니다. 실무에서 바로 적용할 수 있는 가드레일 패턴과 평가 프레임워크를 다룹니다.
Flutter Flame 게임 테스팅과 디버깅 완벽 가이드
Flutter와 Flame 엔진으로 개발한 게임의 품질을 보장하는 테스팅 기법과 디버깅 도구를 다룹니다. 단위 테스트부터 골든 테스트, 크래시 리포팅까지 실무에서 바로 적용할 수 있는 내용을 담았습니다.
자가 치유 및 재시도 패턴 완벽 가이드
AI 에이전트와 분산 시스템에서 필수적인 자가 치유 패턴을 다룹니다. 에러 감지부터 서킷 브레이커까지, 시스템을 스스로 복구하는 탄력적인 코드 작성법을 배워봅니다.