PCA — 프로메테우스 인증 어소시에이트 · 규칙 회귀 시험: 초록불의 판별력 · 실습
문법은 통과했는데 경보가 틀렸다
목표
기록 규칙과 경보 규칙을 직접 수정하고, 정상·리셋·결손·대기 시간의 시험을 작성해 의미 오류를 검출합니다.
왜 중요한가
문법 성공은 의미 성공이 아닙니다. 정상 데이터나 빈 시험만으로 잘못된 규칙도 통과할 수 있습니다.
이 실습은 고정 Prometheus 3.14.0의 실제 promtool과 합성 시계열을 사용합니다.
운영 LabHub나 외부 Prometheus의 설정, 실제 수집 대상, Alertmanager는 변경하지 않습니다.
55분 실습입니다. 필요하면 만료 전에 연장하세요. 세션 종료 시 VM과 학생 파일은 회수됩니다.
준비된 파일과 명령
작업 폴더는 /root/pca-rule-lab입니다. 아래 단계의 파일 이름은 모두 이 폴더 기준입니다.
materials/inputs.json은 고정 입력, materials/expected.json은 전체 기대 결과입니다.
materials/starter-파일명은 의도적인 오류가 있는 시작점입니다. 해당 파일을 작업 폴더의 같은 파일명으로
복사하고 편집하세요. 설치된 재료 파일 자체를 덮어쓰지 마세요. 세 규칙 파일을 따로 두므로
뒤 단계의 수정이 앞 단계의 답안을 없애지 않습니다. 재료와 예시에서 정답을 추측하지 말고 본문의 계약과 비교하세요.
python3 /opt/fixtures/pca_rule_lab.py complete N은 현재 답안을 검사하고 observation-N.json에
문법·의미 검사 결과와 입력 해시를 저장합니다. 실패했으면 출력의 exp와 got을 비교하고 답안을 고친 뒤 다시 실행하세요.
grade N은 실제 엔진을 다시 실행하지만 답안과 관측을 변경하지 않습니다. prepare N은 앞 단계만 채웁니다.
solve N은 정답 보기로, 없는 답안만 만들며 기존 부분 답안은 덮어쓰지 않습니다.
answer N은 정답 내용을 터미널에 출력만 합니다. 부분 답안은 그 내용과 비교해 직접 수정할 수 있습니다.
시험 파일의 rule_files는 rules.json 하나를 유지합니다. 도우미는 해당 단계의 규칙을 임시 사본의 rules.json으로
옮긴 다음 promtool check rules와 promtool test rules를 실행합니다. 학생 폴더에 rules.json을 만들 필요는 없습니다.
JSON은 YAML의 표현으로 유효하며 직접 YAML로 작성해도 됩니다. 입력·쿼리·시각·기대값은 고정된 연습 계약이고
시험 순서·입력 순서·표본 순서·공백은 달라도 됩니다. 규칙 표현식은 결과로 검사합니다.
그룹 하나, 기록 규칙 세 개와 경보 한 개, 이름·순서·간격·라벨은 starter대로 유지하세요.
추가 규칙·템플릿·외부 파일·YAML 별칭은 이 연습의 범위가 아닙니다. 파일은 UTF-8 64KiB 이하여야 합니다.
단계
1. diagnosis.json에 syntax_proves_semantics=false, normal_data_sufficient=false 불리언과 reset_good_rate=10.75, reset_bad_rate=10 숫자를 적고 complete 1을 실행하세요. 같은 잘못된 집계 규칙의 문법 성공, 정상 데이터 성공, 리셋 반례 실패를 observation-1.json에서 비교합니다.
2. materials/starter-rate-rules.yml을 rate-rules.yml로 복사하고 pca:requests:rate5m의 expr을 고치세요. 원본별 rate 후 route별 합산으로 정상 6분 /checkout=11, /status=2, 리셋 6분 /checkout=10.75가 되어야 합니다. 나머지 규칙·그룹·1m 간격·라벨은 유지하고 complete 2를 실행합니다.
3. materials/starter-reset-tests.yml을 reset-tests.yml로 복사하고 masked-counter-reset의 6분 요청률 기대값을 10에서 10.75로 고치세요. 두 시나리오의 입력·쿼리·라벨·나머지 기대값은 materials/expected.json과 대조합니다. complete 3은 학생 규칙의 성공과 집계 순서·route 손실 오답의 실패를 모두 검사합니다.
4. materials/starter-coverage-rules.yml을 coverage-rules.yml로 복사하세요. pca:requests:ready_rate5m의 expr에서 없는 경로를 0으로 채우는 부분을 제거하고, 현재 count by(route)가 2인 경로만 유지하세요. 명시적 stale 때 /checkout 결과는 없고 실제 무요청 때는 값 0이 있어야 합니다. /status=2는 보존하고 complete 4를 실행합니다.
5. materials/starter-coverage-tests.yml을 coverage-tests.yml로 복사하세요. missing-is-not-zero의 6분 ready_rate5m 기대 표본에서 /checkout=0을 제거합니다. real-zero의 0 표본은 유지하세요. missing-sample-is-not-staleness의 현재 수 2·표본 나이 60초·요청률 11도 유지하고 complete 5를 실행합니다. 현재 시계열 수를 신선도 보증으로 해석하지 마세요.
6. materials/starter-alert-rules.yml을 alert-rules.yml로 복사하고 PcaHighRequestRate에 for: 2m을 설정하세요. expr은 보호된 rate > 10.5, severity는 practice를 유지합니다. 정상 데이터는 5·6분 pending, 7분 firing이며, 6분 stale 후에는 7·8분 pending, 9분 firing이어야 합니다. complete 6을 실행해 6시나리오 전체를 검사합니다.
7. materials/starter-alert-tests.yml을 alert-tests.yml로 복사하세요. gap-restarts-pending의 7분 firing 경보 기대값을 빈 exp_alerts로 고칩니다. 9분 발화와 ALERTS의 pending·없음·firing 검사, 단순 표본 누락의 7분 발화는 유지하세요. complete 7은 for 없음·1분·3분·보호 조건 없음의 네 오답도 검사합니다.
8. report.json에 missing_is_zero=false, count_proves_freshness=false, notification_delivery_tested=false, production_scraping_tested=false 불리언과 stale_gap_fires_at="9m", missing_sample_fires_at="7m" 문자열을 적으세요. complete 8로 규칙·시험 계약·앞 단계 관측을 재검증합니다. 실제 알림 전달이나 운영 scrape를 확인했다고 쓰지 마세요.
참고와 한계
초기 0부터 시작하는 합성 입력과 1분 평가 간격의 결과입니다. 5m 창의 경계 외삽을 포함하므로 입력을 바꾸고
같은 숫자를 기대하지 마세요. /checkout의 a만 리셋되는 동안 b는 계속 증가하며, /status는 독립 대조 경로입니다.
명시적인 stale과 단순 표본 누락은 다른 입력입니다. count=2는 표본 신선도나 인스턴스 신원의 보증이 아닙니다.
대기 시간은 가상 평가 시간이며 실제로 9분을 기다리지 않습니다. pending과 firing은 ALERTS 라벨로도 검사합니다.
경보 firing을 확인한 것이 외부 알림 전달을 확인한 것은 아닙니다. 실제 scrape의 네트워크 동작은 이 시험에 없습니다.
자료의 해시는 우발적인 덮어쓰기와 다른 실습 관측의 혼용을 찾는 장치입니다. 같은 VM의 root가 모든 코드를
변조하는 것을 막는 보안 보증은 아닙니다. 채점은 60초, 준비는 90초 예산이며 엔진은 더 짧게 제한됩니다.
[공식 규칙 시험](https://prometheus.io/docs/prometheus/latest/configuration/unit_testing_rules/)
단계 8개
- 문법과 의미 검사의 책임 나누기
- 리셋을 숨기지 않는 기록 규칙 작성하기
- 잘못된 집계를 거절하는 시험 작성하기
- 없는 측정과 실제 0을 구분하는 규칙 작성하기
- 결손과 신선도 한계를 시험에 남기기
- 경보의 발화 전후 시간 경계 설정하기
- 끊긴 대기가 재시작하는지 시험하기
- 규칙과 시험을 함께 재검증하고 범위 보고하기