🔍 PLG 스택 트러블슈팅 로그 - “Empty Results” 디버깅 여정
📑 목차
1. 상황 요약
| 항목 | 내용 |
|---|---|
| 증상 | Grafana에서 {namespace="timedeal"} 쿼리 → “Empty results” |
| 예상 원인 | Loki 설정 문제? Promtail 수집 실패? |
| 실제 원인 | 18시간 동안 API 호출이 없어서 새 로그가 없었음 🤦 |
2. 디버깅 과정
💡 Step 1. Loki에 timedeal 라벨이 있는지 확인
kubectl run curl-check -n monitoring --rm -i --restart=Never \
--image=curlimages/curl -- \
curl -s 'http://loki:3100/loki/api/v1/label/namespace/values'{"status":"success","data":["kube-system","monitoring","timedeal"]}결과
timedeal 라벨 존재 → Loki는 정상
💡 Step 2. Loki에서 실제 데이터 조회
kubectl run curl-loki2 -n monitoring --rm -i --restart=Never \
--image=curlimages/curl -- \
curl -s 'http://loki:3100/loki/api/v1/query_range?query=%7Bnamespace%3D%22timedeal%22%7D&limit=5&start=...'{"status":"success","data":{"resultType":"streams","result":[],...}}결과
"result":[]→ 해당 시간 범위에 데이터 없음
💡 Step 3. Promtail이 timedeal 로그를 수집하는지 확인
kubectl logs -n monitoring -l app.kubernetes.io/name=promtail --tail=50 | grep -E "(timedeal|target)"결과
timedeal 관련 로그 없음 → Promtail이 수집 안 하나?
💡 Step 4. 각 노드의 Promtail에서 timedeal 로그 디렉토리 확인
for pod in $(kubectl get pods -n monitoring -l app.kubernetes.io/name=promtail -o jsonpath='{.items[*].metadata.name}'); do
echo "=== $pod ==="
kubectl exec -n monitoring $pod -- ls -la /var/log/pods/ 2>/dev/null | grep timedeal
done=== promtail-92pzr ===
drwxr-xr-x ... timedeal_postgres-0_...
=== promtail-c5bgf ===
drwxr-xr-x ... timedeal_stock-service-76d9479b49-p5brn_...
=== promtail-zv2kf ===
(없음)
결과
stock-service 로그가 promtail-c5bgf 노드에 있음
💡 Step 5. stock-service가 어느 노드에 있는지 확인
kubectl get pods -n timedeal -o wideNAME NODE
postgres-0 k3d-timedeal-server-0
stock-service-76d9479b49-p5brn k3d-timedeal-agent-1
결과
stock-service는 agent-1 노드 → promtail-c5bgf가 담당
💡 Step 6. 실제 로그 파일 내용 확인
kubectl exec -n monitoring promtail-c5bgf -- sh -c 'tail -5 /var/log/pods/timedeal_stock-service-76d9479b49-p5brn_.../stock/*.log'2026-02-14T10:06:04... [Cancel] product=1 qty=1 released, reserved=0
2026-02-14T10:06:05... [Reserve] product=1 qty=1 reserved=1/2
...
2026-02-14T10:06:12... [Cancel] product=1 qty=1 released, reserved=0
발견
로그가 **18시간 전(10:06)**에 멈춰있음!
💡 Step 7. 새 로그 발생시키기
curl -s localhost:8080/api/stock/get -d '{"product_id":1}'
curl -s localhost:8080/api/stock/reserve -d '{"product_id":1,"quantity":1}'# 새 로그 확인
kubectl exec -n monitoring promtail-c5bgf -- sh -c 'tail -3 /var/log/pods/timedeal_.../stock/*.log'2026-02-15T04:35:xx... [Reserve] product=1 qty=1 ...
결과
새 로그 발생!
💡 Step 8. Grafana에서 확인
- Explore → Loki
- 시간 범위: Last 5 minutes
- 쿼리:
{namespace="timedeal"}
결과
성공! 로그 보임!
3. 원인 분석
┌─────────────────────────────────────────────────────────┐
│ 문제 상황 │
├─────────────────────────────────────────────────────────┤
│ │
│ stock-service 마지막 로그: 10:06 (18시간 전) │
│ ↓ │
│ Grafana 조회 범위: Last 1 hour (최근 1시간) │
│ ↓ │
│ 결과: Empty! (당연함) │
│ │
├─────────────────────────────────────────────────────────┤
│ 실제 상태 │
├─────────────────────────────────────────────────────────┤
│ Promtail: ✅ 정상 (수집 대기 중) │
│ Loki: ✅ 정상 (저장 대기 중) │
│ Grafana: ✅ 정상 (조회 대기 중) │
│ stock-service: 😴 18시간째 API 호출 없음... │
│ │
│ → 모니터링 시스템은 정상, 모니터링할 이벤트가 없었음! │
└─────────────────────────────────────────────────────────┘
4. 교훈
📋 “Empty results” 나오면 먼저 확인할 것
1순위: 시간 범위 넓히기 (Last 24h)
2순위: 실제로 이벤트가 있었는지 확인
3순위: 그 다음에 시스템 의심
📋 모니터링 테스트할 때는 부하 발생 필수
# 부하 발생시키면서 Grafana 보기
hey -z 30s -c 10 -m POST \
-H "Content-Type: application/json" \
-d '{"product_id":1}' \
http://localhost:8080/api/stock/get📋 실무에서도 흔한 실수
"로그 수집이 안 돼요!"
→ "서비스에 트래픽 들어가고 있어?"
→ "아... 없네요..."
→ "ㅋㅋ"
5. 유용한 디버깅 명령어 모음
# 1. Loki 라벨 확인
kubectl run curl-check -n monitoring --rm -i --restart=Never \
--image=curlimages/curl -- \
curl -s 'http://loki:3100/loki/api/v1/label/namespace/values'
# 2. 각 Promtail에서 특정 네임스페이스 로그 디렉토리 확인
for pod in $(kubectl get pods -n monitoring -l app.kubernetes.io/name=promtail -o jsonpath='{.items[*].metadata.name}'); do
echo "=== $pod ==="
kubectl exec -n monitoring $pod -- ls -la /var/log/pods/ 2>/dev/null | grep timedeal
done
# 3. 로그 파일 직접 확인
kubectl exec -n monitoring <promtail-pod> -- sh -c 'tail -10 /var/log/pods/<경로>/stock/*.log'
# 4. 새 로그 발생시키기
curl -s localhost:8080/api/stock/get -d '{"product_id":1}'✅ 최종 상태
| 컴포넌트 | 상태 | 비고 |
|---|---|---|
| Prometheus | ✅ 정상 | 메트릭 수집 중 |
| Loki | ✅ 정상 | 로그 저장 중 |
| Promtail | ✅ 정상 | 로그 수집 중 |
| Grafana | ✅ 정상 | 시각화 정상 |
| 사용자 | 🧠 학습 완료 | ”이벤트 없으면 로그도 없다” |
한 줄 요약
“모니터링 시스템 탓하기 전에, 모니터링할 게 있는지부터 확인하자”