Backend/MSA

241219 모니터링 시스템 개념과 실습 TIL

drinkgalaxy 2024. 12. 19. 16:56

모니터링 시스템 개념

모니터링이란, 시스템의 성능, 안전성과 가용성을 실시간으로 관찰하고 측정하는 과정이다.

모니터링은 시스템을 상태를 지속적으로 감시하고, 잠재적인 문제를 신속하게 발견해 대응할 수 있게 해준다.

Spring Boot Actuator

Spring Boot Actuator는 Spring Boot 애플리케이션의 상태와 성능을 모니터링하고 관리할 수 있도록 다양한 엔드포인트를 제공하는 기능이다.

 

모든 엔드포인트를 노출하는 설정은, 실제 운영 환경에서 보안 위험을 증가시킬 수 있음. 필요한 엔드포인트만 노출하거나 따로 보안 설정을 해줘야 함.

 

Spring Boot Actuator 실습 

새로운 프로젝트를 생성하고, 의존성과 application.yml을 수정한다.

spring.application.name=sample

server.port=8080

management.endpoints.web.exposure.include=* 

management.endpoint.health.show-details=always

8080/actuator로 들어가면, 실제로 이렇게 사용가능한 엔드포인트들을 확인할 수 있다.


Prometheus 개념

Prometheus는 오픈소스 시스템 모니터링 및 경고 도구이다.

 

Prometheus의 주요 구성 요소

- Prometheus 서버 : 메트릭 데이터를 수집하고 저장하는 핵심 컴포넌트이다. 각 타겟으로부터 데이터를 주기적으로 스크랩하여 시계열 데이터베이스에 저장한다.

- Exporters : 특정 애플리케이션이나 시스템의 메트릭 데이터를 Prometheus가 이해할 수 있는 형식으로 변환해주는 도구이다.

- Pushgateway : 짧은 수명의 작업에서 매트릭을 수집하여 Prometheus 서버에 push할 수 있다. 일반적으로 지속적으로 실행되지 않는 작업에서 사용한다.

- Alertmanager : Prometheus 서버에서 발생하는 경고를 처리하고, 다양한 방법으로 관리자에게 알림을 보낼 수 있다.

- Grafana : Prometheus 데이터를 시각화하기 위해 자주 사용되는 대시보드 도구이다.

Prometheus 실습

기존 프로젝트에 Prometheus 의존성을 추가하고 application.yml에 설정을 추가했다.

management.endpoint.prometheus.enabled=true

 

그리고 8080/actuator/prometheus 에 접속하면 프로메테우스 매트릭스를 확인할 수 있다.

 

그리고 Docker에서 Prometheus를 띄우기 전에, 설정 파일을 생성한다.

global:
  scrape_interval: 15s

scrape_configs:
  - job_name: 'spring-boot'
    metrics_path: '/actuator/prometheus'
    static_configs:
      - targets: ['host.docker.internal:8080']

 

이 설정 파일은 Prometheus가 모니터링할 타겟과 기타 설정을 정의하는 설정 파일이다.

host.docker.internal은 Docker에서 제공하는 특수한 DNS 이름으로, Docker 컨테이너가 호스트 컴퓨터의 네트워크 서비스에 접근할 수 있도록 한다. 

 

이제 Docker 명령어를 사용해 Prometheus 컨테이너를 실행해보자.

docker run -d --name=prometheus -p 9090:9090 -v /파일이 있는 경로/prometheus.yml:/etc/prometheus/prometheus.yml prom/prometheus

내 Docker에 Prometheus 이미지가 없기 때문에 pull 받고 있다.
pull 이 완료된 후 docker ps 명령어를 통해 실행중인 docker를 확인해보면 잘 떠있는 것을 확인할 수 있다!

 

localhost:9090으로 접속하면 아래와 같이 Prometheus 사이트에 접속할 수 있다.

Prometheus 실습 완!


Grafana 개념

Grafana는 오픈소스 데이터 시각화 및 모니터링 도구이다. 대시보드를 생성하고, 데이터를 그래프나 차트 형태로 표현하며, 알림 기능을 제공하여 모니터링을 강화할 수 있다.

 

Grafana의 주요 구성 요소

- 대시보드 생성 : Grafana는 사용자가 데이터를 시각화할 수 있는 대시보드를 생성할 수 있도록 한다.

- 다양한 데이터 소스 지원 : 여러 시스템과 애플리케이션의 데이터를 통합하여 시각화할 수 있다.

- 알림 기능 : 조건을 설정하여 조건이 충족되면 이메일, Slack 등 다양한 채널을 통해 알림을 보낼 수 있다.

- 플러그인 지원 : 다양한 플러그인을 통해 기능을 확장할 수 있다. 

- 사용자 관리 : 사용자를 관리하고, 대시보드와 데이터 소스에 대한 접근 권한을 설정할 수 있다.

Grafana 실습

Docker에서 Grafana 컨테이너를 실행하자.

docker run -d --name=grafana -p 3000:3000 grafana/grafana

 

그리고 localhost:3030에 접속에 Grafana에 로그인을 진행한다. 기본계정의 id/password는 admin/admin이다.

 

이제 Grafana의 Data Sources를 Prometheus로 연결한다.

그리고 Dashboards를 설정해줘야 한다. 나는 Grafana에서 제공하는 Spring Boot Dashboards를 사용했다.

Prometheus를 Grafana 대시보드로 시각화해서 볼 수 있게 되었다!

 

Grafana 에서 Slack 으로 Alert 보내기 실습

먼저 Slack에서 사용할 workSpace에 grafana-bot App을 추가해준다. 이때 메시지 전송 권한도 허용해둬야 한다.

 

그리고 Grafana에서 내 Slack을 등록해준 후, Slack을 기본 알림값으로 설정해준다. 여기까지 하면 기본 세팅은 끝이다!

 

이제 Spring Boot 프로젝트를 중단했을 때 Slack에 알림이 가는 기능을 구현해볼 것이다.

기능 구현을 위해 Alert rules을 등록해주자. 많은 기능을 설정해줄 주 있는데 일단 강의에 나오는 대로 설정해줬다.

 

실제로 떠있는 Spring Boot 프로젝트를 중단하자, 슬랙으로 중단되었다는 알림이 오는 것을 확인할 수 있었다.

 

이렇게 대시보드 모니터링 실습을 진행해봤는데, 실제로 실무에서 보안까지 생각하면서 대시보드나 알람을 구성하려면 정말 많은 설정과 고민을 해야한다. 특히 보안에 아주 철저히 신경써야 한다는 것을 잊지말자.


애플리케이션 로그 모니터링 - Loki

Loki는 Grafana Labs에서 개발한 로그 집계 시스템으로, 로그 데이터를 수집하고 쿼리할 수 있도록 설계되었다.

Loki는 주로 로그 데이터를 저장하고, 이를 Grafana를 통해 시각화하는데 사용된다.

Loki 실습

의존성 추가와 설정 파일 생성한다. (logback.xml)

그리고 에러가 나는 컨트롤러 생성해서 접근 시 에러 로그를 전달하도록 한다.

 

그럼 이제 Spring Boot를 실행했을 때 로그가 나오지 않는다. 다 logback.xml로 가기 때문이다.

 

이제 Loki를 Docker에서 띄우기 위해 loki-config.yml 파일을 만들고 Docker에서 띄워준다.

docker run --name loki -d -v C:\Users\p1226\Desktop\JavaDeepDive\finalLecture\com.monitor.sample\loki:/mnt/config -p 3100:3100 grafana/loki:3.0.0 --config.file=/mnt/config/loki-config.yml

 

참고로 loki-config.yml 파일의 내용과 Docker file 실행하는 방법이 Loki 공식문서에 나와있다.

정상적으로 Loki가 떴다!

 

이제 Loki를 Grafana에서 보려면 Data Sources에 추가해줘야한다. 참고로 위에서 Prometheus 설정 때 한 것처럼 Docker에서 띄웠다면 URL을 http://host.docker.internal: 로 정해줘야한다. Loki는 3100에 띄워져있으므로 :3100으로 작성해준다.

실제로 loki에서 log를 수집하고 있는 것을 확인할 수 있다.