0921에서 다음 같은 지표를 본다고 했다.
API Error Rate
Queue Pending
Oldest Job Age
UNKNOWN Job
DLQ
알림톡 실패율
Webhook 실패율
그런데 숫자만 있다고 운영 기준이 생기는 것은 아니다.
예를 들어:
API 실패율 0.7%
이 숫자가
정상인지
조금 나쁜 것인지
즉시 대응해야 하는 장애인지
판단하려면 기준이 필요하다.
마찬가지로:
Queue Oldest Job Age = 40초
도 업무에 따라 전혀 의미가 다르다.
실시간 알림톡이라면 40초가 길 수 있지만,
야간 통계 집계 Job이라면 아무 문제가 아닐 수 있다.
결국 운영 시스템에는
무엇을 측정할 것인가와 함께, 어느 수준까지 허용할 것인가
가 필요하다.
SLI는 Service Level Indicator다.
쉽게 말하면:
서비스 상태를 실제로 측정하는 지표
다.
예:
주문 API 성공률
주문 API 응답 속도
알림톡 처리 성공률
Webhook 처리 지연 시간
Export 완료 성공률
즉 SLI는 실제 측정값이다.
예를 들어:
지난 7일 주문 생성 성공률
99.94%
라면 이 99.94%가 SLI 결과다.
SLO는 Service Level Objective다.
즉:
우리가 목표로 하는 서비스 품질 수준
이다.
예:
주문 생성 API
SLI
실제 성공률
SLO
99.9% 이상
실제 결과가:
99.94%
라면 SLO를 만족하고 있는 것이다.
SLI, SLO와 함께 자주 나오는 것이 SLA다.
개념적으로는:
SLI
실제로 측정한 값
SLO
내부적으로 정한 목표
SLA
고객이나 파트너와 약속한 계약 수준
이라고 보면 된다.
현재 투게더몰 같은 내부 서비스 운영에서는 처음부터 SLA까지 만들 필요는 없다.
우선은
SLI
+
SLO
만 있어도 충분하다.
초기에는 흔히:
모든 API 99.99%
같은 기준을 만들고 싶어진다.
하지만 이것은 실무적으로 별 의미가 없다.
중요한 것은 비즈니스 핵심 흐름이다.
현재 프로젝트라면 우선 다음 정도가 중요하다.
고객 신청
주문 저장
관리자 주문 상태 변경
알림톡 발송
Webhook 처리
Export
배포
반대로:
관리자 FAQ 조회
배너 목록 조회
내부 통계 화면
같은 기능은 조금 느리거나 잠깐 실패하더라도 비즈니스 영향이 상대적으로 낮다.
기능 중요도를 나누면 SLO를 만들기 편하다.
예:
Tier 1
고객 신청
주문 생성
주문 상태 변경
Tier 2
알림톡
Webhook
상담 등록
Tier 3
Excel Export
통계
운영 리포트
Tier 4
AI 분석
자동 문서 작성
내부 편의 기능
중요한 기능일수록 더 엄격한 기준을 둘 수 있다.
가장 흔한 SLI 중 하나다.
Availability
=
성공 요청
/
전체 요청
예:
주문 생성
총 요청
10,000건
성공
9,990건
Availability
99.9%
단순 HTTP 200 여부만 보면 안 되는 경우도 있다.
예를 들어 API가 이렇게 응답한다고 하자.
{
"success": true
}
하지만 실제 DB에는 주문이 생성되지 않았다면 비즈니스 관점에서는 실패다.
따라서 SLI는 가능한 경우:
Technical Success
+
Business Success
를 구분해야 한다.
단순히:
POST /orders
HTTP 2xx 비율
만 보지 말고
유효한 신청 요청 중
실제로 Order Record 생성에 성공한 비율
처럼 정의하는 것이 더 낫다.
예:
SLI:
valid_order_requests_success_total
/
valid_order_requests_total
성공했다고 끝이 아니다.
너무 느리면 사실상 장애와 비슷하다.
예:
주문 API
성공률 100%
응답 시간 20초
라면 정상 서비스라고 보기 어렵다.
따라서 응답 속도도 SLI로 본다.
평균이:
300ms
라고 해도 실제로:
90명
100ms
10명
2초 이상
일 수 있다.
그래서 보통 Percentile을 본다.
예를 들어:
p50 = 180ms
p95 = 700ms
p99 = 2.5s
라는 의미는:
50% 요청은 180ms 이하
95% 요청은 700ms 이하
99% 요청은 2.5초 이하
다.
운영에서는 특히:
p95
p99
가 유용하다.
예:
주문 생성 API
99% 이상의 요청이
2초 이내 완료
이런 식으로 정의할 수 있다.
SLI
2초 이내 성공 요청 비율
SLO
99%
Worker 기반 자동화는 HTTP API와 같은 기준을 적용하기 어렵다.
예:
NotificationJob
은 요청 직후 바로 완료되지 않아도 된다.
대신 다음 같은 지표가 중요하다.
Queue Wait Time
Processing Time
End-to-End Completion Time
예:
주문 상태 변경 후
알림톡 Provider 요청까지 걸린 시간
을 측정한다.
SLO:
99%의 알림톡 Job이
주문 상태 변경 후 30초 이내 Provider에 전달
처럼 만들 수 있다.
예:
Excel Export
95%가 60초 이내 완료
99%가 3분 이내 완료
실시간 요청보다 기준이 느슨해도 된다.
핵심은 모든 기능에 같은 기준을 적용하지 않는 것이다.
Webhook은 외부 상태 동기화와 연결된다.
예:
Provider Webhook 수신 후
30초 이내 내부 상태 반영
99%
또는:
정상 Webhook 처리 성공률
99.9%
같은 기준을 만들 수 있다.
데이터 기반 서비스에서는 단순 성공 여부뿐 아니라
얼마나 최신 상태인가?
도 중요하다.
예:
배정 순번 페이지
가 DB상 정상 응답은 하지만 3시간 전 데이터를 보여주면 문제가 된다.
이런 경우:
Data Freshness
를 SLI로 볼 수 있다.
예:
배정 현황 데이터가
5분 이내 최신 상태를 유지하는 비율
일부 데이터만 처리되고 누락되는 문제도 있다.
예:
완료 주문 100건
완료 알림톡 Job 생성 96건
HTTP Error는 없을 수도 있다.
그러나 비즈니스상 4건이 누락됐다.
이 경우:
Completeness
=
실제 생성된 후속 작업 수
/
생성되어야 하는 작업 수
같은 SLI를 만들 수 있다.
성공했지만 결과가 틀릴 수도 있다.
예:
주문 상태 변경 성공
하지만 잘못된 상태값 저장
또는:
할인 금액 계산 API 성공
계산 결과 오류
Correctness는 측정하기 어려우나 중요한 영역에서는 고려해야 한다.
우선 다음 정도면 충분하다.
| 영역 | 추천 SLI |
|---|---|
| 고객 신청 | 성공률, p95 응답시간 |
| 주문 관리 | 성공률, p95 응답시간 |
| 알림톡 | 발송 성공률, 처리 지연 |
| Webhook | 처리 성공률, 반영 지연 |
| Export | 완료 성공률, 완료 시간 |
| Queue | Oldest Job Age |
| AI Run | 성공률, 평균 실행 시간 |
| 배포 | 성공률, Health Check 성공 여부 |
처음부터:
99.9999%
같은 목표를 잡는 것은 현실적이지 않다.
목표가 너무 높으면:
개발 속도 감소
불필요한 이중화
복잡도 증가
운영 비용 증가
가 발생한다.
특히 1인 개발 환경에서는 더 그렇다.
숫자로 보면 작은 차이 같지만 실제 허용 실패량은 크게 달라진다.
예를 들어 월간 기준으로 보면:
99%
약 1% 실패 허용
99.9%
약 0.1% 실패 허용
99.99%
약 0.01% 실패 허용
운영 난이도도 점점 올라간다.
SLO를 100%로 잡지 않는 이유와 연결된다.
예:
SLO = 99.9%
라면
0.1%
는 실패를 허용한다는 뜻이다.
이 허용 가능한 실패량이 Error Budget이다.
월간 주문 요청이:
100,000건
이고 SLO가:
99.9%
라면 허용 가능한 실패량은 대략:
100건
이다.
즉:
Error Budget
=
100건
이다.
목표를
절대 실패 0건
으로 잡으면 기능 개발이 지나치게 느려질 수 있다.
예:
새 기능 배포 못 함
모든 변경 승인 필요
테스트 비용 폭증
복잡한 Failover 필요
그래서 현실적으로는:
일정 수준의 실패를 허용하면서
개발 속도와 안정성 균형을 잡는다.
예를 들어 월 Error Budget의 10%만 사용했다면:
서비스 안정적
이라고 볼 수 있다.
이때는:
새 기능 배포
리팩터링
실험적인 자동화
를 조금 더 적극적으로 할 수 있다.
반대로 Budget을 거의 소진했다면:
신규 기능보다 안정화 우선
으로 바꿀 수 있다.
Error Budget이 얼마나 빨리 소모되고 있는지를 볼 수 있다.
예:
한 달 Error Budget
100건
오늘 하루에
60건 실패
라면 심각하다.
단순히
아직 40건 남음
이 아니라
소모 속도가 비정상적으로 빠르다
가 중요하다.
이를 Burn Rate라고 표현한다.
예를 들어 정상적으로 한 달 동안 천천히 소모해야 할 Budget을 하루 만에 대부분 써버린다면 Burn Rate가 높다.
개념적으로:
Burn Rate > 1
이면 Error Budget을 예상보다 빠르게 소비하고 있다고 이해하면 된다.
단순히:
에러 1건 발생
→ Alert
보다:
SLO를 심각하게 깨뜨릴 수준으로
Error Budget이 빠르게 소비되는가?
를 보는 것이 낫다.
이렇게 하면 작은 오류에 지나치게 반응하는 일을 줄일 수 있다.
현재 프로젝트에서는 우선 단순 기준으로 시작해도 된다.
예:
5분 동안 주문 API 실패율 > 5%
10분 동안 알림톡 실패율 > 10%
Oldest Job Age > 5분
UNKNOWN Job > 20건
운영 데이터가 쌓인 뒤 Burn Rate 기반으로 발전시키면 된다.
SLO를 계산할 기간도 중요하다.
예:
1시간
24시간
7일
30일
짧은 Window는 최근 장애에 민감하다.
긴 Window는 전체 품질을 보기 좋다.
예:
주문 성공률
최근 1시간
98.3%
최근 24시간
99.8%
최근 30일
99.94%
최근 1시간에 장애가 발생했다는 것을 빠르게 알 수 있다.
달력 기준:
9월 1일 ~ 9월 30일
대신
최근 30일
처럼 계속 움직이는 Window를 사용할 수 있다.
이렇게 하면 언제든 현재 서비스 품질을 보기 편하다.
기술적으로 API 하나하나 기준을 잡는 것보다:
사용자가 신청을 완료할 수 있는가?
같은 Journey 중심 SLO가 더 의미 있을 수 있다.
예:
상품 상세
→ 신청 모달
→ 신청 제출
→ 주문 생성
이 전체가 하나의 중요한 사용자 여정이다.
예를 들어:
유효한 신청 제출 중
최종 주문 저장까지 성공한 비율
을 볼 수 있다.
99.5%
같은 목표를 둔다.
중간 API 하나가 성공했는지는 사용자 입장에서는 중요하지 않다.
서버 입장에서는:
API 정상
DB 정상
CPU 정상
인데 고객은:
신청 버튼 눌러도 진행 안 됨
을 겪을 수 있다.
따라서:
System-Centric SLI
+
User-Centric SLI
둘 다 필요하다.
실제 사용자가 없어도 주기적으로 주요 흐름을 테스트하는 방법이 있다.
예:
5분마다
홈페이지 접속
상품 API 호출
신청 API Health Check
관리자 API 확인
실제 주문을 만들지는 않고 안전한 검사용 Endpoint를 사용할 수 있다.
단순:
GET /health
200 OK
만으로는 부족할 수 있다.
예:
Application Health
Database Health
Queue Health
External Provider Health
로 나눌 수 있다.
운영 환경에서는 이 둘을 구분하기도 한다.
프로세스가 살아 있는가?
실제 요청을 받을 준비가 되었는가?
예를 들어 서버 프로세스는 살아 있지만 DB 연결이 끊겼다면:
Liveness = OK
Readiness = FAIL
이 될 수 있다.
우리 서버가 정상이어도 외부 Provider가 장애일 수 있다.
예:
알림톡 Provider
SMS API
OIDC Provider
AWS 서비스
이 경우 내부 서비스 SLO에 외부 장애를 어떻게 반영할지 정해야 한다.
예:
우리 API 200
하지만 알림톡 Provider 장애로
실제 메시지 미발송
이면 고객 관점에서는 실패다.
따라서 내부 API 성공률과 별개로
End-to-End Notification SLI
를 보는 것이 좋다.
예:
notification_provider_available = 1
s3_available = 1
database_available = 1
같은 별도 지표를 두면 장애 원인을 빠르게 구분할 수 있다.
SLO를 잠깐 넘겼다고 무조건 긴급 장애는 아니다.
예:
Export 완료 p95
목표 60초
현재 68초
라면 운영 개선 대상일 수는 있지만 즉각적인 Critical Incident는 아닐 수 있다.
반대로:
주문 생성 완전 실패
는 짧게 발생해도 매우 중요하다.
예:
P0
주문 생성 전체 실패
P1
주문 생성 실패율 급증
P2
알림톡 지연
P3
Export 느림
SLO는 서비스 품질 기준이고,
Severity는 사건의 대응 우선순위다.
문제가 발생했을 때:
CPU 90%
라는 숫자보다
고객 신청 실패율 증가
가 더 중요할 수 있다.
항상:
Infrastructure Metric
↓
Application Metric
↓
Business Metric
↓
Customer Impact
순으로 연결해서 보는 것이 좋다.
장애가 발생할 때마다:
SLO가 너무 높네
→ 낮추자
하면 기준의 의미가 없어진다.
SLO는 실제 사용자 기대와 비즈니스 영향에 맞춰 정하고 일정 기간 유지해야 한다.
서비스 규모가 바뀌면 기준도 바뀔 수 있다.
예:
초기
주문 100건/일
에서
성장 후
10,000건/일
이 되면 더 엄격한 품질 기준이나 별도 시스템이 필요할 수 있다.
예:
관리자 Excel Export
99.9%
까지 요구할 필요는 없을 수 있다.
오히려:
95%가 2분 이내 완료
실패 시 재실행 가능
정도로 운영할 수 있다.
왜냐하면 실패하더라도 즉시 재처리할 수 있기 때문이다.
무조건 실패하지 않는 시스템보다:
실패하더라도 빠르게 복구 가능한 시스템
이 더 현실적일 수 있다.
따라서 다음도 운영 지표가 될 수 있다.
MTTR
Auto Recovery Rate
Reconciliation Success Rate
0917 내용과 연결하면:
UNKNOWN 상태가 된 Job 중
95%가 5분 이내
SUCCESS / RETRY / MANUAL_REQUIRED
중 하나로 정리
같은 SLO도 만들 수 있다.
즉 시스템이 애매한 상태를 얼마나 빨리 해소하는지도 품질이다.
예:
P1 Incident
평균 30분 이내 복구
또는:
Stale Worker Job
10분 이내 자동 복구
같은 기준을 만들 수 있다.
현재 자동화 구조라면:
NotificationJob
성공률
99.5%
p95 처리 시간
30초 이하
UNKNOWN
0.1% 이하
DLQ
0.05% 이하
처럼 볼 수 있다.
처음부터 정확한 수치를 확정하기보다는 운영 데이터 수집 후 조정한다.
AI 자동화는 확률적인 특성이 있다.
예:
AI Report 생성 성공률
을 무조건 99.9%로 만들 필요는 없다.
특히 내부 생산성 자동화라면:
90~95% 성공
+
실패 시 사람이 재실행
정도도 충분할 수 있다.
예:
Run Success Rate
Tool Failure Rate
Test Pass Rate
Manual Approval Rate
Retry Rate
Average Run Duration
Token Usage
Resume Success Rate
단순 실행 성공과 실제 결과 품질은 다르다.
예:
AI Run SUCCESS
여도 코드가 별로일 수 있다.
따라서:
Test 통과
Lint 통과
Build 통과
Human Review 승인
Rollback 여부
같은 Proxy Metric을 활용한다.
예:
AI 코드 변경 Run 중
95% 이상 Build 성공
90% 이상 Test 통과
Production 직접 배포 0%
고위험 작업 승인 없는 실행 0건
이런 식으로 안전성과 품질을 함께 본다.
AI 자동화에서는:
실패를 얼마나 적게 하느냐
뿐 아니라
위험한 행동을 얼마나 막느냐
도 중요하다.
예:
승인 없이 Production 수정
0건
Secret 로그 노출
0건
Forbidden Tool 실행
0건
이런 항목은 100% 목표를 가져도 된다.
예:
DLQ Job
15분 이내 운영자에게 노출
Critical Alert
5분 이내 감지
Production Deploy
배포 후 2분 이내 Health Verification
처럼 시간 기반 목표도 SLO다.
운영 화면에서는 다음 정도를 보여줄 수 있다.
주문 생성
SLO
99.9%
최근 30일
99.94%
상태
정상
알림톡 처리
SLO
99.5%
최근 30일
99.1%
상태
주의
이런 식이다.
예:
주문 API Error Budget
Monthly Budget
100
Used
27
Remaining
73%
Status
Healthy
이렇게 보여주면 안정성 상태를 한눈에 볼 수 있다.
배포 정책에도 활용할 수 있다.
예:
Error Budget Remaining > 50%
일반 배포 가능
Remaining < 20%
위험한 변경 자제
안정화 우선
Budget Exhausted
긴급 수정 외 신규 기능 배포 중단
이런 정책을 둘 수 있다.
현재 프로젝트에서 자동 차단까지 할 필요는 없고 판단 기준으로만 사용해도 된다.
AI가 배포를 제안할 때 다음을 확인하게 할 수 있다.
현재 Error Budget
최근 Error Rate
Critical Incident 존재 여부
최근 배포 실패 여부
그리고:
현재 서비스가 불안정하므로
배포 승인 필요
같은 판단 자료를 제공하도록 할 수 있다.
예:
SLO 미달
→ 무조건 배포 금지
는 지나치게 단순하다.
왜냐하면 해당 배포가 바로 장애 수정일 수도 있기 때문이다.
따라서:
SLO
+
변경 목적
+
위험도
+
Rollback 가능성
을 같이 본다.
규모가 커지면:
service: order-api
slos:
availability:
target: 99.9
window: 30d
latency:
percentile: 95
threshold: 1000ms
처럼 설정으로 관리할 수도 있다.
현재는 문서나 관리자 설정만으로 충분하다.
예:
Notification Failure Rate
정상
< 1%
Warning
1~5%
Critical
> 5%
그리고 Runbook:
Warning
1. Provider 상태 확인
2. Retry 증가 여부 확인
3. Queue Lag 확인
Critical
1. 신규 Retry 제한 검토
2. Provider 장애 여부 확인
3. 대체 발송 경로 검토
4. Incident 생성
Alert를 제각각 만들지 말고:
우리의 품질 목표는 무엇인가?
를 먼저 정한다.
그리고:
SLO를 깨뜨릴 가능성이 높은 신호
에 Alert를 만든다.
그래야 의미 없는 알림이 줄어든다.
아직 기준 데이터가 없다면:
주문 API p95 1초
가 적절한지 판단하기 어렵다.
처음 2~4주 정도:
현재 실제 성공률
p95 / p99
Retry Rate
Queue Lag
Webhook 처리 시간
을 수집한다.
그 후 현실적인 기준을 만든다.
예:
현재 주문 성공률
99.4%
인데 바로
99.99%
를 목표로 잡기보다는:
초기 SLO
99.5%
이후
99.7%
장기
99.9%
처럼 발전시키는 것도 현실적이다.
다음은 단계적으로 개선하는 영역이 아니다.
Secret 노출
고객 개인정보 외부 로그 기록
중복 결제
승인 없는 Production 데이터 삭제
이런 문제는:
허용 Error Budget = 0
으로 보는 것이 맞다.
현재 구조에서 시작한다면 예를 들어 다음 정도로 볼 수 있다.
Success Rate
99.5% 이상
p95
2초 이하
Success Rate
99.9%
p95
1초 이하
Job 성공률
99%
p95 Queue-to-Provider
30초 이하
처리 성공률
99%
p95 내부 반영
30초 이하
성공률
98%
p95
2분 이하
이는 확정 기준이라기보다 측정을 시작하기 위한 초기값으로 두는 편이 낫다.
예를 들어:
알림톡 성공률 99%
이라고 해놓고
Queue 생성 성공
을 성공으로 칠 것인지,
Provider 접수 성공
을 성공으로 칠 것인지,
최종 고객 전달 성공
을 성공으로 칠 것인지에 따라 완전히 다른 지표가 된다.
따라서 SLI Definition이 매우 중요하다.
SLI Name
Notification Provider Submission Success
Description
NotificationJob이 Provider API에 정상 접수된 비율
Numerator
Provider API 성공 응답 수
Denominator
전체 유효한 NotificationJob 처리 시도 수
Exclusion
사용자 전화번호 Validation 실패
Window
Rolling 30 days
이 정도만 문서화해도 나중에 혼란이 많이 줄어든다.
사용자가 잘못된 데이터를 입력해서 실패한 요청까지 시스템 장애로 포함하면 SLO가 왜곡될 수 있다.
예:
Validation Error
는 Availability SLI에서 제외할 수 있다.
반대로:
DB Error
Timeout
Internal Exception
은 포함한다.
고객 관점 SLI에서는 외부 장애도 실제 실패다.
따라서 두 가지를 나눌 수 있다.
Internal Reliability
End-to-End Reliability
내부 원인 분석과 고객 체감 품질을 동시에 볼 수 있다.
굳이 DB 모델을 만들어야 하는 것은 아니지만 개념적으로는:
interface SloSnapshot {
service: string;
sli: string;
target: number;
actual: number;
budgetTotal: number;
budgetUsed: number;
windowStart: Date;
windowEnd: Date;
}
형태로 볼 수 있다.
이런 지표는 보통 로그/Metric 시스템에서 집계한다.
즉:
Request
→ Metric 증가
Dashboard
→ 집계
형태가 낫다.
애플리케이션 DB에 모든 Metric을 직접 저장하면 부담이 커질 수 있다.
예:
신청 완료율
주문 누락률
상담 응답 누락
상품 가격 데이터 최신성
다만 이것은 기술 SLO와 마케팅 KPI를 명확히 구분해야 한다.
예:
신청 전환율
이 낮다고 서버 장애는 아니다.
예:
신청 API 성공률
→ Reliability
신청 전환율
→ Business KPI
둘을 섞으면 원인 판단이 어려워진다.
나중에는:
주문 API SLO 위반
이 감지되면 자동으로:
Incident 생성
Correlation Sample 수집
최근 Deploy 연결
Error Code Top N 수집
Runbook 연결
까지 만들 수 있다.
이게 운영 자동화의 다음 단계다.
예:
14:03
Release abc123
14:10
주문 Error Rate 상승
이 정보를 같이 보여주면:
최근 변경으로 인해 발생했을 가능성
을 빠르게 확인할 수 있다.
단 자동으로 원인이라고 단정하지는 않는다.
Observability Dashboard에:
Deploy
v2026.09.22.2
시점을 표시해두면 좋다.
그러면 그래프상:
Error Rate 상승
Latency 상승
과 배포 시점을 쉽게 비교할 수 있다.
Read-Only Agent에게 다음처럼 맡길 수 있다.
최근 24시간 SLO 위반 요약
Error Budget 소비 원인 분석
가장 많이 발생한 Error Code
최근 Deploy와 지표 변화 비교
개선 우선순위 제안
운영자가 직접 여러 Dashboard를 뒤지는 시간을 줄일 수 있다.
전체 로그를 던지기보다는:
{
"service": "notification",
"slo": 99.5,
"actual": 98.8,
"errorBudgetRemaining": 12,
"topErrors": [
"PROVIDER_TIMEOUT",
"RATE_LIMIT"
]
}
같은 구조화된 데이터를 제공하는 것이 낫다.
예:
현재 Notification SLO가 미달입니다.
주요 실패 원인:
1. PROVIDER_TIMEOUT
2. RATE_LIMIT
최근 Retry 횟수가 평소 대비 4배 증가했습니다.
권장 확인:
- Provider 상태
- Queue Lag
- Rate Limit 설정
여기까지는 안전하다.
분석과 실행은 분리한다.
Observe
→ AI Analyse
→ Recommendation
→ Policy
→ Approval
→ Action
0915에서 다룬 Permission 구조와 연결된다.
하루 한 번 다음 정도를 보면 된다.
주문 API
Success
99.98%
p95
420ms
Notification
Success
99.4%
Retry
18
UNKNOWN
2
Queue
Pending
3
Oldest
12s
Webhook
Success
100%
DLQ
0
지나치게 많은 숫자를 보는 것보다 중요 지표를 고정하는 편이 낫다.
예:
이번 주 SLO
주문
정상
알림톡
1회 미달
Webhook
정상
Error Budget
주문
82% 남음
알림톡
31% 남음
Top Issues
Provider Timeout
Slow Query
Action
Notification Retry 정책 조정
DB Index 추가
이런 식으로 정리하면 작업 성과 문서로도 활용하기 좋다.
현재 일일 보고서 자동화에:
Git Commit
작업 요약
Troubleshooting
뿐만 아니라:
Daily Reliability Summary
Error Count
Retry Count
SLO Status
Incident
를 추가할 수 있다.
예:
### 운영 상태
- 주문 API SLO: 정상
- 알림톡 성공률: 99.7%
- Retry: 4건
- DLQ: 0건
- Incident: 없음
단순히:
NestJS API 개발
보다
운영 지표를 정의하고
Queue/Worker/Error Budget 기반으로
서비스 신뢰성을 관리했다
는 훨씬 실제 운영 경험에 가까운 이야기다.
특히 1인 개발자로 운영까지 맡고 있다면 좋은 차별점이 될 수 있다.
예:
SRE 체계를 구축했다
보다 실제로:
핵심 주문/알림 기능에 대해
성공률·처리시간·Retry·Queue Lag을 측정하고
내부 운영 기준을 정의했다
라고 쓰는 편이 더 정확하다.
개념적으로:
metrics.increment(
'order_create_total',
);
metrics.increment(
'order_create_success_total',
);
metrics.observe(
'order_create_duration_ms',
duration,
);
이런 식으로 애플리케이션 이벤트를 측정한다.
metrics.increment(
'notification_job_total',
);
if (success) {
metrics.increment(
'notification_job_success_total',
);
}
metrics.observe(
'notification_queue_delay_ms',
queueDelay,
);
예:
order_requests_total
order_requests_failed_total
order_request_duration_ms
notification_jobs_total
notification_jobs_failed_total
notification_queue_delay_ms
automation_unknown_jobs
automation_dlq_jobs
형식이 일정해야 검색과 Dashboard 구성이 편하다.
Metric에:
orderId
userId
phone
같은 값을 Label로 넣으면 안 된다.
값 종류가 너무 많아져 Metric 시스템에 부담이 생긴다.
이를 High Cardinality 문제라고 한다.
예:
environment
service
provider
result
errorCode
처럼 종류가 제한된 값이 좋다.
Metric:
알림톡 실패가 32건 발생했다
를 빠르게 본다.
Log:
그중 job_392가 왜 실패했는가?
를 확인한다.
Trace:
그 Job이 어떤 주문 요청에서 시작됐는가?
를 확인한다.
서로 대체 관계가 아니다.
0921과 0922를 연결하면:
Logs / Metrics / Traces
↓
SLI 측정
↓
SLO 비교
↓
Error Budget 계산
↓
Alert
↓
Incident / Reconciliation
↓
Recovery
형태가 된다.
핵심 Workflow 3개 선정
주문
알림톡
Webhook
각각:
Success Rate
Latency
Queue Delay
중 필요한 SLI 정의
2~4주 실제 데이터 수집
초기 SLO 정의
Dashboard / Warning Threshold 구성
Error Budget과 Deploy 판단 연결
이 순서가 현실적이다.
현재 투게더몰이라면 일단:
주문 생성 성공률
주문 API p95
알림톡 성공률
알림톡 Queue Delay
Webhook 성공률
UNKNOWN Job
DLQ
이 7개 정도부터 측정하면 된다.
나머지는 필요할 때 늘린다.
현재 NestJS + Prisma 기반 프로젝트의
운영 신뢰성을 측정하기 위한
기본 SLI / SLO Metric 구조를 추가해줘.
현재는 1인 개발 환경이므로
복잡한 SRE 플랫폼을 만들지 말고,
핵심 Workflow의 성공률과 처리 시간을
측정할 수 있는 최소 구조를 목표로 한다.
대상 Workflow는 우선:
1. 주문 생성
2. 알림톡 NotificationJob
3. Webhook 처리
요구사항:
1. 공통 MetricsService 인터페이스를 만든다.
최소 지원 기능:
- increment counter
- set gauge
- observe duration
2. 주문 생성에 다음 Metric을 추가한다.
- order_requests_total
- order_requests_success_total
- order_requests_failed_total
- order_request_duration_ms
3. NotificationJob에 다음 Metric을 추가한다.
- notification_jobs_total
- notification_jobs_success_total
- notification_jobs_failed_total
- notification_retry_total
- notification_queue_delay_ms
- notification_processing_duration_ms
4. Webhook에 다음 Metric을 추가한다.
- webhook_received_total
- webhook_processed_total
- webhook_failed_total
- webhook_processing_duration_ms
5. Automation 공통 Gauge 또는 조회 Metric을 지원한다.
- UNKNOWN Job 수
- DEAD_LETTER Job 수
- Pending Job 수
- Oldest Job Age
6. Metric Label은 제한적으로 사용한다.
사용 가능 예:
- environment
- provider
- result
- errorCode
다음 값은 Label로 사용하지 않는다.
- orderId
- userId
- phone
- email
- jobId
7. 각 Workflow의 시작/성공/실패 시점에서
Metric이 정확하게 기록되도록 한다.
8. Duration 측정은 공통 helper를 만들어
중복 코드를 줄인다.
9. 기존 Structured Logging과
Correlation ID 구조는 유지한다.
10. Metric과 Log의 책임을 분리한다.
개별 실패 상세 정보는 Log,
전체 성공률과 지연은 Metric으로 처리한다.
11. 초기 SLI를 계산할 수 있도록 한다.
예:
- 주문 성공률
- 알림톡 성공률
- Webhook 성공률
- p95 처리시간
12. SLO 값 자체를 비즈니스 로직에
하드코딩하지 않는다.
별도 config 또는 운영 설정으로 관리할 수 있게 한다.
13. 초기 SLO 예시는 다음처럼 둘 수 있다.
order:
availability: 99.5
p95LatencyMs: 2000
notification:
successRate: 99.0
p95QueueDelayMs: 30000
webhook:
successRate: 99.0
p95ProcessingMs: 30000
단 실제 운영 데이터 수집 후
쉽게 변경 가능하도록 한다.
14. 개인정보나 Secret은
Metric과 Log에 포함하지 않는다.
15. 테스트를 작성한다.
- 성공 Counter 증가
- 실패 Counter 증가
- Duration 기록
- Retry Counter 기록
- 개인정보 Label 미사용
0921에서 만든 Observability 구조가
무슨 일이 발생했는지
를 보여준다면,
0922의 SLI와 SLO는
그 상태가 정상인지 아닌지
를 판단할 기준을 만든다.
핵심 관계는 다음과 같다.
SLI
실제 측정값
SLO
목표 수준
Error Budget
허용 가능한 실패량
예를 들어:
주문 성공률
SLI
99.94%
SLO
99.9%
결과
목표 만족
이런 형태다.
중요한 것은 모든 서비스에:
99.99%
를 강요하는 것이 아니다.
각 기능의 비즈니스 중요도에 따라:
주문
엄격하게
알림톡
중간
Export
상대적으로 느슨하게
내부 AI 자동화
실패 후 복구 가능하게
기준을 다르게 잡아야 한다.
또한 Error Budget은 단순히 실패를 허용한다는 개념이 아니라
안정성
vs
개발 속도
사이의 균형을 잡기 위한 도구다.
서비스가 안정적이고 Budget이 충분하다면 새로운 기능이나 자동화를 적극적으로 시도할 수 있고,
반대로 Budget을 빠르게 소진하고 있다면:
신규 기능보다
안정화
Retry 개선
Slow Query 수정
Provider 장애 대응
을 우선한다.
현재 프로젝트에서는 처음부터 거대한 SRE 시스템을 만들 필요가 없다.
우선:
주문 성공률
주문 p95
알림톡 성공률
Queue Delay
Webhook 성공률
UNKNOWN
DLQ
정도만 측정하고 실제 운영 데이터를 쌓는 것이 좋다.
전체 흐름을 연결하면:
Observe
↓
Measure
↓
SLI
↓
Compare with SLO
↓
Error Budget
↓
Alert
↓
Diagnose
↓
Reconcile
↓
Recover
가 된다.
결국 SLO의 목적은 숫자 자체가 아니라,
“지금 우리 서비스가 어느 정도까지 정상이고, 언제 개발을 멈추고 안정화에 집중해야 하는지 판단할 수 있는 공통 기준을 만드는 것”
이다.