Spring Boot + Prometheus, Grafan App 구현

김종찬·2023년 5월 12일

사내 Prometheus와 Grafana를 결합하여 project가 진행될 것 같아 미리 한번 맛보기로 경험하고자 블로그들을 찾아가며 만든 간단한 모니터링 앱 구현 과정을 남기고자 합니다.

  • 사용 기술 스택
    • Spring boot
    • Docker
    • Prometheus
    • Grafana

시나리오

위의 이미자와 같이 api가 호출되면 prometheus에서 설정된 시간마다 매트릭을 수집후, grafana에서 수집된 메트릭을 대시보드로 보여주는 방식이다. Prometheus& Grafana는 Docker 위에서 동작하게 설계하였고 Spring 서버는 local에서 동작하게 하였습니다.

1. 필요한 의존성 추가와 간단한 Api 구현

implementation 'org.springframework.boot:spring-boot-starter-actuator'
runtimeOnly 'io.micrometer:micrometer-registry-prometheus'
  • spring boot applicatio actuator는 실행 중인 애플리케이션의 내부를 볼 수 있게 해주고, 스프링 부트 애플리케이션의 모니터링이나 매트릭(metric)과 같은 기능을 HTTP와 JMX 엔드포인트를 통해 제공한다.
  • prometheus를 사용하기 위해 프로메테우스 의존성 추가

spring:
  application:
    name: prometheus-basic

management:
  endpoint:
    metrics:
      enabled: true
    prometheus:
      enabled: true

  endpoints:
    web:
      exposure:
        include: health, info, metrics, prometheus

  metrics:
    tags:
      application: ${spring.application.name}

엔드포인트를 호출하였을때 문자열 데이터를 반환해주는 간단한 api 생성 및 프로메테우스에 관련된 설정을 application.yml에 작성해 준다. 이렇게 한다면 Spring App에서 할일은 끝이다.

2. Prometheus 생성 및 실행

우선 Prometheus를 실행하기전 docker내 Prometheus에 설정될 prometheus.yml을 작성해준다. prometheus.yml은 자신의 local에다 작성해주면된다. 근데 한가지 여기서 시간을 많이 하였는데 yml을 그냥 application resources 하위에 생성하여 같이 있으면 뭔가 좀 더 관리하기 쉬울것 같아

이런식으로 파일 위치를 두었었는데 docker 명령어를 통해 실행하였을때 설정 파일이 제대로 바인딩 되지 않는 이슈를 겪었다 문제가 무엇인지는 아직 잘 모르겠으나 이와 같은 실수를 하지말고 다른곳에 prometheus.yml을 두고 관리하기 바랍니다.


prometheus.yml의 설정은 아래와 같이 설정하였습니다. 다른 블로그 글들을 참고해서 하였지만 필요한 설정들을 따로 한번 찾아보는것도 나쁘지 않을것 같습니다.

global:
  scrape_interval: 10s # 10초마다 매트릭을 수집 default 1분
  evaluation_interval: 1m # 1분마다 규칙을 평가 default 1분

  external_labels: # 외부 시스템에 표시할 이 서버의 레이블
    monitor: 'devbeekei-monitor'

rule_files: # 규칙을 로딩하고 evaluation_interval 설정에 따라 정기적으로 평가한다.
# - "first.rules"
# - "second.rules"

scrape_configs:
  - job_name: 'prometheus-basic-app' # 잡 이름
    metrics_path: '/actuator/prometheus' # 메트릭을 수집할 path 설정
    static_configs:
      - targets: ['host.docker.internal:8080'] # 도커 인스턴스 내부 호스트:8080

이제 docker를 통해 prometheus image를 받고 실행시킵니다.

$ docker run -d -p 9090:9090 -v {위의 prometheus.yml의 경로}:/etc/prometheus/prometheus.yml --name prometheus prom/prometheus

명령어를 통해 정상적으로 이미지와 실행까지 된것을 확일할수있고, localhost:9090에 접속하여 작성했던 설정 파일들이 제대로 아래와 같이 설정되었는지 확인합니다.


이제 우리가 만들었던 app-server를 실행하고 만들어두었던 api를 호출하고 프로메테우스 홈에서
http_server_requests_seconds_max와 같은 쿼리를 만들고 날리면 정상적인 메트릭 데이터가 오는것을 확인할수 있을겁니다. 이제 이데이터를 시각화해주는 마지막단계인 그라파나를 설치합니다.

3. Grafana 생성 및 실행

prometheus와 마찬가지로 docker 명령어를 통해 설치및 실행해줍니다.

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

docker ps 를 통해 해당 컨테이너가 정상적으로 실행되는것을 확인하고, localhost:3000을 통해 그라파나에 접속하면 id/pwd 입력란이 나오는데 초기값은 id: admin // pwd: admin 을 입력하여 들어갑니다. 그후 순서는 아래 이미지 step을 통해 프로메테우스를 설정후 sava & test를 눌러줍니다.



이렇게하면 프로메테우스와 그라파나의 연동이 완료되었고, JVM 상태를 대쉬보드로 보기 위한 추가작업을 해줍니다.

https://grafana.com/grafana/dashboards/4701 -> 입력후 load



정상적으로 데이터를 수집하여 보여주는것을 알수있습니다.
이것을 이용해 어떤것을 구분하고 활용할지는 조금더 공부해야 할것 같습니다.

profile
봄이 오길

0개의 댓글