Amazon Managed Service for Prometheus Alert Manager
소개
Amazon Managed Service for Prometheus(AMP)는 'Recording rules'와 'Alerting rules' 두 가지 유형의 규칙을 지원하며, 기존 Prometheus 서버에서 가져올 수 있고 정기적인 간격으로 평가됩니다.
Alerting rules를 사용하면 PromQL과 임계값을 기반으로 알림 조건을 정의할 수 있습니다. 알림 규칙의 값이 임계값을 초과하면 Amazon Managed Service for Prometheus의 Alert Manager로 알림이 전송되며, 이는 독립형 Prometheus의 Alert Manager와 유사한 기능을 제공합니다. 알림은 Prometheus에서 알림 규칙이 활성 상태일 때 발생하는 결과입니다.
알림 규칙 파일
Amazon Managed Service for Prometheus의 알림 규칙은 YAML 형식의 규칙 파일로 정의되며, 독립형 Prometheus의 규칙 파일과 동일한 형식을 따릅니다. 하나의 Amazon Managed Service for Prometheus 워크스페이스에 여러 규칙 파일을 보유할 수 있습니다. 워크스페이스는 Prometheus 메트릭의 저장 및 쿼리를 위한 논리적 공간입니다.
규칙 파일은 일반적으로 다음과 같은 필드를 포함합니다:
groups:
- name:
rules:
- alert:
expr:
for:
labels:
annotations:
Groups: 일정한 간격으로 순차적으로 실행되는 규칙의 모음
Name: 그룹의 이름
Rules: 그룹 내의 규칙들
Alert: 알림의 이름
Expr: 알림을 트리거하기 위한 표현식
For: 알림의 표현식이 임계값을 초과한 후 발생(firing) 상태로 전환되기까지의 최소 지속 시간
Labels: 알림에 첨부되는 추가 레이블
Annotations: 설명이나 링크 등의 상황별 세부 정보
다음은 규칙 파일의 예시입니다.
groups:
- name: test
rules:
- record: metric:recording_rule
expr: avg(rate(container_cpu_usage_seconds_total[5m]))
- name: alert-test
rules:
- alert: metric:alerting_rule
expr: avg(rate(container_cpu_usage_seconds_total[5m])) > 0
for: 2m
Alert Manager 구성 파일
Amazon Managed Service for Prometheus Alert Manager는 YAML 형식의 구성 파일을 사용하여 수신 서비스에 대한 알림을 설정하며, 이는 독립형 Prometheus의 Alert Manager 구성 파일과 동일한 구조를 가집니다. 구성 파일은 Alert Manager와 템플릿 작성을 위한 두 가지 핵심 섹션으로 구성됩니다.
-
template_files는 알림의 annotations와 labels 템플릿을 포함하며, 편의를 위해
$value,$labels,$externalLabels,$externalURL변수로 노출됩니다.$labels변수는 알림 인스턴스의 레이블 키/값 쌍을 담고 있습니다. 전역으로 구성된 외부 레이블은$externalLabels변수를 통해 접근할 수 있습니다.$value변수는 알림 인스턴스의 평가된 값을 담고 있습니다..Value,.Labels,.ExternalLabels,.ExternalURL은 각각 알림 값, 알림 레이블, 전역으로 구성된 외부 레이블, 외부 URL(--web.external-url로 구성)을 포함합니다. -
alertmanager_config는 독립형 Prometheus의 Alert Manager 구성 파일과 동일한 구조를 사용하는 Alert Manager 구성을 포함합니다.
다음은 template_files와 alertmanager_config를 모두 포함하는 Alert Manager 구성 파일의 예시입니다.
template_files:
default_template: |
{{ define "sns.default.subject" }}[{{ .Status | toUpper }}{{ if eq .Status "firing" }}:{{ .Alerts.Firing | len }}{{ end }}]{{ end }}
{{ define "__alertmanager" }}AlertManager{{ end }}
{{ define "__alertmanagerURL" }}{{ .ExternalURL }}/#/alerts?receiver={{ .Receiver | urlquery }}{{ end }}
alertmanager_config: |
global:
templates:
- 'default_template'
route:
receiver: default
receivers:
- name: 'default'
sns_configs:
- topic_arn: arn:aws:sns:us-east-2:accountid:My-Topic
sigv4:
region: us-east-2
attributes:
key: severity
value: SEV2
알림의 핵심 요소
Amazon Managed Service for Prometheus Alert Manager 구성 파일을 생성할 때 알아야 할 세 가지 중요한 측면이 있습니다.
- Grouping: 유사한 알림을 하나의 알림으로 묶어주는 기능으로, 장애나 서비스 중단의 영향 범위가 넓어 여러 시스템에 영향을 미치고 다수의 알림이 동시에 발생할 때 유용합니다. 또한 카테고리별로 그룹화하는 데에도 사용할 수 있습니다(예: 노드 알림, 파드 알림). Alert Manager 구성 파일의 route 블록을 사용하여 이 그룹화를 구성할 수 있습니다.
- Inhibition: 이미 활성화되어 발생 중인 유사한 알림의 스팸을 방지하기 위해 특정 알림을 억제하는 방법입니다. inhibit_rules 블록을 사용하여 억제 규칙을 작성할 수 있습니다.
- Silencing: 유지보수 기간이나 계획된 서비스 중단 등 특정 기간 동안 알림을 음소거할 수 있습니다. 수신되는 알림은 음소거하기 전에 모든 일치 조건이나 정규 표현식과 대조하여 검증됩니다. PutAlertManagerSilences API를 사용하여 음소거를 생성할 수 있습니다.
Amazon Simple Notification Service (SNS)를 통한 알림 라우팅
현재 Amazon Managed Service for Prometheus Alert Manager는 Amazon SNS만을 수신자로 지원합니다. alertmanager_config 블록의 핵심 섹션은 receivers이며, 이를 통해 Amazon SNS가 알림 을 수신하도록 구성할 수 있습니다. 다음 섹션을 receivers 블록의 템플릿으로 사용할 수 있습니다.
- name: name_of_receiver
sns_configs:
- sigv4:
region: <AWS_Region>
topic_arn: <ARN_of_SNS_topic>
subject: somesubject
attributes:
key: <somekey>
value: <somevalue>
Amazon SNS 구성은 명시적으로 재정의하지 않는 한 다음 템플릿을 기본값으로 사용합니다.
{{ define "sns.default.message" }}{{ .CommonAnnotations.SortedPairs.Values | join " " }}
{{ if gt (len .Alerts.Firing) 0 -}}
Alerts Firing:
{{ template "__text_alert_list" .Alerts.Firing }}
{{- end }}
{{ if gt (len .Alerts.Resolved) 0 -}}
Alerts Resolved:
{{ template "__text_alert_list" .Alerts.Resolved }}
{{- end }}
{{- end }}
추가 참고 자료: Notification Template Examples
Amazon SNS 이외의 다른 대상으로 알림 라우팅
Amazon Managed Service for Prometheus Alert Manager는 Amazon SNS를 통해 다른 대상인 이메일, 웹훅(HTTP), Slack, PagerDuty, OpsGenie 등에 연결할 수 있습니다.
- Email 알림이 성공적으로 전송되면 Amazon SNS 토픽의 대상 중 하나로서 Amazon Managed Service for Prometheus Alert Manager를 통해 알림 세부 정보가 포함된 이메일을 수신하게 됩니다.
- Amazon Managed Service for Prometheus Alert Manager는 JSON 형식으로 알림을 전송할 수 있어, Amazon SNS 이후 AWS Lambda 또는 웹훅 수신 엔드포인트에서 후속 처리를 할 수 있습니다.
- Webhook 기존 Amazon SNS 토픽을 웹훅 엔드포인트로 메 시지를 출력하도록 구성할 수 있습니다. 웹훅은 이벤트 기반 트리거에 의해 애플리케이션 간에 HTTP를 통해 교환되는 직렬화된 폼 인코딩 JSON 또는 XML 형식의 메시지입니다. 이를 통해 기존의 SIEM 또는 협업 도구를 연결하여 알림, 티켓팅 또는 인시던트 관리 시스템으로 활용할 수 있습니다.
- Slack Slack의 이메일-채널 통합 기능을 사용하여 Slack이 이메일을 수신하고 이를 Slack 채널로 전달하도록 하거나, Lambda 함수를 사용하여 SNS 알림을 Slack 형식으로 변환할 수 있습니다.
- PagerDuty
alertmanager_config정의의template_files블록에서 사용하는 템플릿을 커스터마이즈하여 Amazon SNS의 대상인 PagerDuty로 페이로드를 전송할 수 있습니다.
추가 참고 자료: Custom Alert manager Templates
알림 상태
알림 규칙은 표현식을 기반으로 알림 조건을 정의하며, 설정된 임계값이 초과될 때마다 알림 서비스로 알림을 전송합니다. 다음은 규칙과 표현식의 예시입니다.
rules:
- alert: metric:alerting_rule
expr: avg(rate(container_cpu_usage_seconds_total[5m])) > 0
for: 2m
알림 표현식의 결과로 특정 시점에 하나 이상의 벡터 요소가 반환되면 해당 알림은 활성 상태로 간주됩니다. 알림은 활성(pending | firing) 또는 해결됨(resolved) 상태를 가집니다.
- Pending: 임계값 위반 이후 경과된 시간이 기록 간격보다 짧은 상태
- Firing: 임계값 위반 이후 경과된 시간이 기록 간격보다 길어 Alert Manager가 알림을 라우팅하고 있는 상태
- Resolved: 임계값이 더 이상 위반되지 않아 알림이 더 이상 발생하지 않는 상태
이는 awscurl 명령어를 사용하여 ListAlerts API로 Amazon Managed Service for Prometheus Alert Manager 엔드포인트를 쿼리하여 수동으로 확인할 수 있습니다. 다음은 요청 예시입니다.
awscurl https://aps-workspaces.us-east-1.amazonaws.com/workspaces/$WORKSPACE_ID/alertmanager/api/v2/alerts --service="aps" -H "Content-Type: application/json"
Amazon Managed Grafana에서의 Amazon Managed Service for Prometheus Alert Manager 규칙
Amazon Managed Grafana(AMG)의 알림 기능을 통해 Amazon Managed Grafana 워크스페이스에서 Amazon Managed Service for Prometheus Alert Manager 알림을 시각화할 수 있습니다. Amazon Managed Service for Prometheus 워크스페이스를 사용하여 Prometheus 메트릭을 수집하는 고객은 서비스의 완전 관리형 Alert Manager 및 Ruler 기능을 활용하여 알림 및 기록 규칙을 구성합니다. 이 기능을 통해 Amazon Managed Service for Prometheus 워크스페이스에 구성된 모든 알림 및 기록 규칙을 시각화할 수 있습니다. Prometheus 알림 보기는 Amazon Managed Grafana(AMG) 콘솔의 Workspace 구성 옵션 탭에서 Grafana alerting 체크박스를 선택하여 활성화할 수 있습니다. 활성화하면 이전에 Grafana 대시보드에서 생성한 네이티브 Grafana 알림도 Grafana 워크스페이스의 새로운 Alerting 페이지로 마이그레이션됩니다.
참고 자료: Announcing Prometheus Alert manager rules in Amazon Managed Grafana
