PCA — 프로메테우스 인증 어소시에이트 · 알림과 대시보딩 · 실습
라우팅 트리와 번 레이트 알림
목표
Alertmanager 설정을 라우팅 트리부터 억제 규칙까지 직접 쓰고, SLO 에서 역산한 번 레이트 알림 두 개를 만들고, 런북 누락을 빌드에서 막는 게이트를 작성합니다.
왜 중요한가
알림의 성공 기준은 "문제를 감지했는가"가 아니라 "사람이 지금 무언가를 해야 하는가" 입니다. 이 기준을 통과하지 못하는 알림은 정확해도 해롭습니다. 정확한 알림 400개가 온콜의 반응 속도를 무너뜨리면 정확도는 아무 의미가 없습니다. 그래서 순서가 정해집니다. 사용자 증상으로 SLO 를 정의하고, 예산에서 임계값을 역산하고, 긴 창과 짧은 창을 AND 로 묶어 민감도와 오탐을 동시에 잡고, 그룹핑과 억제로 알림 개수를 사람이 읽을 수 있는 수준으로 줄이고, 페이지에는 런북을 강제합니다. 임계값을 "과거 최대치의 1.2배" 같은 방식으로 정하면 왜 그 값인지 설명할 수 없고, 설명할 수 없는 임계값은 사고가 날 때마다 조금씩 올라갑니다.
단계
1. /root/pca-alerting/alertmanager.yml 을 만들고 루트 route 를 씁니다. receiver: ticket-queue, group_by: ['alertname', 'cluster', 'slo'], group_wait: 30s, group_interval: 5m, repeat_interval: 4h.
2. 루트의 routes 첫 항목에 자식 라우트를 넣습니다. matchers: ['severity="page"'], receiver: oncall-pager, group_wait: 10s, repeat_interval: 1h.
3. receivers 에 두 수신자를 정의합니다. ticket-queue 와 oncall-pager 각각에 webhook_configs 를 두고 url 은 http:// 로 시작하는 아무 내부 주소면 됩니다.
4. inhibit_rules 첫 항목을 씁니다. source_matchers: ['alertname="ClusterDown"', 'severity="page"'], target_matchers: ['severity=~"page|ticket"'], equal: ['cluster'].
5. /root/pca-alerting/burnrate.yml 을 만들고 그룹 아래 알림 CheckoutErrorBudgetBurnFast 를 씁니다. expr 은 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 로 묶은 것, for: 2m, labels 에 severity: page 와 slo: checkout-availability, annotations 에 summary 와 runbook_url.
6. 같은 파일에 알림 CheckoutErrorBudgetBurnSlow 를 추가합니다. expr 은 job:slo_errors:ratio_rate6h{job="checkout-api"} > (6 * 0.001) 과 job:slo_errors:ratio_rate30m{job="checkout-api"} > (6 * 0.001) 을 and 로 묶은 것, for: 15m, labels 에 severity: ticket 과 slo: checkout-availability.
7. /root/pca-alerting/runbook-gate.sh 를 작성합니다. 첫 번째 인자로 룰 파일 경로를 받아, labels.severity 가 page 인데 annotations.runbook_url 이 없는 알림이 하나라도 있으면 그 이름을 출력하고 0 이 아닌 코드로 종료하고, 하나도 없으면 0 으로 종료합니다.
참고
- 5단계와 6단계의
expr은expr: |블록으로 여러 줄에 써도 됩니다. 채점은 공백을 무시합니다. - 7단계 검증은 여러분이 만든
burnrate.yml(통과해야 함)과 채점기가 만든 런북 누락 파일(막아야 함) 두 가지로 이뤄집니다.severity: ticket인 알림까지 막으면 실패합니다. - 힌트:
yq '.groups[].rules[] | select(...) | .alert' "$1"로 목록을 뽑아 비어 있지 않으면exit 1. - 흔한 실수 1:
group_by에instance를 넣는 것. 파드 수만큼 알림이 옵니다. - 흔한 실수 2: 억제 규칙에서
equal을 빼먹는 것. 다른 클러스터의 알림까지 억제됩니다.
단계 7개
- 루트 라우트 쓰기
- 심각도별 자식 라우트
- 수신자 정의
- 억제 규칙
- 빠른 소진 알림
- 느린 소진 알림
- 런북 CI 게이트 스크립트