기타/관리

Prometheus 를 사용하고 AlertManager 를 통해 서버 부하 알림 전송 해보기

펭귄힝 2024. 7. 6. 17:53

 

이번 게시물에서는 서버 모니터링 도구인 Prometheus 를 사용하고, 서버에 부하가 발생되면 AlertManager 를 통해 Slack 으로 알림을 전송해보도록 하겠다.

 

 

 

 

 

1. 애플리케이션 설정

 

 

먼저 애플리케이션에 위와 같이 의존성을 추가해준다. Micrometer 에서 제공하는 Metric 정보를 Prometheus 가 읽을 수 있도록 변경해주는 역할을 하게 해준다.

 

 

 

 

 

 

yml 파일에서 Spring Actuator 의 EndPoint 를 설정해준다.

 

 

 

 

 

 

설정을 마치고 애플리케이션을 구동한 후 /actuator/prometheus 경로에 접속해보면 Micrometer에서 제공해주는 metric 정보들을 Prometheus 가 읽을 수 있도록 변환한 것을 확인할 수 있다.

 

 

 

 

 

2. AlertManager 설정 및 구동

 

 

별도의 alertmanager.yml 파일을 만들고 위와 같이 작성해준다. 여기서 slack_api_url 부분에는 Slack App 의 WebHook 주소 값을 넣어 주어야 한다. (Slack App 을 만들고 WebHook 을 발급하는 과정은 생략한다.)

 

설정 정보를 보면 처음 알림이 가고나서 30분이 지난 후에 다시 알림을 전송하도록 한 것을 확인할 수 있다.

 

이 yml 파일이 바로 우리가 구동시킬 AlertManager 의 설정 파일이 된다.

 

 

 

 

 

 

이제 위 커맨드를 입력하여 Docker Image 를 배포해준다. 이때, 우리가 만든 alertmanager.yml 파일을 볼륨 마운트를 통하여 전달하는 것을 볼 수 있다.

 

 

 

 

 

 

실제 서버의 9093번 포트로 접속해보면 AlertManager 의 UI 를 확인해볼 수 있다.

 

 

 

 

 

3. Prometheus 설정 및 구동

 

 

prometheus.yml 파일을 만들고 위와 같이 작성해주었다. (설정에 대한 자세한 내용은 생략)

 

 

 

 

 

 

first_rules.yml 파일을 만들어서 알림을 보낼 규칙을 설정해준다. 여기서는 정보를 받고 있는 서비스 중에서 하나라도 DOWN 상태가 되면 알림을 보내도록 규칙을 정의해놓았다.

 

(first_rules.yml 파일과 prometheus.yml 파일을 같은 경로에 두어야 한다.)

 

 

 

 

 

 

이제 docker run 명령으로 이미지를 배포해준다. (똑같이 설정 정보를 볼륨 마운트한다.)

 

 

 

 

 

 

9090번 포트로 접속해보면 Prometheus 화면이 잘 나온다.

 

Status -> Rules 를 클릭하면

 

 

 

 

 

 

이렇게 우리가 추가한 룰이 잘 추가된 것을 볼 수 있다.

 

 

 

 

 

4. Prometheus 알림 기능 사용해보기

 

 

이제 up 이라는 쿼리를 보내면 연동된 서비스들이 1 값으로 잘 구동되어 있음을 확인할 수 있는데,

 

이때 서비스를 한 개 이상 닫게 된다면

 

 

 

 

 

이렇게 PENDING 상태가 되었다가 31초가 지나면

 

 

 

 

 

 

FIRING 상태가 되고

 

 

 

 

 

 

Alertmanager 서버에 알림이 도착하게 된다. 그리고 이 알림은 Slack의 WebHook 주소를 통해 Slack 채널로 전달된다.

 

 

 

 

 

 

Slack 을 확인해보면 위와 같이 알림이 잘 오고 있는 것을 볼 수 있다.

 

 

 

 

5. 특정 API 호출에 대해 알림 설정 해보기

 

위 과정들을 통해 서비스가 하나라도 다운되면 Slack 으로 알림이 전송되도록 해보았다. 그렇다면 우리가 만든 특정 API 의 실패 횟수가 많아질 때 알림을 전송하도록 하려면 어떻게 해야할까?

 

API 호출 횟수를 기록하는 커스텀 Metric 을 만들고 이것을 Prometheus 규칙에 추가해주면 된다.

 

 

 

 

 

 

@Counted 어노테이션을 통해 API 호출 시 value 에 해당하는 metric 을 생성하도록 만들어준다.

 

(어노테이션에 대한 설명은 Spring Actuator 에 대해 학습해보길 추천한다.)

 

 

 

 

 

 

@Counted 을 사용하기 위해 Aspect 를 빈으로 등록해준다.

 

 

 

 

 

 

이제 해당 API 로 1회 호출을 보내준다.

 

 

 

 

 

 

그런 다음 /actuator/metrics 로 접속해보면 우리가 추가한 metric 정보가 잘 나오게 된다.

 

 

 

 

 

 

Prometheus 에서도 조회해보면 잘 나온다.

 

 

 

 

 

 

이제 아까 작성했던 Promethues의 first_rules.yml 파일을 열어 review_request 라는 이름의 새로운 규칙을 정의해준다.

1분동안 실패 요청의 비율이 0.8 을 초과한다면 알림을 전송하도록 해주었다.

 

 

 

 

 

 

restart 하여 룰이 잘 추가된 것을 확인해준다.

 

 

 

 

 

 

이제 nGridner 를 통해 해당 API에 고의적으로 실패 요청을 보내준다.

 

 

 

 

 

 

이렇게 우리가 정의한 규칙이 FIRING 상태가 되고

 

 

 

 

 

 

Slack 을 확인해보면 알림도 잘 오는 것을 볼 수 있다.

 

 

 

 

 

 

 

 

참고 자료

더보기