공식 문서: https://prometheus.io/docs/alerting/latest/configuration/#route
Alertmanager 설정 파일에서 알람 반복 주기를 설정할 수 있다.
yaml 설정 파일에서 route 아래에 group_interval
, repeat_interval
이 알람 반복 주기 설정이며, group_by
, group_wait
을 통해 알람을 묶어서 보낼 수 있다.
각 설정은 어떤 역할을 하는지 알아보자.
group_by
Alertmanager에서 여러 알람을 특정 라벨 기준으로 group으로 묶어서 관리한다.
그 기준이 되는 것이 바로 group_by 설정이다.
아래와 같이 설정했다고 가정하자.
group_by: [app]
그렇다면 app=front
라벨을 가진 알람은 하나의 그룹으로 묶이고, app=back
라벨을 가진 알람은 다른 그룹으로 묶여 관리된다.
defualt 설정은 빈 리스트로, 따로 group을 구분하지 않는다.
개인적인 추측으로, prometheus에서 rule 파일을 작성할 때 groups
로 시작하는 것을 볼 수 있는데, 이를 하나의 기본 group으로 묶고 alertmanager에서 group_by
설정으로 기본 그룹에서 세분화하여 나누는 것으로 보인다.
prometheus.yml에 있는 rule 파일 내용 일부. groups로 시작하는 것을 볼 수 있다.
group_wait
알람이 발생하고, group 생성 후에 대기하는 시간이다.
예를 들어 app=front
라벨을 가진 알람 1개가 발생하였고, group_wait이 다음과 같다고 해보자.
group_by: [app]
group_wait: 1m
그렇다면 app=front
알람 그룹은 다른 알람이 발생하는지 1분동안 대기한다.
만약 1분 사이에 app=front
라벨을 가진 알람이 추가되었다면, 해당 그룹에 추가되어 같이 발송된다.
defualt 설정은 30s이다.
group_interval
알람 group에 상태 변화가 생기면 알람을 발송하는 주기이다.
상태변화는 다음 중 하나에 해당한다.
default 설정은 5m이다.
repeat_interval
알람 group에 상태 변화가 없을 때 알람을 발송하는 주기이다.
즉, 마지막 알람 시각으로 부터 알람 group에 상태변화가 있으면 gorup_interval
시간 후에 알람이 발송되고, 상태변화가 없으면 repeat_interval
시간 후에 알람이 발생된다.
예를 들어 group_interval = 10m
repeat_interval=20m
이라고 가정하자.
group_by: [app]
group_wait: 1m
group_interval: 10m
repeat_interval: 20m
그렇다면 app=front
라벨을 가진 알람 group 처음 발송되고, 10분동안 대기한다.
10분(group_interval
) 뒤에 해당 알람 group에 상태변화가 있는지 확인한다.
만약 추가된 알람이 있거나, 해소된 알람이 있는 등 group에 변화가 생겼다면 알람을 발송한다.
알람을 발송하고 다시 10분(group_interval
) 뒤에 group 상태변화가 있는지 확인한다.
만약 알람 group이 이전과 동일하다면 다시 10분(group_interval
)을 대기한다.
이 시점은 20분(repeat_interval
)이 지난 시점으로, 알람을 다시 발송시킨다.
default 설정은 4h이다.
위에서 예시로 내부 원리에 대해 짧게 설명했다.
자세하게 알아보자.
alertmanager에서는 알람 group을 group_interval
주기로 flush한다.
즉, 알람 group은 잠들어 있다가 group_interval
주기가 되면 깨어나서, 알람 group에 변화가 있는지 살펴본다.
만약 알람 group에 변화가 있다면 알람을 발송한다.
만약 알람 group에 변화가 없는데, 마지막 알람 전송 시간에서 repeat_interval
만큼 지났다면 알람을 발송시킨다.
위의 경우에 모두 해당되지 않는다면 알람 group은 다시 잠에 들고, group_interval
시간 후에 다시 깨어나 반복한다.
아래와 같이 alertmanager 설정을 하였다고 가정하자.
group_by: [app]
group_wait: 1m
group_interval: 5m
repeat_interval: 15m
알람이 처음 생기면 group_by 기준으로 그룹을 생성한다.
10:00 - 2개의 알람 발생
이후 group_wait 기간동안 알람을 대기한다.
10:01 - 첫 번째 알람 발생
app=front
그룹 첫 번째 알람 발송app=back
그룹 첫 번째 알람 발송10:06 - 첫 번째 알람 이후 group_interval(5m) 경과
app=front
그룹에서 하나의 알람 해소되어 두 번째 알람 발송app=back
그룹에서 상태 변화 없으며, repeat_interval 만큼 지나지 않아 대기10:11 - group_interval(5m) 경과
app=front
그룹에서 상태 변화 없으며 repeat_interval 만큼 지나지 않아 대기app=back
그룹에서 상태 변화 없으며 repeat_interval 만큼 지나지 않아 대기10:16 - group_interval(5m) 경과
app=front
그룹에서 상태 변화 없으며, repeat_interval 만큼 지나지 않아 대기app=back
그룹에서 상태 변화 없으나 repeat_interval 시간이 되어 알람 발송10:21
app=front
그룹에서 상태 변화 없으나, repeat_interval 시간이 되어 알람 발송💡 코드 살펴보기
https://github.com/prometheus/alertmanager
github에서 notify/notify.go 아래에
needsUpdate
함수에 위의 로직대로 코드가 구현되어 있는 것을 볼 수 있다.
실제 alertmanager를 사용하였을 때 설정한 repeat_interval
대로 오지 않는 것을 겪었다.
테스트를 통해 실제 알람이 어떻게 오는지 살펴보았다.
alertmanager 설정은 아래와 같으며, slack을 통해 알람을 수신하고 있다.
group_wait: 0s
group_interval: 4m
repeat_interval: 8m
내가 기대한 알람 주기는 8분마다 오는 것이다.
하지만 설정과 다르게 group_interval
+repeat_interval
주기인 12분마다 오는 것을 볼 수 있었다.
나의 경우
group_interval
이repeat_interval
의 배수라서 둘이 더한 주기만큼 알람이 수신됐다.
만약 배수가 아니라면 group_interval의 배수만큼 올 것으로 보인다.
e.g.group_interval
과repeat_interval
이 각 3분, 9분이라면 예상 알람 주기는 12분일 것
아래 그림은 log 내용기반으로 그린 알람 발송 시간이며, 알람 로그 전문은 그림 아래에 첨부하였다.
코드 분석 + 구글링을 통해 열심히 알아보았지만 명확한 원인을 찾을 수 없었다.
하지만 해당 이슈에 대해 검색하였을 때 생각보다 많은 사람들이 겪은 문제이며, 내부적으로 수정해야 하지 않을까 조심스럽게 추측해본다.
해당 글에서 틀린 의견이 있다면 피드백 부탁드리겠습니다.
해당 이슈 관련하여 찾은 자료
참고 자료