PromQL rate() vs increase() vs irate(), 언제 뭘 써야 할까

세 함수, 한 줄 요약
Prometheus 쓰다 보면 반드시 한 번은 헷갈리는 게 rate, increase, irate 세 함수다. 이거 모르는 분 꽤 많더라. 알림 튜닝하다가 값이 이상해서 파본 적이 있는데, 이번 기회에 정리해둔다.
rate(x[5m]): 지정한 구간(5분) 동안의 초당 평균 증가율. 부드럽게 완만해진다.increase(x[5m]): 지정한 구간 동안의 총 증가량. 그냥 얼마 늘었냐.irate(x[5m]): 구간 내 마지막 두 샘플만 보고 계산한 순간 증가율. 뾰족하게 튄다.
사실 내부적으로는 increase(x[5m])는 rate(x[5m]) * 300 이랑 같다. rate가 좀 더 근본이다.
실무에서 언제 뭘 쓰나
알림(Alerting)에는 무조건 rate. irate로 알림 걸면 순간 스파이크에 계속 튀어서 페이저가 울려댄다. 우리 팀도 예전에 irate(http_requests_total[1m]) > 100 이런 룰을 걸었다가 30분 만에 20건 페이지를 맞은 적이 있다. rate로 바꾸고 창을 5분으로 넓혔더니 조용해졌다.
# 알림에 적합
rate(http_requests_total{status=~"5.."}[5m]) > 10
# 알림에 부적합 (너무 예민)
irate(http_requests_total{status=~"5.."}[1m]) > 10
대시보드도 대부분 rate. 다만 초 단위로 뭔가 튀는 걸 봐야 하는 특수 상황(예: GC pause 직후 커넥션 폭증 관찰)이면 irate가 낫다. 근데 그런 경우는 흔치 않다.
increase는 표시용. "지난 24시간 동안 5xx가 몇 번 났나" 같은 총량 카드에 쓴다. 알림에는 절대 쓰지 마라. Prometheus의 extrapolation 때문에 정수가 아닌 값이 나올 수 있고, 스크레이프 놓치면 값이 튄다.
흔한 실수 하나
rate(x[1m]) 이런 거 쓰지 마라. 스크레이프 간격이 15초면 1분 안에 데이터 포인트가 4개밖에 없다. Prometheus는 최소 4개 샘플이 있어야 rate를 계산하는데, 하나라도 놓치면 값이 안 나온다. 알림이 조용히 사라지는 이유가 이거다.
경험칙: rate의 range는 스크레이프 간격의 4배 이상. scrape_interval이 30초면 최소 [2m], 안전하게는 [5m].
참고
지난달 SigNoz 가이드 하나가 잘 정리돼 있어서 팀 세미나 자료로 썼다. 그림 보고 이해하는 게 훨씬 빠르니 한번 보시길.
혹시 다른 함수 조합이나 삽질 경험 있으신 분은 댓글로 알려주세요.