일반 에러 처리
개요
이 문서는 QA Agent 사용 중 발생할 수 있는 일반적인 에러와 그 해결 방법을 설명합니다.
에러 분류
1. 시스템 레벨 에러
1.1 연결 오류
에러 코드: QA_CONN_001
{
"code": "QA_CONN_001",
"message": "CONNECTION_TIMEOUT",
"detail": "Failed to connect to QA Agent service",
"timestamp": 1679471431000
}
원인:
- 네트워크 연결 문제
- QA Agent 서비스 다운
- 방화벽 차단
해결 방법:
- 네트워크 연결 상태 확인
- QA Agent 서비스 상태 확인:
curl https://qa-agent-{env}.sleepq.ai/v1/health - 방화벽 설정 확인
- 재시도 로직 구현
1.2 인증 오류
에러 코드: QA_AUTH_001
{
"code": "QA_AUTH_001",
"message": "UNAUTHORIZED",
"detail": "Invalid or expired authentication token",
"timestamp": 1679471431000
}
원인:
- 토큰 만료
- 잘못된 토큰
- 권한 부족
해결 방법:
- 토큰 갱신
- 올바른 토큰 사용 확인
- 필요한 권한 확인
2. 리소스 관련 에러
2.1 리소스 부족
에러 코드: QA_RES_001
{
"code": "QA_RES_001",
"message": "RESOURCE_EXHAUSTED",
"detail": "Insufficient resources to execute test",
"metadata": {
"requestedCpu": "4",
"availableCpu": "2",
"requestedMemory": "8GB",
"availableMemory": "4GB"
}
}
원인:
- CPU/메모리 부족
- 동시 실행 한계 초과
- 디스크 공간 부족
해결 방법:
- 리소스 요구사항 조정
- 병렬 실행 수준 감소
- 리소스 정리 후 재시도
2.2 Rate Limiting
에러 코드: QA_RATE_001
{
"code": "QA_RATE_001",
"message": "RATE_LIMIT_EXCEEDED",
"detail": "Too many requests",
"retryAfter": 60
}
원인:
- API 호출 한도 초과
- 단시간 내 과도한 요청
해결 방법:
- 지수 백오프 구현
- 요청 간격 조정
- 배치 처리 활용
3. 데이터 관련 에러
3.1 데이터 유효성 검증 실패
에러 코드: QA_DATA_001
{
"code": "QA_DATA_001",
"message": "INVALID_DATA",
"detail": "Request data validation failed",
"errors": [
{
"field": "userId",
"message": "Invalid user ID format"
},
{
"field": "startTime",
"message": "Start time must be before end time"
}
]
}
원인:
- 잘못된 데이터 형식
- 필수 필드 누락
- 데이터 제약 조건 위반
해결 방법:
- 입력 데이터 검증
- 데이터 형식 확인
- API 문서 참조
3.2 데이터 없음
에러 코드: QA_DATA_404
{
"code": "QA_DATA_404",
"message": "DATA_NOT_FOUND",
"detail": "Requested data does not exist",
"metadata": {
"entity": "TestRun",
"id": "run-12345"
}
}
원인:
- 존재하지 않는 리소스 조회
- 데이터 삭제됨
- 잘못된 ID 사용
해결 방법:
- 리소스 ID 확인
- 데이터 존재 여부 검증
- 삭제된 데이터 복구 검토
에러 처리 전략
1. 재시도 전략
1.1 지수 백오프
async function retryWithBackoff(fn, maxRetries = 3) {
let lastError;
for (let i = 0; i < maxRetries; i++) {
try {
return await fn();
} catch (error) {
lastError = error;
if (i < maxRetries - 1) {
const delay = Math.pow(2, i) * 1000; // 1s, 2s, 4s
await sleep(delay);
}
}
}
throw lastError;
}
1.2 조건부 재시도
function shouldRetry(error) {
const retryableCodes = ['QA_CONN_001', 'QA_RATE_001', 'QA_RES_001'];
return retryableCodes.includes(error.code);
}
2. 에러 로깅
2.1 구조화된 로깅
function logError(error, context) {
const errorLog = {
timestamp: Date.now(),
level: 'ERROR',
service: 'qa-agent-client',
error: {
code: error.code,
message: error.message,
detail: error.detail,
stack: error.stack,
},
context: {
userId: context.userId,
testRunId: context.testRunId,
action: context.action,
},
};
console.error(JSON.stringify(errorLog));
}
2.2 에러 집계
class ErrorAggregator {
constructor() {
this.errors = new Map();
}
add(error) {
const key = `${error.code}_${error.message}`;
const count = this.errors.get(key) || 0;
this.errors.set(key, count + 1);
}
getTopErrors(limit = 10) {
return Array.from(this.errors.entries())
.sort((a, b) => b[1] - a[1])
.slice(0, limit);
}
}
3. 에러 알림
3.1 임계값 기반 알림
const errorThresholds = {
QA_AUTH_001: { count: 10, window: 300000 }, // 5분 내 10회
QA_RES_001: { count: 5, window: 600000 }, // 10분 내 5회
QA_DATA_001: { count: 20, window: 300000 }, // 5분 내 20회
};
3.2 에스컬레이션
- Level 1: 로그 기록
- Level 2: 이메일 알림
- Level 3: SMS/전화 알림
- Level 4: 인시던트 생성
복구 절차
1. 자동 복구
- 재시도 메커니즘
- 폴백 전략
- 자가 치유
2. 수동 개입
- 관리자 알림
- 수동 재시작
- 데이터 복구
모범 사례
-
에러 예방
- 입력 검증 강화
- 리소스 모니터링
- 예외 처리 구현
-
빠른 감지
- 실시간 모니터링
- 이상 탐지
- 헬스체크
-
효과적인 대응
- 명확한 에러 메시지
- 상세한 로깅
- 신속한 알림
-
지속적 개선
- 에러 패턴 분석
- 근본 원인 해결
- 예방 조치 구현