241219 모니터링 시스템 개념과 실습 TIL
모니터링 시스템 개념
모니터링이란, 시스템의 성능, 안전성과 가용성을 실시간으로 관찰하고 측정하는 과정이다.
모니터링은 시스템을 상태를 지속적으로 감시하고, 잠재적인 문제를 신속하게 발견해 대응할 수 있게 해준다.
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

Prometheus 개념
Prometheus는 오픈소스 시스템 모니터링 및 경고 도구이다.
Prometheus의 주요 구성 요소
- Prometheus 서버 : 메트릭 데이터를 수집하고 저장하는 핵심 컴포넌트이다. 각 타겟으로부터 데이터를 주기적으로 스크랩하여 시계열 데이터베이스에 저장한다.
- Exporters : 특정 애플리케이션이나 시스템의 메트릭 데이터를 Prometheus가 이해할 수 있는 형식으로 변환해주는 도구이다.
- Pushgateway : 짧은 수명의 작업에서 매트릭을 수집하여 Prometheus 서버에 push할 수 있다. 일반적으로 지속적으로 실행되지 않는 작업에서 사용한다.
- Alertmanager : Prometheus 서버에서 발생하는 경고를 처리하고, 다양한 방법으로 관리자에게 알림을 보낼 수 있다.
- Grafana : Prometheus 데이터를 시각화하기 위해 자주 사용되는 대시보드 도구이다.
Prometheus 실습
기존 프로젝트에 Prometheus 의존성을 추가하고 application.yml에 설정을 추가했다.
management.endpoint.prometheus.enabled=true

그리고 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


localhost:9090으로 접속하면 아래와 같이 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를 사용했다.

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