[1m] 을 붙인 질의는 모두 "최근 1분" 을 다루지만, 지표 종류에 따라 써야 할 함수가 다르다.
| 지표 종류 | 함수 | 결과가 뜻하는 것 |
|---|---|---|
| Counter (계속 증가) | rate(m[1m]) |
1분 구간에서의 초당 평균 증가량 |
| Gauge (오르내림) | avg_over_time(m[1m]) |
1분 구간 샘플들의 산술 평균값 |
rate(http_requests_total[1m]) # 초당 요청 수
avg_over_time(node_load1[1m]) # 1분간 load average 평균
Counter 에 avg_over_time 을 쓰면 누적값의 평균이 나와 의미가 없고, Gauge 에 rate 를 쓰면 값이 줄어드는 구간을 카운터 리셋으로 오해해 엉뚱한 수가 나온다.
구간 길이는 스크레이프 간격의 4배 이상을 권한다. scrape_interval 이 30초인데 [1m] 을 주면 구간 안에 샘플이 두 개뿐이라, 하나만 늦어도 결과가 비거나 크게 튄다. 30초 간격이면 [2m] 이상을 쓴다.
짧은 구간에서 마지막 변화를 민감하게 보고 싶으면 irate 를 쓰지만, 경보 조건에는 흔들림이 커서 적합하지 않다.
avg_over_time 은 한 시리즈를 시간축으로 평균한다. 여러 시리즈를 하나로 합치는 것은 집계 연산자 avg 다. 둘은 다르다.
avg_over_time(node_load1[5m]) # 인스턴스별로 각각 5분 평균
avg(node_load1) # 순간값을 인스턴스끼리 평균
avg(avg_over_time(node_load1[5m])) # 5분 평균을 다시 전체 평균
avg by (job) (avg_over_time(node_load1[5m])) # job 단위로 묶기
PromQL 의 값 타입은 네 가지다. 순간 벡터(instant vector), 구간 벡터(range vector), 스칼라(scalar), 문자열이다. 스칼라는 라벨도 타임스탬프도 없는 숫자 하나다.
1 + 2 # 스칼라 3
rate(http_requests_total[5m]) > 0.1 # 여기서 0.1 이 스칼라
scalar() 는 순간 벡터를 스칼라로 바꾼다. 다만 조건이 까다롭다.
scalar(up{job="api-server"})
NaN 을 돌려준다. 조용히 틀린 결과가 나오므로, 라벨 셀렉터가 하나만 고르는지 먼저 확인한다.반대로 스칼라를 벡터로 바꾸는 vector() 도 있다. 결과가 비었을 때 0 을 채워 넣어 그래프가 끊기지 않게 할 때 쓴다.
sum(rate(errors_total[5m])) or vector(0)
스칼라를 받는 대표적인 함수는 다음과 같다.
| 함수 | 설명 |
|---|---|
scalar(v) |
원소가 하나인 순간 벡터를 스칼라로 |
vector(s) |
스칼라를 라벨 없는 순간 벡터로 |
clamp_max(v, s) |
각 시리즈 값의 상한을 스칼라로 자른다 |
clamp_min(v, s) |
하한을 자른다 |
time() |
질의 시점의 유닉스 시각 (스칼라) |
벡터와 스칼라의 산술은 그대로 되지만, 벡터끼리의 산술은 라벨 집합이 맞아야 하고 맞지 않으면 결과가 빈다. 이때 on(...) · ignoring(...) 으로 맞출 기준을 지정한다.