모니터링 서버 구축 (feat. Grafana, Loki, prometheus)

공부는 혼자하는 거·2023년 10월 2일
0

Spring Tip

목록 보기
49/52

현재 여러 대의 인스턴스에(AWS 클라우드) 서버(SpringBoot App)가 배포되어있는 상황이다. 그동안 체계화된 모니터링 시스템에 대한 필요성을 인지만 하고 있는 상태였다가 시간이 나는 김에 구축해보았다.

스스로 생각한 제약조건은 대충 다음과 같다.

  1. 하나의 모니터링 서버에서 모든 서버의 매트릭 지표를 통합해서 확인
  2. 유료 툴을 사용하지 않고, 오픈소스 활용
  3. 사용자들은 단일한 웹 대시보드를 이용하여, 로그파일, 매트릭 지표 확인
  4. 비용과 학습곡선이 최대한 적은 방향

대충 위와 같은 조건을 고려하다보니, 생각할 수 있는 후보지가 크게 2가지 정도로 좁혀지더라.

  1. Spring Boot Admin

Spring Boot 애플리케이션을 관리하고 모니터링하기 위한 codecentric에서 제공하는 오픈소스이다. 실시간 로깅, 간단한 서버 매트릭 정보들을 확인할 수 있고, 제일 손쉽고 간단한 솔루션으로 생각되었다. 다만, 스프링부트로 만든 App들에게만 적용할 수 있고 제공되는 기능들이 다소 제한적이라 꺼려졌다.

  1. Promtail, Loki, Prometheus 그리고 Grafana

가장 래퍼런스도 많았고, 확장성도 뛰어나 보였다. 무엇보다 기본 제공하는 UI가 더 간지나? 보였다. Promtail은 로그파일을 Loki 서버에게 전송해주기 위해 각 서버가 위치한 인스턴스마다 설치해줘야 되는데, 나 같은 경우

    implementation("com.github.loki4j:loki-logback-appender:1.4.2")

해당 의존성을 추가해 스프링부트 앱에서 직접 전송하기로 했으므로 필요가 없는 듯 하다.

https://stackoverflow.com/questions/76927729/why-would-i-need-promtail-when-loki4j-logback-to-loki-gets-the-data-too

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

Loki 셋팅

   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")

logback-spring.xml

프로메테우스 - 그라파나 - Loki - 스프링 연동

데이터 소스 추가

대시보드 생성

이미 존재하는 대시보드 템플릿을 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://velog.io/@juhyeon1114/%EC%8B%A4%EC%A0%84-Spring-%EC%95%B1-%EB%AA%A8%EB%8B%88%ED%84%B0%EB%A7%81-w.-%ED%94%84%EB%A1%9C%EB%A9%94%ED%85%8C%EC%9A%B0%EC%8A%A4-%EA%B7%B8%EB%9D%BC%ED%8C%8C%EB%82%98-EC2

https://grafana.com/grafana/dashboards/

https://creampuffy.tistory.com/213

https://jujeol-jujeol.github.io/2021/10/28/Spring-Boot-%EB%AA%A8%EB%8B%88%ED%84%B0%EB%A7%81-%EC%A0%81%EC%9A%A9-2/

https://www.youtube.com/watch?v=2i3KHs6YhWk

핀포인트

https://sightstudio.tistory.com/56
https://imygnam.tistory.com/74

profile
시간대비효율

0개의 댓글