PCA — 프로메테우스 인증 어소시에이트 · PromQL · 실습
PromQL 쿼리 여덟 개 쓰기
목표
PromQL 쿼리 여덟 개를 파일로 작성하면서, rate 의 순서·le 보존·최소 트래픽 게이트 같은 실전 규율을 손에 붙입니다. 시험 비중이 28% 로 가장 큰 도메인이고, 여기서 나오는 실수는 대부분 에러 없이 틀린 답을 돌려주는 종류입니다.
왜 중요한가
PromQL 이 어려운 이유는 문법이 아니라 틀려도 조용하다는 점입니다. sum 을 rate 바깥에 두지 않으면 값이 낮게 나오고, by (le) 를 빼먹으면 분위수가 아니라 아무 숫자가 나오고, 최소 트래픽 게이트가 없으면 새벽 저트래픽 구간마다 유령 알림이 납니다. 셋 다 대시보드에서는 정상으로 보입니다. 그래서 쿼리는 "동작하는가"가 아니라 "어떤 조건에서 거짓말하는가"를 기준으로 검토해야 합니다. 이 실습은 그 검토 항목을 쿼리 하나하나에 심어 둡니다.
단계
1. /root/pca-promql/01-request-rate.promql 에 라우트별 초당 요청률을 씁니다. 메트릭은 http_requests_total, 윈도는 [5m], 집계 레이블은 route 입니다.
2. /root/pca-promql/02-error-ratio.promql 에 라우트별 5xx 에러율을 씁니다. 분자는 status_class="5xx" 로 필터한 rate, 분모는 전체 rate, 양쪽 모두 by (route) 로 집계해 나눕니다.
3. /root/pca-promql/03-p99-route.promql 에 라우트별 p99 지연을 씁니다. histogram_quantile(0.99, ...) 안에서 http_request_duration_seconds_bucket 에 [5m] rate 를 걸고 by (le, route) 로 집계합니다.
4. /root/pca-promql/04-cardinality-topk.promql 에 시계열이 가장 많은 메트릭 상위 10개를 뽑는 쿼리를 씁니다. topk(10, ...) 안에서 count by (__name__) 을 쓰고, 대상 셀렉터는 {__name__=~".+"} 입니다.
5. /root/pca-promql/05-disk-predict.promql 에 디스크 소진 예측을 씁니다. predict_linear(node_filesystem_avail_bytes{mountpoint="/data"}[6h], 4 * 3600) < 0 에, 현재 여유 비율이 < 0.2 라는 조건(node_filesystem_avail_bytes 를 node_filesystem_size_bytes 로 나눈 값)을 and 로 묶습니다.
6. /root/pca-promql/06-nan-guard.promql 에 저트래픽 가드가 붙은 에러율 알림 표현식을 씁니다. 2단계와 같은 비율이 > 0.01 이고, 동시에 sum(rate(http_requests_total[5m])) by (route) > 1 을 and 로 묶습니다.
7. /root/pca-promql/07-scrape-health.promql 에 스크레이프 건강 확인을 씁니다. up{job="checkout-api"} == 0 과 absent(up{job="checkout-api"}) 를 or 로 묶습니다.
8. /root/pca-promql/08-burn-rate.promql 에 다중 윈도 번 레이트를 씁니다. job:slo_errors:ratio_rate1h{job="checkout-api"} > (14.4 * 0.001), job:slo_errors:ratio_rate5m{job="checkout-api"} > (14.4 * 0.001), job:http_requests:rate5m{job="checkout-api"} > 1 세 항을 and 로 묶습니다.
참고
- 채점은 공백과
#주석을 무시하고 문자열을 대조합니다. 여러 줄로 예쁘게 써도 되지만 메트릭 이름·레이블·윈도·숫자는 지시한 그대로 쓰세요. - 흔한 실수 1:
rate(sum(...))순서. 채점이 이 형태를 명시적으로 거부합니다. - 흔한 실수 2: 3단계에서
by (route)만 쓰고le를 빠뜨리는 것. - 흔한 실수 3: 2단계에서 분자에만
by (route)를 붙이는 것. 나눗셈은 양쪽 레이블 셋이 매칭되어야 합니다.
단계 8개
- 라우트별 초당 요청률
- 라우트별 5xx 에러율
- 라우트별 p99 지연
- 카디널리티 상위 10개 진단
- 디스크 소진 예측
- 저트래픽 유령 알림 막기
- 스크레이프 건강 확인
- 다중 윈도 번 레이트