PromQL rate() vs irate() — 평균 증가율과 순간 증가율
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분입니다. 여유를 두는 게
안전합니다.
댓글 0