[Grafana] 특정 파드 지속 장애 시 Slack Alert 제작
메트릭을 관측하고 얻는 자료들은 비즈니스 적으로 많은 가치가 있으나, 실시간으로 발생하는 특정 이벤트에 대한 대처(서버 다운 등)를 하기 위하여 수집되는 모든 데이터들을 24시간 동안 지켜본다는 것은 비현실적이고 불필요한 일이다.
그렇기 때문에 수집을 통하여 얻은 데이터가 특정 조건을 충족하면 이벤트가 발생했다는 알람을 만드는 것이 가장 효율적이라고 볼 수 있다.
Prometheus / Grafana Stack에서는 Alertmanager 또는 Grafana에서 알람을 만들어서 협업 툴을 통하여 받을 수 있는데, 이번 글은 특정 알람을 설정하고, 이를 Slack에서 받는 방법에 대하여 알아볼 것이다.
1. Slack Webhook
Slack은 협업 툴로 많이 사용되고 다양한 오픈 소스들과 통합하기도 쉽다.
이에 많이 사용되는게 Webhook이고, 웹훅을 생성하여 특정 채널이나 DM에 특정 정보를 보낼 수 있다.
웹훅 설정을 위한 과정은 아래와 같다.
https://velog.io/@king/slack-incoming-webhook
[아래 내용은 앱 추가 방식으로 되어 있기 때문에 위 블로그의 앱 생성 방식을 추천 / 웹훅은 동일하게 사용 가능]
Slack 좌측 하단의 [앱 추가]로 들어간다.
"Webhook"을 검색하여 Incoming Webhooks에서 [추가] 버튼을 누른다.
새로운 브라우저에서 슬랙 화면이 나오고 아래 [Slack에 추가] 버튼을 누른다.
특정 채널을 선택한다.
(또는 알람으로 받을 채널을 생성 후 선택)
채널 선택 후 [수신 웹후크 통합 앱 추가]를 누른다.
생성된 웹훅 창에서 아래의 웹후크 URL을 복사 후 사용한다.
이제 Slack의 웹훅을 생성했으니, Grafana에서 알람을 생성하고 웹훅을 등록해 주는 과정을 알아볼 것이다.
2. Grafana Alert
그라파나에서는 좌측 목록에 Alerting이라는 경보 창이 따로 존재한다.
목록 내 아래 세 부분에서 내용을 추가해 줄 것이다.
- Alert rules: 경보 룰 지정
- Contact points: 경보를 보낼 대상(Email / Slack 등) 및 메시지 형식 지정
- Notification policies: 경보 정책 지정
2-1. Contact points
Contact points는 특정 Alert가 발효되었을 때, 어떤 서비스에 어떤 형식의 메시지를 보낼 것인지 정의하는 부분이다.
여기서 Slack의 Webhook을 추가해주기 위해 [Add contact point]을 눌러 아래와 같이 내용을 채워 준다.
Integration은 Slack을 이용하기에 [Slack]을 선택하고 이전 과정에서 얻은 웹훅 URL을 넣고 우측 상단의 Test를 누르면 슬랙에 메시지가 간 것을 볼 수 있다.
추가로 아래 템플릿을 미리 선언하기 위하여 [Optional Slack settings]에서 다음과 같이 Text Body 부분을 수정한다.
다음으로 할 것은 위 Text Body에서 설정한 Slack에 보내줄 메시지의 템플릿 형식을 만드는 것이다.
그라파나에서는 Go Template라는 형식으로 메시지 템플릿을 작성하고 아래 레퍼런스에서 자세한 정보를 볼 수 있다.
필자는 아래와 같이 "pod-down-template"라는 이름으로 템플릿을 작성했다.
{{ define "pod-down-template" }}
{{ if .Alerts.Firing -}}
⛈️ 경보
{{- range .Alerts }}
• 제목: {{ index .Annotations "summary" }}
• 파드: {{ index .Labels "pod" }}
{{- end }}
{{ end }}
{{ if .Alerts.Resolved -}}
🌞 해소
{{- range .Alerts }}
• 제목: {{ index .Annotations "summary" }}
• 파드: {{ index .Labels "pod" }}
{{- end }}
{{ end }}
{{ end }}
우측 테스트 데이터를 수정하고 Preview를 보게 된다면, 다음 사진처럼 알람이 온다는 예시를 볼 수 있다.
2-2. Notification Policies
Notification Policies는 특정 라벨을 가진 규칙(Rule)의 내용을 어떤 Contact point에 메시지를 보낼 것인지 결합하는 정책이다.
우측의 [New nested policy]로 새로운 정책을 생성할 수 있다.
2-1에서 만든 Slack-alert를 선택하고, 라벨은 아래와 같이 간략하게 생성했다.
2-3. Alert rules
Alert rules는 경보의 규칙에 대한 정의를 하는 부분이다.
어떠한 상황(ex. 파드 장애나 노드 과부하 등)이 되었을 때 알람이 울릴 것인지 데이터 소스와 쿼리(PromQL)를 통하여 상황을 정의한다.
처음 접속하면 Grafana에는 알람이 존재하지 않고, [New alert rule]을 통하여 새로운 알람을 만들 수 있다.
쿼리를 질의하였을 때, 이름에 test가 포함된 파드의 상태가 준비가 되지 않는 경우 경보가 울리도록 규칙을 pod-down이라는 이름으로 정의했다.
Folder와 Evalutation group이 초기에는 없기 때문에 새로 생성해주어야 하고, Evalutation group의 Rule에 대한 Interval과 하위 Pending period를 활용하여 경보를 체크하는 기간과 발효되는 시점을 조절할 수 있다.
Summary와 Description은 경보 내 Templates에서 활용할 수 있는 정보를 기입하면 된다.
간단하게 요약 정보만 넣어주었다.
마지막으로는 Notification Policy에서 정의한 라벨을 정의해 준다.
확인
# bash
kubectl run alert-test --image=busybox:latest
alert-test라는 이름으로 busybox의 이미지를 구동하는 파드를 생성한다.
※ busybox는 실행하고 바로 종료가 되는 이미지라서 CrashLoopBackOff 상태가 된다.
그리고 특정 시간이 지나면 아래와 같이 Grafana에서 Slack으로 보낸 Alert를 볼 수 있다.
해당 파드를 삭제하면 정상 상태로 돌아온 Alert도 함께 볼 수 있다.