Infra

[Grafana] 무트래픽 구간 spanNulls 보간 제거 rate 0 채움

jykim23 2026. 6. 25. 20:23
반응형

그라파나

개인 프로젝트라 트래픽이 거의 없다. 채팅 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으로 한다

저트래픽이라 그래프가 비어 보이는 날이 많지만, 빈 구간을 그대로 두는 편이 대시보드를 읽을 때 덜 헷갈렸다.

반응형