현재 여러 대의 인스턴스에(AWS 클라우드) 서버(SpringBoot App)가 배포되어있는 상황이다. 그동안 체계화된 모니터링 시스템에 대한 필요성을 인지만 하고 있는 상태였다가 시간이 나는 김에 구축해보았다.
스스로 생각한 제약조건은 대충 다음과 같다.
대충 위와 같은 조건을 고려하다보니, 생각할 수 있는 후보지가 크게 2가지 정도로 좁혀지더라.
Spring Boot 애플리케이션을 관리하고 모니터링하기 위한 codecentric에서 제공하는 오픈소스이다. 실시간 로깅, 간단한 서버 매트릭 정보들을 확인할 수 있고, 제일 손쉽고 간단한 솔루션으로 생각되었다. 다만, 스프링부트로 만든 App들에게만 적용할 수 있고 제공되는 기능들이 다소 제한적이라 꺼려졌다.
가장 래퍼런스도 많았고, 확장성도 뛰어나 보였다. 무엇보다 기본 제공하는 UI가 더 간지나? 보였다. Promtail은 로그파일을 Loki 서버에게 전송해주기 위해 각 서버가 위치한 인스턴스마다 설치해줘야 되는데, 나 같은 경우
implementation("com.github.loki4j:loki-logback-appender:1.4.2")
해당 의존성을 추가해 스프링부트 앱에서 직접 전송하기로 했으므로 필요가 없는 듯 하다.
2번 방안을 선택하기로 했다.
일단 프로메테우스 서버를 설치할 EC2 인스턴스 하나를 만들어 뒀다. 귀차니즘 상 퍼블릭 서브넷 인스턴스로 가정하고 설명하겠다.
OS는 우분투 22.04.2
6 sudo apt-get install -y prometheus prometheus-node-exporter prometheus-pushgateway prometheus-alertmanager
7 sudo systemctl start prometheus
8 sudo systemctl enable prometheus
10 sudo systemctl status prometheus
Docker로 셋팅하는 가이드가 많이 있던데, 나는 로컬로 설치할 거다.
sudo su -
cd /etc/prometheus/
sudo vi prometheus.yml
루트 계정으로 이동해, prometheus.yml 파일을 찾아서 연동할 spring app의 job을 정의해준다. targets에 ip와 포트를 적어주면 되고, 보안그룹은 미리 다 연동해뒀다고 가정하고 진행하겠다.
sudo systemctl restart prometheus
브라우저로 {프로메테우스가 설치된 EC2 IP}:9090 로 들어가서, 잘 접속이 되는지 확인해보자, 역시 보안그룹 설정은 미리 다 되어있다고 가정하겠다.
좀 더 강력한 대시보드를 만들어보기 위해, 그라파나를 설치해 연동하겠다.
28 sudo apt-get update
29 sudo apt-get install wget curl gnupg2 apt-transport-https software-properties-common -y
30 wget -q -O - https://packages.grafana.com/gpg.key | sudo apt-key add -
31 echo "deb https://packages.grafana.com/oss/deb stable main" | sudo tee -a /etc/apt/sources.list.d/grafana.list
32 sudo apt-get update
33 sudo apt-get install grafana -y
34 grafana-server -v
35 clear
36 sudo systemctl start grafana-server
37 sudo systemctl enable grafana-server
38 sudo systemctl status grafana-server
43 mkdir grafana-loki
44 cd grafana-loki
52 wget https://github.com/grafana/loki/releases/download/v2.9.1/loki-linux-arm64.zip
53 sudo apt install unzip
55 wget https://raw.githubusercontent.com/grafana/loki/v2.9.1/cmd/loki/loki-local-config.yaml
75 unzip loki-linux-arm64.zip
설치하고 실행스크립트를 만든다.
77 sudo vi loki-startup.sh
관련 래퍼런스들은 프로메테우스와 로키를 연동하는 설정들을 주로 소개하고 있으나, 나는 loki-logback-appender를 이용해 springboot 앱에서 바로 loki 서버로 로그를 쏴줄 것이기 때문에, 필요가 없다.
runtimeOnly("io.micrometer:micrometer-registry-prometheus")
implementation("com.github.loki4j:loki-logback-appender:1.4.2")
이미 존재하는 대시보드 템플릿을 import
https://grafana.com/grafana/dashboards/19004-spring-boot-statistics/
대시보드 id와 json setting 을 다운로드 받고 복붙해주자
로키 데이터소스에서 쿼리를 날려보면 내 앱의 로그파일을 확인할 수 있을 거다.
https://spring.io/blog/2022/10/12/observability-with-spring-boot-3
https://loki4j.github.io/loki-logback-appender/
https://jaehee329.tistory.com/45
https://grafana.com/grafana/dashboards/
https://creampuffy.tistory.com/213
https://www.youtube.com/watch?v=2i3KHs6YhWk
https://sightstudio.tistory.com/56
https://imygnam.tistory.com/74