가시성 팀을 위한 현대적인 알림 시스템 설계
경보 시스템은 소음을 위한 것이 아니라 대응을 위한 것입니다.
경보(Alerting)는 너무 자주 단순한 모니터링 기능으로 설명됩니다. 그런 설명은 편리하지만, 실제 문제를 가려버립니다.
지표(Metric)는 아무도 깨우지 않습니다. 그래프는 긴박감을 만들지 못합니다. 대시보드는 소유권을 부여하지 않습니다. 경보는 그 뒤에 있는 시스템이 잘 설계되어 있다면 이 세 가지 모두를 수행하지만, 설계가 약하면 아무것도 수행하지 못합니다.

여기서 설정한 목표는 경보를 규칙, 라우팅, 컨텍스트, 채널, 인간, 피드백 루프로 구성된 시스템으로 정의하는 것입니다.
이러한 구분이 중요한 이유는 현대적인 경보가 더 이상 페이지(Pager)에 연결된 단일 임계값이 아니기 때문입니다. Prometheus는 알림 규칙과 Alertmanager를 분리하며, 라우팅, 그룹화, 억제, 정적(침묵), 수신자 처리는 Alertmanager에서 담당합니다. 이 분리는 유용합니다. 감지와 전달은 서로 다른 관심사이기 때문입니다. 알림 규칙은 무언가 잘못되었는지 결정합니다. 알림 관리는 누가 신경 써야 하는지, 얼마나 자주, 어떤 채널을 통해 전달할지 결정합니다.
관련 읽을거리:
경보의 실제 정의
경보는 흥미로워 보이는 신호가 아닙니다.
경보는 조치가 필요한 신호입니다.
이 정의는 놀라울 만큼 많은 텔레메트리 데이터를 제외합니다. 로그는 기록입니다. 지표는 측정값입니다. 트레이스는 실행 경로입니다. 관측 가능성(Observability) 시스템은 이러한 신호를 수집하여 인간과 도구가 동작을 이해할 수 있도록 합니다. 경보는 특정 조건이 응답을 트리거할 만큼 중요할 때 비로소 시작됩니다.
이는 관측 가능성을 건강하게 유지하는 경계선입니다.
- 지표는 무엇이 변경되었는지 답합니다.
- 로그는 무슨 일이 발생했는지 답합니다.
- 트레이스는 시간과 오류가 어디에 축적되었는지 답합니다.
- 경보는 지금 누가 행동해야 하는지 답합니다.
모든 것이 경보가 되면, 아무것도 경보가 아닙니다. 그 결과는 커버리지가 아니라 혼란입니다.
시스템으로서의 경보
실용적인 경보 수명은 다음과 같습니다:
signal -> rule -> alert -> routing -> channel -> human or automation -> action -> feedback
이 수명은 단순한 임계값 다이어그램보다 더 유용한데, 이는 실제 시스템이 수행하는 작업을 반영하기 때문입니다.
신호(Signal)
시작점은 텔레메트리입니다. 대부분의 스택에서 이는 지표, 로그, 트레이스 또는 유도된 헬스 체크를 의미합니다. OpenTelemetry는 지표, 로그, 트레이스를 별도의 신호로 공식화하며, 이는 작업에 맞는 올바른 신호로부터 경보를 파생해야 하므로 유용합니다.
규칙(Rule)
규칙은 원시 텔레메트리를 중요한 조건으로 변환합니다. 이는 임계값 기반, 속도 기반, 이상 탐지 기반 또는 SLO 기반일 수 있습니다.
경보(Alert)
규칙은 라벨, 주석 및 컨텍스트가 포함된 경보 이벤트를 생성합니다. 여기에서 심각도, 서비스, 팀, 환경이 명시적으로 드러나야 합니다.
라우팅(Routing)
라우팅은 경보가 어디로 가는지를 결정합니다. Alertmanager에서는 그룹화, 억제, 정적(침묵), 알림 수신자가 포함됩니다. 여기서 경보는 단순한 기술적 문제를 넘어 운영상의 문제로 변모합니다.
채널(Channel)
긴급도와 대상에 따라 동일한 경보가 다른 채널에 속할 수 있습니다.
- 즉시 대응을 위한 페이지(Pager)
- 조정을 위한 채팅(Chat)
- 낮은 긴급도 요약을 위한 이메일
- 계획된 후속 조치를 위한 티켓 또는 워크플로우 시스템
인간 또는 자동화
일부 경보는 인간의 판단이 필요합니다. 일부는 자동 복구(Remediation)를 트리거해야 합니다. 많은 경우 둘 다 필요합니다.
조치(Action)
경보의 목적은 가시성이 아닙니다. 그것은 조치입니다. 조치는 재시작, 롤백, 실패 전환(Failover), 조사 또는 단순히 확인일 수 있습니다.
피드백(Feedback)
마지막 단계가 가장 소홀히 다루어집니다. 훌륭한 팀들은 어떤 경보가 유용했고, 시끄러웠으며, 늦었거나, 잘못 라우팅되었거나, 누락되었는지 검토합니다. 이러한 루프가 없으면 경보는 쇠퇴합니다.
관측 가능성과 경보의 차이
경보는 관측 가능성 내부에 속하지만, 관측 가능성을 섭취해서는 안 됩니다. 더 넓은 기초에 대해서는 관측 가능성: 모니터링, 지표, Prometheus 및 Grafana 가이드를 참조하십시오.
관측 가능성은 사람들이 시스템을 탐색하는 데 도움이 됩니다. 경보는 사람들을 방해합니다. 이 구별은 불편하지만 필요합니다.
경계를 생각하는 유용한 방법:
- 관측 가능성은广度(Breadth, 폭)입니다.
- 경보는 선택성(Selectivity)입니다.
풍부한 텔레메트리와 선택적인 방해가 필요합니다. 일반적인 실패 모드는 그 반대입니다: 빈약한 텔레메트리와 공격적인 경보.
이것이 경보가 이상해 보이는 모든 지표가 아니라, 신중하게 선택된 증상과 비즈니스 영향도를 기반으로 해야 하는 이유입니다. 과부하된 노드, 느린 의존성 또는 증가한 오류율은 모두 중요할 수 있지만, 영향이나 개입이 필요하다는 의미일 때만 그렇습니다.
좋은 경보 설계의 핵심 원칙
실행 가능성(Actionability)
모든 경보는 한 가지 질문에 명확하게 답해야 합니다.
다음에 무엇을 해야 하는가?
명확한 다음 단계가 없다면, 그 경보는 방해 채널이 아닌 대시보드, 보고서 또는 이슈 백로그에 속해야 할 것입니다.
실행 가능성은 일반적으로 경보가 다음을 포함함을 의미합니다:
- 무엇이 고장 났는지
- 얼마나 심각한지
- 어디서 발생하고 있는지
- 다음으로 무엇을 확인해야 하는지
- 실행 파일(Runbook) 또는 조사 컨텍스트 링크
소유권(Ownership)
소유권이 없는 경보는 통제 메커니즘이 아니라 불평입니다.
모든 경보는 사고 발생 시가 아닌 설계 단계에서 명확한 소유자를 가져야 합니다. 소유권은 팀, 교대 근무 또는 서비스 그룹일 수 있지만, 명시적이어야 합니다.
컨텍스트(Context)
경보는 알림 시간을 줄이는 것이 아니라 이해 시간을 줄여야 합니다.
유용한 컨텍스트에는 보통 다음이 포함됩니다:
- 서비스 이름
- 환경
- 리전 또는 클러스터
- 현재 값 및 임계값
- 최근 추세
- 예상 폭발 반경(Blast radius)
- 관련 대시보드 또는 트레이스
- 실행 파일(Runbook) 링크
선택성(Selectivity)
가장 좋은 경보는 보통 가장 빠른 것이 아닙니다. 신뢰할 수 있는 가장 빠른 경보입니다.
이것이 장기적으로 높은 신호 대 잡음비(Signal-to-noise ratio) 경보가 조급하지만 잡음이 많은 임계값보다 더 잘 작동하는 이유입니다.
잡음 저항성(Noise resistance)
잡음은 단순히 볼륨만 관련된 것이 아닙니다. 그것은 반복과 모호함도 포함합니다.
잘 설계된 경보 시스템은 더 큰 근본 원인이 이미 알려져 있을 때 중복 증상을 억제하고, 관련 경보를 그룹화하며, 합리적인 최소수의 채널을 통해 라우팅합니다.
실제로 도움이 되는 경보 분류법
단순한 분류법이 보통 더 좋습니다.
Critical(치명적)
즉각적인 인간 대응이 필요합니다. 이는 페이지 영역입니다. Critical 경보는 드물어야 하며, 명확한 소유권을 가져야 하며, 사용자 또는 비즈니스 영향도와 밀접하게 연결되어야 합니다.
High(높음)
긴급하지만 반드시 지금 누군가를 깨울 필요는 없습니다. 이들은 주로 근무 시간 동안 팀 채팅 및 사고 채널에 속하거나, 1차 분류(Triage)로 시작되는 온콜 워크플로우에 속합니다.
Informational(정보성)
인지도, 추세 모니터링 또는 계획된 후속 조치를 위해 유용합니다. 이들은 긴급 사고와 같은 경로에 속하지 않아야 합니다.
일반적인 실수는 너무 많은 심각도를 도입하는 것입니다. 실제로 팀은 응답 기대치와 채널로 명확하게 매핑되는 작은 모델로 작동할 때 더 잘运作합니다.
경보 피로는 설계 문제입니다
경보 피로는 종종 사람들의 문제로 설명됩니다. 그렇지 않습니다. 대부분 시스템의 문제입니다.
중요하지 않은 알림을 너무 많이 받거나, 서로 반복되거나, 명확한 조치가 없는 경우 사람들은 둔감해집니다. 나쁜 경보 시스템은 나쁜 인간 행동을 만듭니다.
일반적인 원인:
- 모든 증상이 경보로 전환됨
- 대규모 장애 시 그룹화 없음
- 억제 규칙 누락
- 부족한 소유권
- 긴급도에 따라 채널이 혼합됨
- 사용자 영향도와 단절된 경보 임계값
- 사고 후 검토 루프 없음
이것을 더 나은 벨소리로 해결하지 않습니다. 설계로 해결합니다.
중요한 규칙 전략
임계값 기반 경보
이것들은 가장 간단하고 여전히 유용합니다.
예시:
- 지속적 임계값 이상의 CPU
- 한계 이상인 큐 깊이 (여기서 사체 큐 깊이 및 메시지 나이 참조)
- 임계값 이상의 오류율
다음과 같은 경우에 가장 잘 작동합니다:
- 신호가 안정적임
- 임계값이 의미 있음
- 팀이 정상 범위를 이해함
다음과 같은 경우에 잘 작동하지 않습니다:
- 기준선이 매우 변동성이 큼
- 지표가 영향도와 약하게만 연결됨
속도 기반 경보
이것들은 절대값보다 시간 경과에 따른 변화에 중점을 둡니다.
예시:
- 10분 동안 오류율이 급증함
- 백로그 성장이 정상 추세를 초과함
동적 시스템에서는 정적 임계값보다 종종 더 좋습니다.
증상 기반 경보
이것들은 사용자가 경험하는 것에 중점을 둡니다.
예시:
- 엣지(Edge)에서 증가된 요청 지연 시간
- 결제 실패 증가
- 로그인 성공률 하락
이 스타일은 실제 서비스 건강 상태와 일치하므로 더 강건한 경향이 있습니다.
SLO 기반 경보
SLO 기반 경보는 잡음을 줄이는 가장 실용적인 방법 중 하나입니다. 나쁜 분마다 경보하는 대신, 오류 예산 소모와 지속적인 사용자 영향도에 초점을 맞춥니다. 임계값보다 설계하기 어렵지만 일반적으로 현실과 더 일치합니다.
소신 있는 견해: 많은 팀이 안정적인 서비스 소유권이나 기본 라우팅 규율을 갖추기 전에 SLO 경보로 바로 점프하려고 합니다. 그 순서는 보통 실망으로 끝납니다. 유행하는 수학보다 강력한 기본기가 승리합니다.
라우팅은 경보가 현실이 되는 곳입니다
라우팅은 구현 세부 사항이 아닙니다. 그것은 운영 경보의 중심입니다.
Prometheus Alertmanager는 이를 명시적으로 만듭니다. 이메일, PagerDuty, OpsGenie 및 채팅 플랫폼과 같은 수신자에게 알림을 전달하기 전에 그룹화, 중복 제거, 라우팅, 정적(침묵), 억제를 처리합니다. 이는 정확히 올바른 분할입니다. 라우팅 없는 감지는 원시 신호입니다. 라우팅은 신호를 응답으로 전환합니다.
실용적인 라우팅 모델은 다음을 기반으로 할 수 있습니다:
- 심각도
- 서비스 소유권
- 환경
- 시간대
- 유지보수 창
- 사고 상태
- 폭발 반경
그룹화(Grouping)
그룹화는 유사한 경보를 더 적은 수의 알림으로 결합합니다. 이는 하나의 근본 문제로 수백 가지 증상이 발생하는 캐스케이드 실패 동안 중요합니다.
그룹화는 세부 정보를 숨기는 것이 아닙니다. 그것은 인간의 주의력을 보호하는 것입니다.
억제(Inhibition)
억제는 더 높은 수준의 근본 원인이 이미 활성화되어 있을 때 2차 경보를 억제합니다.
전체 클러스터에 접근할 수 없는 경우, 응답자는 간접적으로 모두 같은 말을 하는 서비스별 알림의 홍수를 필요로 하지 않습니다.
정적/침묵(Silences)
정적(침묵)은 명확한 범위와 시간 경계가 있는 임시 음소거입니다. 이는 유지보수, 마이그레이션 및 알려진 사고 동안 유용합니다.
정적은 수정이 아닙니다. 그것은 임시 운영 제어입니다.
올바른 경보 채널 선택
채널은 응답 형태와 일치해야 합니다.
페이지 시스템
페이지는 긴급 대응용입니다. 경보가 누군가를 깨워야 한다면, 채팅방에서 시작해서는 안 됩니다.
채팅 플랫폼
채팅은 협업, 1차 분류 및 인간 참여 워크플로우에 강력합니다. 이는 경보 및 워크플로우를 위한 Slack 통합 패턴 및 경보 및 제어 루프를 위한 Discord 통합 패턴이 단순한 메시지 싱크가 아닌 유용한 시스템 인터페이스가 되는 곳입니다.
다음과 같은 경우 채팅을 사용하십시오:
- 팀이 공유 컨텍스트가 필요할 때
- 대응이 협업적인 경우
- 버튼, 명령 또는 반응이 제어된 동작을 트리거할 수 있을 때
- 긴급도가 높지만 반드시 페이지를 호출할 정도는 아닐 때
이메일
이메일은 본질적으로 긴급도가 낮습니다. 요약, 추세 및 후속 조치에 적합합니다. 사고 대응에는 약합니다.
대시보드
대시보드는 탐색용이며 방해용이 아닙니다.它们是 경보를 보완합니다. 대체하지 않습니다.
인간 참여 경보(Human in the loop alerting)
좋은 경보는 항상 확인으로 끝나는 것이 아닙니다. 때로는 워크플로우를 시작하기도 합니다.
그것이 채팅 플랫폼이 흥미로워지는 지점입니다. 경보는 컨텍스트와 상호작용 표면과 함께 Slack 또는 Discord에 진입할 수 있습니다. 인간은 확인, 승인, 억제, escalated 또는 안전한 동작을 트리거할 수 있습니다. 이는 경보를 브로드캐스트에서 제어된 상호작용으로 전환합니다.
이 패턴은 관측 가능성과 통합 패턴의 교차점에 속합니다:
- 관측 가능성은 무엇들을 표출할 가치가 있는지 결정합니다
- 통합 패턴은 도구들을 통해 인간이 어떻게 응답하는지 결정합니다
따라서 이 페이지는 채팅 플랫폼 문서들을 흡수하기보다는 외부 링크로 연결해야 합니다.
경보 메시지에 포함되어야 할 것
놀라울 만큼 많은 수의 경보 문제가 메시지 설계 문제입니다.
유용한 경보 메시지에는 보통 다음이 포함됩니다:
- 짧은 문제 진술
- 서비스 및 환경
- 심각도
- 증상 및 값
- 사용자 또는 시스템 영향
- 첫 번째 조사 단계
- 실행 파일 또는 대시보드 링크
약한 경보는 다음과 같이 말합니다:
high latency detected
더 강력한 경보는 다음과 같이 말합니다:
checkout latency p95 above 1.8s for 15m in prod-eu
impact: user checkout is degraded
next step: inspect upstream payment dependency and error budget panel
runbook: [[siteurl]]/runbooks/checkout-latency
그 차이는 미적인 것이 아닙니다. 그것은 운영적입니다.
반복되는 안티 패턴(Anti patterns)
측정 가능한 모든 것에 경보하기
이것은 잡음으로 가는 가장 빠른 경로입니다. 관측 가능성은广度(Breadth)에서 번성합니다. 경보는 그렇지 않습니다.
하나의 채널에 긴급도 수준 혼합하기
Critical 페이지, 정보성 경보, 사소한 대화가 같은 경로를 공유하면 응답자는 잘못된 습관을 배우게 됩니다.
라벨 또는 라우팅에 소유권 없음
경보는 인간에게 도달하지만, 올바른 인간에게는 도달하지 않습니다.
중복 제거 또는 그룹화 없음
동일한 사고가 수십 통의 알림을 생성합니다. 사람들은 시스템을 신뢰하는 것을 멈춥니다.
피드백 검토가 없는 경보
누구도 설계 루프를 닫지 않기 때문에 시스템은 동일한 나쁜 알림을 계속 보냅니다.
이해하려면 코드를 읽어야 하는 경보
온콜 담당자는 퍼즐이 아닌 다음 단계가 필요합니다.
실용적인 아키텍처 관점
최소적이지만 현실적인 모델:
metrics logs traces
|
v
detection rules
|
v
alert manager
- grouping
- deduplication
- inhibition
- silences
- routing
|
v
receivers and channels
- pager
- chat
- email
- workflow
|
v
human or automation
|
v
remediation and review
이 모델은 관심사 분리를 통해 확장 가능합니다. 또한 현대 경보 스택이 실제로 구축되는 방식과 일치합니다.
결론
경보는 모니터링의 부작용이 아닙니다. 그것은 관측 가능성 위에 구축된 응답 시스템입니다.
강력한 경보는 선택적이고, 라우팅되며, 컨텍스트가 있으며, 검토 가능합니다. 그것은 인간의 주의력을 범람시키지 않으면서 행동까지 걸리는 시간을 줄입니다. 그것은 그룹화, 억제, 정적(침묵) 및 올바른 채널 선택을 사용하여 신뢰를 보존합니다. 그리고 채팅 플랫폼을 전략의 대체제가 아닌 응답 인터페이스로 취급합니다.