Spring Boot 모니터링 적용 - 1

Spring Boot 어플리케이션 모니터링 적용기

도입 목적

이미 서버 모니터링은 Cloud Watch 를 통해 하고 있었으나, Cloud Watch Agent 가 cron 명령어로 일정 시간마다 보내기 때문에 실시간 확인이 어려웠다. 예전 스프린트 때 서버가 다운됐는데 바로 파악이 안되어 이미 필요성이 한번 제기되었으나 계속 우선순위에서 밀리다가 이번에 본격적으로 작업하게 되었다.

본 목적은 서버 메트릭을 실시간으로, 가시성 높게 모니터링하려는 것이었으나, 로그 수집도 포함하게 되었다. 로그 모니터링 과정은 2편으로 따로 서술하겠다.

Spring Boot Actuator + Prometheus + Grafana

Spring Boot Actuator

Spring Boot은 이미 모니터링과 관리를 위한 도구가 있는데, Actuator 가 그것이다. HTTP 또는 JMX로 엔드포인트를 설정하여 이 정보를 기반으로 모니터링할 수 있다. 메트릭과 헬스체크, 오디팅Audting 수집도 자동으로 적용할 수 있다.

Prometheus

Prometheus는 이벤트 모니터링 및 경고에 사용되는 오픈 소스 프로그램이다. 유연한 쿼리를 제공하고, HTTP 풀 모델을 사용하여 구축 된 시계열 데이터베이스에 실시간 메트릭을 기록한다.(참고)

Grafana

Grafana는 시계열 데이터 시각화 오픈 소스이다. 여러 DB를 지원하고, 자유롭게 대시보드를 구성할 수 있다. 쿼리 작성도 지원하고 템플릿을 다운로드 받아 구성할 수도 있어 유용하게 사용할 수 있다.

사전설정

build.gradle 에 의존성을 추가한다.

implementation 'org.springframework.boot:spring-boot-starter-actuator'
implementation 'io.micrometer:micrometer-registry-prometheus'

application.yml 설정을 변경했다.

spring:
  application:
    name: {my-app-name}
management:
  endpoints:
    web:
      exposure:
        include: "prometheus"
  metrics:
    tags:
      application: ${sprring.application.name}

prometheus 에 endpoint 를 노출하겠다는 의미이다. include 부분에 beans, health 등등.. 어플리케이션 상태를 체크할 다양한 소스를 추가할 수 있다. 하지만 모든 정보를 노출해서는 안되기 때문에 Spring Security 를 사용하는 등 여러 보안 대책이 필요하다.

Prometheus와 Grafana 설치 및 실행

  • homebrew 를 사용한 설치 및 실행

    brew install prometheus
    brew install grafana
    
    brew services start prometheus
    brew services start grafana
    

    promethues.yml 위치 /opt/homebrew/etc

    Grafana 포트 변경 위치 /opt/homewbrew/etc/grafana.ini

ubuntu 환경에서는 아래와 같이 진행한다.

# Grafana 설치
wget https://dl.grafana.com/oss/release/grafana-{[버전](https://grafana.com/docs/grafana/latest/installation/debian/)}.linux-amd64.tar.gz
tar -zxvf grafana-6.7.2.linux-amd64.tar.gz

# Prometheus 설치
wget https://github.com/prometheus/prometheus/releases/download/{[버전](https://prometheus.io/download/)}/prometheus-2.17.1.linux-amd64.tar.gz
tar -xzf prometheus-2.17.1.linux-amd64.tar.gz

Prometheus 는 추가 설정이 필요하다. prometheus.yml 을 아래와 같이 수정한다.

global:
  scrape_interval: 15s

scrape_configs:
  - job_name: "prometheus"
    static_configs:
    - targets: ["localhost:9090"]

# 여기가 새로 추가한 부분
  - job_name: "springboot"
    metrics_path: "/actuator/prometheus"
    static_configs:
    - targets: ["{스프링 부트 서버}"]

각각 실행한다.

cd grafana-6.7.2.linux-amd64
./grafana

cd prometheus-2.17.1.linux-amd64
./prometheus

Prometheus 의 기본 포트는 9090, Grafana 는 3000이다.

실행 포트 변경

Grafana 설치 경로에서 conf/default.ini 파일을 수정한다.

# The http port to use
;http_port = {원하는 포트}

Prometheus 의 포트를 변경하려면 실행할 때 옵션을 준다. (참고)

./prometheus --web.listen-address=:{원하는 포트}

포트변경을 하지 않았다면 각각 localhost:9090 , localhost:3000 으로 연결해 확인할 수 있다.

Prometheus

실행 화면

img1

현재 돌아가고 있는 상태도 확인할 수 있다.

img2

img3

중간에 어플리케이션을 종료하면 이렇게 상태가 변한다.

img4

메트릭 확인

원하는 메트릭을 그래프, 테이블 형태로 확인할 수 있다. 아래는 JVM 프로세스의 최근 CPU 사용량을 확인한 모습이다.

img5

서버에 요청을 몇번 보냈더니 CPU 사용량이 확 뛰었다.

img6

Grafana

대시보드 기본 구성

Grafana 의 기본 id, pw 는 admin, admin 이다. 접속해서 바로 비밀번호를 변경한다. (설정의 Users 항목에서 추가 유저를 생성하고 권한을 부여할 수 있다.)

홈 화면에 진입한 뒤 Prometheus 를 데이터소스로 추가한다. URL 은 지금 Prometheus가 떠있는 곳, 현재는 기본값인 http://localhost:9090 로 연결했다.

img7

img8

img9

이렇게 잘 추가된 것을 확인할 수 있다.

img10

연결했으니 대시보드를 만들어야 한다.

img11

일단 빈 패널을 생성해서 시도해보려고 한다.

먼저 사용할 데이터소스를 선택하고,

img12

PromQL(Prometheus Query Language)을 작성해서 어떤 지표를 조회할지 작성해야 하는데, 어느정도 지원한다.

system_cpu_usage 메트릭을 확인할 것이고, 어떤 어플리케이션과 잡을 선정할 것인지도 고르면 된다.

img13

img14

img15

그러면 알아서 쿼리를 생성해준다! Use query 를 눌러서 추가하면, 시각화된 모습을 확인할 수 있다.

img16

대시보드에 패널 하나가 추가되었다.

img15

Template을 적용한 대시보드

Grafana 에서 다른 사람들이 구성한 템플릿을 사용할 수 있다. (https://grafana.com/grafana/dashboards/)

  1. 마음에 드는 템플릿을 json 형식으로 다운받는다. 우리 프로젝트는 이것을 사용하고 있다.
  2. 대시보드 탭에서 Import 를 눌러 다운받은 파일로 구성하면 끝

대신 구성하면서 변수가 제대로 할당이 되지 않는 문제가 있었다.

img16

jvm_classes_loaded_classes 부분이 최초에는 jvm_classes_loaded 로 되어있어 제대로 된 metric이 아니었던 것이다. 로컬에서 직접 /actuator/prometheus 에 어떤 값이 오는지 확인하고 바꿔서 넣어줬다.

이 밖에도 템플릿과 일치하지 않는 부분은 직접 수정하여 대시보드 구성을 완료했다.

img17

종종 수정 버튼이 없는 패널이 있는데, More > Panel JSON 에서 쿼리를 수정하면 된다.

참고자료

  • 대부분 공식문서를 통해 손쉽게 진행할 수 있다.
  • Prometheus, Grafana 연동 - https://meetup.toast.com/posts/237

© 2017. All rights reserved.

Powered by Hydejack v7.5.2