Alert Fatigue Reduction Strategies

822 단어·2 분·원문(.md)

Alert fatigue refers to the phenomenon where engineers, continuously exposed to numerous alerts, especially false positives or alerts that cannot be acted upon, become desensitized to alerts.

Beyond just making engineers tired, this can lead to a "boy who cried wolf" syndrome in the system. If engineers develop a habit of ignoring alerts like "CPU usage reached 80%" that trigger 100 times a day, a catastrophic event could occur where even critical alerts, such as "payment failure rate 100%" indicating a real system collapse, are unconsciously marked as read.

Three Golden Rules for Reducing Alert Fatigue #

The core of monitoring is not to receive alerts for everything, but to receive alerts only for things that require immediate action.

  1. Alert on symptoms, not causes.

    Bad is cause-based. "Server A's CPU usage exceeded 90%." Even if the CPU is at 90%, if customer payments are processing normally in 0.1 seconds, there's no problem. It just means resources are being used efficiently.

    For Good, set up alerts for unpleasant symptoms that cause customers to wait for more than 2 seconds in front of their screens, such as "The 99th percentile response latency for the payment API exceeded 2 seconds," indicating immediate action is required.

  2. If you can't take action, it's not an alert.

    If you wake up at 3 AM to an alert, but there's no immediate action you can take, such as flipping a switch or rolling back code, then it shouldn't trigger an alert.

    Things that will resolve themselves as traffic naturally subsides, or temporary network interruptions from a payment gateway provider, should only be recorded on a dashboard or left as info in a dedicated Slack channel, without waking up engineers. An alert without a runbook is trash.

  3. Grouping and deduplication

    If a database dies, 50 servers relying on it will also go down, and if 50 identical alerts from API servers flood in simultaneously, say 5000 alerts in one minute, critical information can be missed.

    An alert system must eliminate duplicates and group sequential alerts originating from the same cluster or service into a single notification.

Example #

Let's look at examples of Alertmanager grouping and Datadog anomaly detection queries.

First, here's a configuration for Alertmanager to group database connection errors simultaneously occurring across hundreds of pods into a single alert.

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' # 슬랙 메시지만

Applying Dynamic Thresholds: Datadog Anomaly Detection

Fixed thresholds, like "alert if concurrent users exceed 1000," won't trigger at night and will produce false positives on event days.

By learning past patterns, alerts are dramatically reduced to trigger only when behavior deviates significantly from the usual pattern for that time of day.

# 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

At 3 AM, there's usually no traffic, so even a single error would result in a 100% error rate. However, this algorithm recognizes that the sample size is small at this time, making it prone to spikes, and thus avoids sending unnecessary alerts.

SRE/question/q_48.md