LabHub

PCA — 프로메테우스 인증 어소시에이트 · 계측·익스포터·레코딩 룰 · 실습

레코딩 룰과 알림 룰, 그리고 테스트

LabHub 에서 이어서 보기

목표

레코딩 룰을 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:rate5msum(rate(http_requests_total[5m])) by (route), record: route:http_requests_errors:rate5msum(rate(http_requests_total{status_class="5xx"}[5m])) by (route).
3. 계층 2 규칙 record: route:http_error_ratio:rate5m 를 계층 1 아래에 추가합니다. 표현식은 route:http_requests_errors:rate5mroute: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 를 씁니다. exprroute:http_error_ratio:rate5m > 0.01, for: 5m, labels.severity: page, annotationssummaryrunbook_url(http 로 시작하는 URL).
6. /root/pca-rules/recording_test.yml 에 promtool 단위 테스트를 씁니다. rule_filesrecording.yml, evaluation_interval: 30s, tests[0].interval: 15s, input_series 에 2xx(0+150x40)와 5xx(0+3x40) 두 시계열, promql_expr_testexpr: route:http_error_ratio:rate5m, eval_time: 8m, exp_samplesvalue 는 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:rate5malert: CheckoutHighErrorRatio 를 함께 넣습니다.

참고

단계 7개

  1. 룰 그룹 껍데기 만들기
  2. 계층 1 — 원본을 한 번만 스캔
  3. 계층 2 — 계층 1 만 참조
  4. p99 레코딩 룰
  5. 알림 룰 파일
  6. promtool 단위 테스트 파일
  7. PrometheusRule CR 로 옮기기