PCA — 프로메테우스 인증 어소시에이트 · 계측·익스포터·레코딩 룰 · 실습
레코딩 룰과 알림 룰, 그리고 테스트
목표
레코딩 룰을 2단 계층으로 설계하고, 그 위에 알림 룰을 얹고, 기대값을 계산한 단위 테스트까지 작성합니다. 마지막으로 같은 내용을 Prometheus Operator 가 읽는 CR 형태로 옮깁니다.
왜 중요한가
레코딩 룰은 "쿼리를 빠르게 하는 캐시"가 아니라 계산 시점을 옮기는 설계 결정입니다. 쿼리 시점의 부하가 평가 시점으로 옮겨 가고, 그 대가로 새 시계열이 영구히 생깁니다. 그래서 만들기 전에 개수를 곱해 봐야 합니다. 라우트 120개에 윈도 5종이면 규칙 하나가 600 시계열이고, 규칙 50개면 3만 개입니다. 계층을 나누는 이유도 같습니다. 계층 1이 원본을 한 번 스캔해 두면 계층 2와 알림 룰은 그 결과만 읽으므로, 원본 스캔이 규칙 수만큼 반복되지 않습니다. 그리고 룰은 프로덕션 코드입니다. 프로덕션 코드는 테스트 없이 배포하지 않습니다.
단계
1. /root/pca-rules/recording.yml 을 만들고 groups 아래 첫 그룹을 name: http_sli, interval: 30s 로 씁니다.
2. 그 그룹의 rules 에 계층 1 규칙 두 개를 넣습니다. record: route:http_requests:rate5m 는 sum(rate(http_requests_total[5m])) by (route), record: route:http_requests_errors:rate5m 는 sum(rate(http_requests_total{status_class="5xx"}[5m])) by (route).
3. 계층 2 규칙 record: route:http_error_ratio:rate5m 를 계층 1 아래에 추가합니다. 표현식은 route:http_requests_errors:rate5m 를 route:http_requests:rate5m 로 나눈 것이며, 원본 http_requests_total 을 다시 쓰면 안 됩니다.
4. record: route:http_request_duration_seconds:p99_rate5m 를 추가합니다. 표현식은 histogram_quantile(0.99, sum(rate(http_request_duration_seconds_bucket[5m])) by (le, route)) 입니다. 이 파일의 레코딩 룰은 총 4개가 됩니다.
5. /root/pca-rules/alerting.yml 을 만들고 그룹 name: http_alerts 아래 알림 CheckoutHighErrorRatio 를 씁니다. expr 은 route:http_error_ratio:rate5m > 0.01, for: 5m, labels.severity: page, annotations 에 summary 와 runbook_url(http 로 시작하는 URL).
6. /root/pca-rules/recording_test.yml 에 promtool 단위 테스트를 씁니다. rule_files 는 recording.yml, evaluation_interval: 30s, tests[0].interval: 15s, input_series 에 2xx(0+150x40)와 5xx(0+3x40) 두 시계열, promql_expr_test 에 expr: route:http_error_ratio:rate5m, eval_time: 8m, exp_samples 의 value 는 3을 153으로 나눈 값(0.0196 으로 시작).
7. 네임스페이스 pca-rules 를 만들고, /root/pca-rules/prometheusrule.yaml 에 PrometheusRule 을 씁니다. apiVersion: monitoring.coreos.com/v1, kind: PrometheusRule, metadata.name: checkout-sli, metadata.namespace: pca-rules, metadata.labels.release: kube-prometheus-stack, spec.groups[0].name: checkout_sli, 그리고 그 안에 record: route:http_error_ratio:rate5m 와 alert: CheckoutHighErrorRatio 를 함께 넣습니다.
참고
expr은 한 줄로 써도 되고expr: |블록으로 여러 줄에 써도 됩니다. 채점은 공백을 무시합니다.- 6단계의 기대값은 직접 계산하세요. 15초 간격으로 2xx 가 150, 5xx 가 3씩 늘면 rate 비율은 3 / (150 + 3) 입니다.
- 흔한 실수 1: 계층 2를 계층 1보다 위에 쓰는 것. 같은 그룹은 위에서 아래로 평가됩니다.
- 흔한 실수 2: 레코딩 룰 이름에 콜론을 빼먹는 것. 콜론은 파생 시계열이라는 표시입니다.
- 흔한 실수 3: PrometheusRule 에
release레이블을 빠뜨리는 것. 오퍼레이터의 ruleSelector 가 이 레이블로 고릅니다.
단계 7개
- 룰 그룹 껍데기 만들기
- 계층 1 — 원본을 한 번만 스캔
- 계층 2 — 계층 1 만 참조
- p99 레코딩 룰
- 알림 룰 파일
- promtool 단위 테스트 파일
- PrometheusRule CR 로 옮기기