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

위의 이미자와 같이 api가 호출되면 prometheus에서 설정된 시간마다 매트릭을 수집후, grafana에서 수집된 메트릭을 대시보드로 보여주는 방식이다. Prometheus& Grafana는 Docker 위에서 동작하게 설계하였고 Spring 서버는 local에서 동작하게 하였습니다.
implementation 'org.springframework.boot:spring-boot-starter-actuator'
runtimeOnly 'io.micrometer:micrometer-registry-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에서 할일은 끝이다.
우선 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와 같은 쿼리를 만들고 날리면 정상적인 메트릭 데이터가 오는것을 확인할수 있을겁니다. 이제 이데이터를 시각화해주는 마지막단계인 그라파나를 설치합니다.

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



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