현대 IT 환경에서 시스템의 성능과 상태를 실시간으로 모니터링하는 것은 매우 중요합니다. 그러나 문제 발생 시, 그 상황을 빠르게 파악하고 대응하는 것이 더욱 중요합니다.
Grafana는 이러한 상황을 대비해 다양한 알림 기능을 제공하며, 그 중에서도 Slack과의 연동을 통해 알림을 실시간으로 팀에 공유할 수 있습니다.
서론
본 글에서는 이전 포스팅과 동일하게 Spring boot, Prometheus, Grafana를 사용합니다.
Spring-boot에서 Prometheus Exporter를 통해서 Prometheus 서버로 로그를 전송하고,
Prometheus가 수집하고 있는 로그를 Grafana가 다시 로그를 수집해서 대시보드로 보여주게 만들었었습니다.
Slcak 앱 생성
1. 새로운 앱 생성
https://api.slack.com/apps에 접속하고, 먼저 Your Apps를 들어가서 Create an App을 클릭하여 앱을 만들어줍니다.
2. Slcak 워크스페이스 지정
From Scratch 옵션을 선택하고 앱의 이름과 Slack 워크스페이스를 지정합니다.
3. Slack 앱 특정 권한 부여
왼쪽 메뉴에서 OAuth & Permissions를 클릭한 후, Scope > Bot Token Scopes 섹션에서 Add an OAuth Scope 버튼을 클릭합니다. 여기에서 chat:write 스코프를 선택하여 추가합니다.
- chat:write: 스코프는 Slack 채널에 메시지를 전송할 수 있는 권한을 부여합니다.
4. Slack 워크스페이스에 bot설치
그리고 OAuth Tokens for Your Workspace 섹션에서 Install to Workspace 버튼을 클릭하여 Bot을 워크스페이스에 설치해줍니다
5. Incoming Webhooks 설정하기
이 작업은 Slack에서 Incoming Webhooks 기능을 활성화하고, 특정 채널에 메시지를 전송할 수 있도록 Webhook URL을 생성하는 단계입니다.
Webhook을 통해 Grafana가 지정된 Slack 채널로 알림이나 메시지를 자동으로 전송할 수 있게 됩니다.
그리고 만들어진 Webhook URL을 COPY해줍니다.
6. Slack에 bot추가
생성한 앱을 #grafana 채널에 Webhook을 설정해놨으니깐, 추가를 해줍니다.
Grafana 알림 설정
다음으로, Grafana에서 Slack과 연동하기 위한 알림 채널을 설정합니다.
1. Contact Point를 Slack으로 변경
Grafana에서 알림 전송 채널을 설정하려면, 사이드 메뉴에서 Alerting > Contact points로 이동한 후, Add contact point 버튼을 클릭합니다.
기본적으로 Grafana의 알림 전송 설정은 이메일로 되어 있습니다. 따라서, 이메일 대신 Slack으로 전송되도록 변경해줘야 합니다. 이를 위해, 왼쪽 메뉴에서 Home > Alerting > Contact points로 들어가서 이메일 전송을 Slack으로 변경합니다.
2. Contact points 설정
[Add contact point] 버튼을 클릭한 후, 이전에 설정한 Webhook URL을 입력합니다.
테스트를 수행하여 Slack에서 Grafana 봇이 테스트 알림을 전송하는지 확인해봅니다. 정상적으로 알림이 전송되면 [Save] 버튼을 클릭하여 Contact point를 저장합니다.
이제 Grafana에서 설정한 Slack 채널로 알림을 성공적으로 전송할 수 있는 상태가 확인되었습니다.
3. Notification policies
Alerting > Notification policies 로 들어갑니다.
그 후 Default policy의 edit 버튼을 클릭합니다. 이후 나온 Edit창에서 Default contact point 를 이전에 생성한 contact point로 업데이트 해줍니다.
Grafana 대시보드에서 알림 규칙 설정
애플리케이션이 종료되면 알람이 오도록 해보겠습니다.
Home > Alerting > Alert rules로 들어가서 [New alert rule]을 클릭하여 새로운 알람 룰을 생성해줍니다.
[Define query and alert condition]에서 메트릭을 "Up"으로 설정하고, Label filter를 job과 spring-boot로 지정합니다.
이렇게 설정하면 최종 쿼리는 up{job="spring-boot"}가 됩니다. 이 쿼리는 "Up 상태이며, spring-boot라는 job에 해당되는 메트릭을 체크하겠다"는 의미입니다.
아래의 [Expressions]에서 Threshold를 설정해야 합니다.
앞서 설정한 쿼리의 Input이 A였으므로, 이 필드에도 A로 설정합니다. 알림의 목표는 애플리케이션이 종료되었을 때 알림을 보내는 것이므로, 실행 중이거나 종료된 두 가지 경우를 고려해야 합니다.
즉, 메트릭 값이 true (1)일 때와 false (0)일 때를 구분합니다. 따라서, 값이 1 이하일 때 알림을 보내도록 설정합니다.
이렇게 설정하면 Grafana는 애플리케이션의 로그를 모니터링하면서 값이 0으로 변하면 애플리케이션이 종료된 것으로 간주하고 알림을 전송합니다.
Folder 및 Evaluation group을 선택또는 새로 생성합니다.
pending period, Evaluation internal 은 빠른 확인을 위해 30s으로 설정합니다.
Configure labels and notifications 메뉴에서 생성한 Slack 알림을 선택한 후, 모든 설정을 완료합니다. 이렇게 하면 설정한 조건에 따라 알림이 Slack 채널로 정상적으로 전송됩니다.
Grafana 알림 확인하기
현재 애플리케이션이 실행 중이기때문에 State가 Normal로 정상입니다. 애플리케이션을 정지시켜보겠습니다.
애플리케이션을 정지하면 Grafana의 상태가 Pending에서 Firing으로 변경됩니다. 이 상태는 애플리케이션이 비정상적인 상태임을 나타냅니다.
이와 함께, Slack 채널에서도 애플리케이션이 종료되었다는 알림이 전송됩니다.
애플리케이션을 다시 실행하면 Grafana에서 상태가 다시 Normal로 변경되어 정상적으로 동작하고 있음을 확인할 수 있습니다.
'Monitoring' 카테고리의 다른 글
[Grafana] Grafana Loki란 무엇일까❓개념부터 로그 확인까지 (0) | 2024.08.19 |
---|---|
[Grafana] Prometheus와 Grafana로 데이터 시각화하기: Docker 환경에서의 설정 및 대시보드 작성 (0) | 2024.08.19 |
[Prometheus] Prometheus란 무엇일까❓(Spring Boot 애플리케이션의 메트릭 모니터링) (0) | 2024.08.19 |