본문으로 건너뛰기

7.1 Alert 설계

Alert의 목적은 이상한 숫자를 알리는 것이 아니라 사람이 행동해야 할 상황을 전달하는 것입니다. Page, ticket, dashboard를 구분하면 야간 noise를 줄이면서 위험 신호를 놓치지 않을 수 있습니다.

세 등급

등급조건예시
Page사용자가 영향을 받고 즉시 완화 필요오류율 급증/write 불가/SLO 빠른 소진
Ticket아직 영향은 작지만 근무 시간 내 조치 필요volume 여유 감소/inactive slot WAL 증가
Dashboard분석 context이며 단독 행동 불필요cache hit 변화/table별 dead tuple

사용자 증상과 원인 신호의 알림 등급 라우팅

pg_up == 0을 항상 page로 보내면 monitoring network 장애와 database 장애를 구분하지 못합니다. 사용자 요청 성공률이나 synthetic check가 정상인 경우에는 ticket 등급으로 조사합니다.

증상과 원인 분리

Page는 사용자 증상에 가깝게 둡니다.

  • 요청 error ratio
  • p95/p99 latency SLO 위반
  • transaction 성공률
  • write/read freshness
  • critical workflow synthetic test

원인 후보는 진단용 alert나 dashboard로 둡니다.

  • CPU utilization
  • connection 사용률
  • dead tuple
  • checkpoint 빈도
  • replica lag
  • storage latency

Replica lag의 등급은 서비스가 replica read나 failover freshness를 요구하는지에 따라 달라집니다.

Exporter 상태를 분리한다

- alert: PostgreSQLExporterUnreachable
expr: up{job="postgres"} == 0
for: 5m
labels:
severity: ticket
annotations:
summary: "Prometheus cannot scrape PostgreSQL Exporter"

- alert: PostgreSQLCollectionFailed
expr: up{job="postgres"} == 1 and pg_up == 0
for: 2m
labels:
severity: ticket
annotations:
summary: "Exporter is reachable but PostgreSQL collection fails"

첫 alert는 scrape 경로, 두 번째는 PostgreSQL connection이나 collector를 조사하며 각각 별도 runbook에 연결합니다.

for와 지속성

순간적인 spike를 모두 alert로 만들지 않습니다.

- alert: PostgreSQLConnectionsNearLimit
expr: instance:pg_connection_utilization:ratio > 0.85
for: 15m

Connection 85%는 예시이며 실제 임계값의 검토 요소는 pooling 방식, reserved connection, 평소 변동, capacity 확보 시간입니다.

Alert annotation

Alert 하나로 첫 조사를 시작할 수 있어야 합니다.

  • 무엇이 실패했는지
  • 어떤 사용자 영향이 예상되는지
  • cluster/instance/database
  • 시작 시각과 현재값
  • dashboard URL
  • runbook URL
  • 최근 변경 링크

Annotation에는 metric 이름과 query뿐 아니라 수신자가 바로 조사할 의미와 context를 함께 기록합니다.

Noise review

매달 alert별로 다음을 집계합니다.

  • firing 횟수와 시간대
  • 사람이 실제 행동한 비율
  • 자동 복구된 비율
  • 중복 page 수
  • false positive와 false negative
  • acknowledgement와 완화까지 걸린 시간

Review 결과에 따라 행동하지 않은 page의 threshold를 조정하거나 등급을 ticket으로 내리거나 해당 alert를 삭제합니다.

참고: Prometheus alerting practices, Google SRE Monitoring Distributed Systems