PromQL rate() vs irate() — 평균 증가율과 순간 증가율

데이터·관측성2분조회

Prometheus 는 시계열 지표를 수집·저장하는 모니터링 시스템이고, PromQL 은 그 지표를 조회하는 질의 언어입니다. Counter(계속 증가만 하는 지표 타입)의 초당 증가율을 구하는 함수가 rate()irate() 둘인데, 같은 걸 구하는 것 같지만 계산 방식이 달라서 쓰는 자리가 갈립니다.

rate() — 범위 전체의 평균

지정한 시간 범위(range vector) 안의 평균 증가율입니다.

rate(http_requests_total[5m])
# 5분간 평균 RPS

5분 범위에 든 모든 샘플로 평균을 내기 때문에, scrape interval 이 15초면 5분에 20개가 들어가고 그 20개로 계산합니다. 일시적인 spike 가 있어도 평균에 묻혀서 완만하게 나옵니다.

irate() — 마지막 두 샘플의 순간값

가장 최근 두 샘플 만으로 계산한 순간 증가율입니다.

irate(http_requests_total[5m])
# 가장 최근 두 샘플로 계산한 순간 RPS

여기서 [5m] 은 평균 범위가 아니라 “어디까지 거슬러 올라가 마지막 두 샘플을 찾을지” 의 한계(staleness window)입니다. 실제 계산엔 마지막 2개만 씁니다. 그래서 순간 변화에 민감하고, 그만큼 노이즈도 많습니다.

선택 기준

rate() irate()
계산 범위 전체 평균 마지막 두 샘플
spike 민감도 둔함 민감
노이즈 적음 많음
쓰는 곳 알람 룰, 추이 확인 실시간 대시보드

알람에는 rate(). 일시적인 spike 하나로 알람이 울리면 안 됩니다. 평균이라 안정적입니다.

실시간 spike 를 봐야 하면 irate(). 지금 이 순간 튀는 걸 대시보드에서 잡을 때. 다만 그래프가 지글거립니다.

범위가 너무 짧을 때

rate() 의 범위를 scrape interval 보다 짧게 잡으면 샘플이 0~1개밖에 안 들어와서 no data 가 나거나 부정확해집니다.

범위 안에 최소 2개 샘플이 있어야 계산이 되고, Prometheus 문서는 여유를 둬서 scrape interval × 4 이상을 권합니다. scrape 가 15초면 최소 1분입니다. 여유를 두는 게 안전합니다.

참고

  1. 불러오는 중