Observability System - TraceId, Loki, Grafana Alert
핵심 질문: 장애가 발생했을 때 “어느 요청, 어느 도메인, 어느 이벤트에서 실패했는지”를 빠르게 찾을 수 있는가?
원문: 관측 체계 도입.md
시리즈: Reliability & Operations
1. Observability System
2. SLO 기반 운영 사양 산정
3. Realtime Degraded Mode
4. Auto Recovery & Scale-out
5. Load Test Orchestrator
Summary
| 항목 | 내용 |
|---|---|
| Problem | 일반 문자열 로그만으로는 장애 원인, 요청 흐름, 도메인별 실패 지점을 빠르게 추적하기 어려움 |
| Solution | TraceIdFilter, MDC, AOP 기반 구조화 로그와 Loki/Grafana 관측 체계 구성 |
| Stack | Spring Boot, Prometheus, Grafana, Loki, Promtail |
| Result | error count/rate dashboard와 alert 기반 운영 관측 체계 구성 |
문제
기능이 정상 동작하는 것만으로는 운영 안정성을 설명할 수 없다.
실제 운영에서는 다음 질문에 답할 수 있어야 한다.
- 특정 요청이 어느 API와 도메인을 거쳐 실패했는가?
- Redis, Kafka, DB 중 어떤 경로에서 지연 또는 오류가 발생했는가?
- 장애가 재현될 때 같은 traceId로 로그를 따라갈 수 있는가?
- 에러율이 임계치를 넘었을 때 알림을 받을 수 있는가?
이를 위해 로그를 단순 문자열이 아니라 검색과 집계가 가능한 필드 구조로 남기도록 설계했다.
설계
구조화 로그에는 다음 필드를 포함했다.
| 필드 | 목적 |
|---|---|
traceId |
하나의 요청 흐름 추적 |
domain |
장애가 발생한 업무 도메인 구분 |
instance |
어느 서버에서 발생했는지 구분 |
event |
관측 이벤트 이름 |
level |
INFO, WARN, ERROR 등 심각도 |
errorCode |
장애 유형 필터링 |
elapsedMs |
요청 또는 작업 소요 시간 |
uri |
HTTP 요청 경로 |
구현 방향은 다음과 같다.
HTTP Request
-> TraceIdFilter
-> MDC에 traceId 저장
-> ObservedLogAspect
-> JSON/structured log
-> Promtail
-> Loki
-> Grafana dashboard / alert
ELK 대신 Loki를 선택한 이유
운영 PoC에서는 ELK와 Loki를 비교했고, 현재 단계에서는 Loki를 선택했다.
| 비교 항목 | ELK | Loki |
|---|---|---|
| 설치/운영 복잡도 | 높음 | 낮음 |
| 리소스 사용량 | 상대적으로 큼 | 상대적으로 작음 |
| Grafana 연동 | 가능 | 자연스러움 |
| 현재 목표 | 전문 검색/분석에 강함 | 로그-메트릭-알림 연결에 적합 |
목표가 대규모 검색 엔진 구축이 아니라 장애 원인 추적과 운영 알림이었기 때문에 Loki + Promtail + Grafana 조합을 선택했다.
결과
Grafana에서 다음 지표와 로그를 함께 볼 수 있게 구성했다.
- 인스턴스별 로그 수집 상태
- 도메인별 ERROR count
- error rate 기반 alert
- 요청별 traceId 검색
- API latency와 로그 이벤트 연결
- Prometheus resource metric과 로그 이벤트 비교
이 구조를 통해 장애 대응 문서에서 단순히 “장애가 발생했다”가 아니라, 어떤 이벤트와 지표가 함께 변했는지를 근거로 설명할 수 있게 되었다.
포트폴리오 관점의 의미
이 문서는 단순 모니터링 도구 설치 기록이 아니다.
백엔드 시스템을 운영 환경에 가깝게 검증하려면 다음이 필요하다는 것을 보여준다.
- 장애를 재현할 수 있는 부하/시나리오
- 장애를 설명할 수 있는 로그 구조
- 장애를 감지할 수 있는 metric과 alert
- 복구 전후 상태를 비교할 수 있는 dashboard
즉, 기능 구현 이후의 단계인 운영 가능한 백엔드 시스템 만들기를 다룬 문서다.