
개인 프로젝트라 트래픽이 거의 없다. 채팅 API가 하루 20건도 안 들어온다. 이런 환경에서 모니터링 대시보드를 만들다 보면 한 가지 문제에 부딪힌다.
요청이 없는 구간에서 그래프가 어떻게 보여야 하나?
문제
Grafana에서 rate() 패널을 그리면, 호출이 없는 구간은 데이터가 없어서 선이 끊긴다. 끊긴 게 보기 싫어서 spanNulls(점 사이 잇기)를 켜면 끊긴 점들이 비스듬한 직선으로 이어진다.
그런데 이 선은 실제와 다르다. 요청이 0건이던 구간이 트래픽이 조금씩 흐른 것처럼 보이게 된다. 측정값이 없던 구간을 그래프가 채워 넣는 셈이다.
끊긴 그래프가 답인가
꼭 그렇지도 않다. 메트릭 종류마다 "데이터 없음"의 의미가 다르기 때문이다.
- rate (req/s): 호출이 없으면 값은 0이다. 0으로 채우는 게 실제에 가깝다.
- count/increase (에러 수 같은): 발생 전엔 시리즈 자체가 없다. 이것도 0이 실제값.
- gauge (커넥션 풀, fd 수): 계속 긁어오니 어차피 연속이다.
- 분포 (p95 지연): 요청이 0건이면 p95는 0이 아니라 정의되지 않는다(NaN).
마지막 항목이 헷갈리는 지점이다. 요청이 한 건도 없으면 "95퍼센타일 지연"이라는 값 자체가 존재하지 않는다. 이걸 0으로 깔거나 보간으로 이으면, 측정하지 않은 값을 표시하게 된다.
정리한 방식
종류별로 표현을 나눴다.
rate / count 는 0으로 채운다. PromQL에서 or vector(0)을 붙이면 시리즈가 없을 때 0 선이 그려진다.
# 무호출 구간을 0으로 채워 연속
sum(rate(nginx_http_requests_total[1m])) or vector(0)
p95 같은 분포는 gap을 그대로 둔다. 대신 패널 설명에 한 줄 적어 둔다. "공백 = 요청 0건, 고장 아님." 값이 없는 구간은 비워 두는 편이 덜 헷갈린다.
진짜 장애는 어떻게 아나
트래픽 그래프가 끊겼다고 해서 장애인 건 아니다. 데이터 수집이 실제로 멈춘 건 따로 잡는다.
- up: Prometheus가 타깃을 못 긁으면 0
- dead-man 신호: 일정 주기로 갱신돼야 할 파일의 신선도
RED(요청율·에러·지연) 그래프의 공백을 0으로 메워도 이 신호들이 따로 있으니, 대시보드의 빈 구간을 그대로 둬도 장애 자체는 놓치지 않는다.
정리
- 보간(spanNulls)으로 없는 구간을 메우지 않는다
- rate/count는 0 채움(or vector(0)), 분포는 gap 유지
- "데이터 없음"이 0인지 정의되지 않는지부터 구분한다
- 장애 탐지는 그래프 공백이 아니라 up·dead-man으로 한다
저트래픽이라 그래프가 비어 보이는 날이 많지만, 빈 구간을 그대로 두는 편이 대시보드를 읽을 때 덜 헷갈렸다.
'Infra' 카테고리의 다른 글
| [nginx] OpenResty 채택 이유 유효 API 키 rate-limit 면제 (0) | 2026.06.25 |
|---|---|
| [Docker] bind-mount 설정 미반영 원인 force-recreate (0) | 2026.06.25 |
| [Langfuse] Self-Hosted v3: ClickHouse 서버 리소스 최적화 (0) | 2026.02.09 |
| [Proxmox] 랜섬웨어 방어 및 재해 복구(DR) 전략 (0) | 2025.11.29 |
| [Proxmox] ZFS RAID 복구 시나리오 (0) | 2025.11.29 |