[Alertmanager] 알람 주기 설정하기 - repeat_interval, group_interval

괭이밥·2025년 2월 2일
0

Monitoring

목록 보기
3/3

📌 Alertmanager에서 interval

공식 문서: 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에 상태 변화가 생기면 알람을 발송하는 주기이다.

상태변화는 다음 중 하나에 해당한다.

  • 알람 group에 새로운 알람 추가
  • 알람 group에 resolved된 알람 발생 (=해소 알람)

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 알람 반복 내부 원리

위에서 예시로 내부 원리에 대해 짧게 설명했다.

자세하게 알아보자.

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개의 알람 발생

  • app=front 알람 발생 → 그룹 생성
  • app=back 알람 발생 → 다른 그룹 생성

이후 group_wait 기간동안 알람을 대기한다.

10:01 - 첫 번째 알람 발생

  • app=front 그룹 첫 번째 알람 발송
    • 1분 사이에 추가된 알람이 있어, 2개 알람 한번에 발송
  • 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 만큼 지나지 않아 대기
    • 마지막 알람 - 10:11
  • app=back 그룹에서 상태 변화 없으나 repeat_interval 시간이 되어 알람 발송
    • 마지막 알람이 10:01으로, repeat_interval인 15m이 경과하였음

10:21

  • app=front 그룹에서 상태 변화 없으나, repeat_interval 시간이 되어 알람 발송
    • 마지막 알람 - 10:11

💡 코드 살펴보기

https://github.com/prometheus/alertmanager

github에서 notify/notify.go 아래에 needsUpdate 함수에 위의 로직대로 코드가 구현되어 있는 것을 볼 수 있다.



🧐의문점) 왜 실제 알람은 두 번째repeat_interval때 올까?

실제 alertmanager를 사용하였을 때 설정한 repeat_interval 대로 오지 않는 것을 겪었다.

테스트를 통해 실제 알람이 어떻게 오는지 살펴보았다.

alertmanager 설정은 아래와 같으며, slack을 통해 알람을 수신하고 있다.

group_wait: 0s
group_interval: 4m
repeat_interval: 8m

내가 기대한 알람 주기는 8분마다 오는 것이다.

하지만 설정과 다르게 group_interval+repeat_interval 주기인 12분마다 오는 것을 볼 수 있었다.

나의 경우 group_intervalrepeat_interval의 배수라서 둘이 더한 주기만큼 알람이 수신됐다.
만약 배수가 아니라면 group_interval의 배수만큼 올 것으로 보인다.
e.g. group_intervalrepeat_interval이 각 3분, 9분이라면 예상 알람 주기는 12분일 것

아래 그림은 log 내용기반으로 그린 알람 발송 시간이며, 알람 로그 전문은 그림 아래에 첨부하였다.

코드 분석 + 구글링을 통해 열심히 알아보았지만 명확한 원인을 찾을 수 없었다.
하지만 해당 이슈에 대해 검색하였을 때 생각보다 많은 사람들이 겪은 문제이며, 내부적으로 수정해야 하지 않을까 조심스럽게 추측해본다.

해당 글에서 틀린 의견이 있다면 피드백 부탁드리겠습니다.



해당 이슈 관련하여 찾은 자료


참고 자료

profile
개발도 하고 싶은 클라우드 엔지니어

0개의 댓글