Alert Fatigue 감소 전략

1,324 단어·3 분·원문(.md)

알람 피로도란 수많은 알람. 특히 오탐지나 조치할 수도 없는 알람에 지속적으로 노출된 엔지니어가 알람에 무감각해지는 현상을 말한다.

단순히 엔지니어가 피곤한 것을 넘어 시스템에 양치기 소년 증후군을 유발하게 되는건데 하루에 100번씩 울리는 cpu 80퍼센트 도달 같은 알림이 무시하는 습관이 들리면 진짜 시스템이 무너지고있는 결제 실패율 100퍼같은 알람마저 무의식적에 읽음 처리해버리는 대참사가 발생할 수 잇다.

알림 피로도를 줄이는 3가지 철칙 #

모니터링의 핵심은 모든 것을 알람으로 받는것이 아니라 진짜 내가 당장 행동해야할 것만 알람으로 받는것이다.

  1. 원인이 아닌 증상에 알람을 걸어라.

Bad는 원인기반. 서버 a의 cpu 사용률이 90퍼센트가 넘었습니다. 같은 cpu가 90퍼센트라도 고객의 결제가 정상적으로 0.1초만에 되고있다면 아무 문제가 아니다. 알뜰하게 자원을 쓰고잇는거지.

Good을 알아보면 결제 api의 99퍼센타일 응답 지연 시간이 2초를 통과했습니다 같은 고객이 화면 앞에서 2초이상 기다리는 불편한 증상같은것을 보고 당장 조치해야한다고 알람을 구축해두자.

  1. 행동 action 할 수 없으면 알람이 아니다

새벽 3시 이 알람을 받고 깼는데, 내가 스위치를 내리거나 코드를 롤백하는등 당장 할 수 있는 액션이 없다면 그건 알람으로 울려선 안된다.

자연스럽게 트래픽이 빠지면 해결될 일, 또는 pg사의 일시적인 네트워크 순단같은것은 대시보드에 기록하거나 슬랙 전용 채널에 info만 남겨두고 엔지니어를 깨워선안된다. runbook이 없는 알림을 쓰레기다.

  1. grouping depulication

db가 죽으면 db를 바라보는 50개의 서버가 죽을거고 api 서버가 일제히 똑같은 알람을 50개 1분동안 예를들어 5000개씩 쏟아진다고치면 중요한 정보를 놓칠 수 있다.

알람 시스템은 반드시 중복을 제거해야하고 동일한 클러스터나 서비스에서 발생한 연쇄알람을 하나의 알람으로 묶어서 통지해야한다.

Example #

Alertmanager grouping과 datadog에 이상탐지 쿼리를 예시로 들어보겠다.

처음 alertmanager로 수백대의 파드에서 동시에 터지는 db연결 에러를 하나로 묶어서 보내는 설정이다.

route:
  # 기본적으로 모든 알람은 이 규칙을 탐
  receiver: 'slack-general-alerts'
  
  # 🚨 핵심: 알람 묶기 (Grouping)
  # 같은 '환경(env)'과 '서비스(service)' 라벨을 가진 알람은 하나로 묶음
  group_by: ['env', 'service']
  
  # 그룹화된 첫 알람을 보낼 때까지 30초 대기 (폭풍 알람이 모일 시간을 줌)
  group_wait: 30s
  
  # 동일한 그룹의 '새로운' 알람이 추가되면 5분마다 업데이트 통지
  group_interval: 5m
  
  # 장애가 지속될 경우 동일한 알람을 다시 쏘는 주기 (너무 짧으면 피로도 급증)
  repeat_interval: 4h

  # 서브 라우팅 (SEV 등급에 따라 타겟 변경)
  routes:
  - match:
      severity: critical # SEV-1, SEV-2 수준
    receiver: 'pagerduty-oncall' # 전화 울림
  - match:
      severity: warning  # SEV-3 수준
    receiver: 'slack-service-team' # 슬랙 메시지만

동적 임계치 적용: Datadog 이상탐지 Anomaly Detection

접속자가 1000명을 넘으면 알람같은 고정 수치는 밤에 안울리고 이벤트 날에는 오탐지를 낸다.

과거의 패턴을 학습해 평소 이 시간대와 다르게 튈 때 만 알람을 보내도록 획기적으로 낮춘다.

# Datadog Monitor Query 예시
# 지난 1주일간의 트래픽 패턴(agile 알고리즘)을 학습하여, 현재 에러율이 예상 밴드(Band)를 3 스탠다드 데비에이션(3 시그마) 이상 벗어났을 때만 알람 발생.

avg(last_15m):anomalies(
  sum:trace.http.request.errors{env:prod, service:payment}.as_rate(), 
  'agile', 
  3, 
  direction='above', 
  alert_window='last_5m', 
  interval=60, 
  count_default_zero='true'
) >= 1

새벽 3시에는 원래 트래픽이 없으므로 에러 1건만 나도 에러율이 100퍼가 되지만 이 알고리즘은 원래 이 시간엔 모수가 적어 튀기 쉽다는 것을 인지해 쓸데없는 알람을 안쏘는것이다.

SRE/question/q_48.md