rate then sum YES, sum then rate NO
(robustperception.io)- Prometheus에서 counter를 다룰 때, rate 같은 counter-only 함수와 aggregation을 적용할때 실수하기 쉬운게 있음
- Prometheus에서 counter는 오직, "증가하거나", "유지되거나", "초기화되거나"만 가능
- Node Exporter의 초당 요청율을 구하고 싶을때 다음과 같은 쿼리를 작성할 수 있음?
-
sum by (job)(rate(http_requests_total{job="node"}[5m]))
-
- 그런데? 다음과 같은 쿼리는?
-
rate(sum by (job)(http_requests_total{job="node"})[5m])
- 이 쿼리는 문제가 있음
-
- 만약 어떤 노드가 재시작되었다 하면, 해당 노드 위 Node Exporter의
http_requests_total
는 0으로 초기화 됨- 그럼 전체
sum(...)
의 값은 줄어들게 됨 -
rate()
은 counter가 초기화된것이라 판단하고, 잘못된 spike가 생기게 됨- *n에서 n-a만큼 값이 줄어들면, rate입장에선 (n-a)만큼 값이 튀었다고 보게 되므로
- 그럼 전체
- 따라서...
-
rate(counter_a[5m] + counter_b[5m])
이렇게 하면 NO -
rate(counter_a[5m]) + rate(counter_b[5m])
이렇게 하는건 YES
-
-
sum()
말고도min()
,max()
,avg()
,ceil()
,histogram_quantile()
,predict_linear()
같은 것들에도 해당되는 얘기임 - counter에 대한 함수에는
rate()
말고도irate()
,increase()
,resets()
들도 있음
*
가 붙은 요약은 원문에 없는 부연 설명이라 따로 표시했습니다.