prometheus의 http방식으로 spring boot의 metrics 수집하기
Prometheus는 애플리케이션의 메트릭을 수집하여 알람 및 모니터링 기능을 구현할 때 사용한다.
PromQL로 쿼리하여 수집한 메트릭을 더 상세하게 분석해볼 수도 있다.
prometheus의 메트릭 수집 방법은 여러가지가 있으나, 대표적으로는 JMX와 HTTP가 있다.
app -> prometheus -> grafana로 이어지는 메트릭 수집 및 시각화 과정
prometheus.yaml 이라는 설정 파일을 생성한다.
global:
scrape_interval: 10s # 10초 마다 Metric을 Pulling
evaluation_interval: 10s
scrape_configs:
- job_name: 'spring-boot-app'
metrics_path: '/actuator/prometheus' # Application prometheus http endpoint
static_configs:
- targets: ['172.18.0.5:xxxx'] # Application host:port 수집대상 컨테이너
도커 컨테이너로 app을 띄웠으므로 target 정보는 대상 컨테이너의 ip와 port를 입력했다.
HAPI FHIR 6.1.0의 경우 spring boot 2.6.7 버전을 사용하며,
이미 pom.xml에 micrometer 가 디펜던시에 추가되어 있어서 바로 사용할 수 있었다.
그런데 application.yaml에 설정된 기본 값을 쓰면 8080포트에 health, prometheus를 사용하는데,
이렇게 되면 도메인:443/actuator 경로로 모두에게 오픈된 상태로(!!) metric을 도용당할 수 있다.
actuator 보안 설정이 필요해서 아래 블로그 참고하여 설정을 변경했다.
actuator 안전하게 사용하기
application.yaml
management:
endpoints:
enabled-by-default: false
web:
exposure:
include: "health, info, prometheus"
jmx:
exposure:
exclude: *
endpoint:
health:
enabled: true
info:
enabled: true
prometheus:
enabled: true
server:
port: xxxx
보안 설정을 추가해도 간단하게나마 인증을 거쳐야 메트릭에 접근할 수 있도록 basic auth를 추가했다.
공식문서 참조
basic auth를 위한 설정 파일 하나를 더 만들고, 아이디와 암호화된 패스워드를 입력한다.
공식 문서처럼 python3-bcrypt 모듈로 생성해도 되고, 웹의 도움을 받아도 된다.
# gen-pass.py 생성 및 실행
sudo yum install python3-bcrypt
vi gen-pass.py
...
web.yaml
basic_auth_users:
[유저]: [암호화 비밀번호]
준비가 되었으니 컨테이너를 띄워서 확인해본다
생성한 설정파일을 마운트 해주고, 설정 파일로 인식하도록 --config 플래그도 붙여준다.
docker run -p xxxx:xxxx \
--network xxxx \
-v /home/xxxx/prometheus.yml:/etc/prometheus/prometheus.yml \
-v /home/xxxx/web.yml:/etc/prometheus/web.yml \
--name prometheus \
-d prom/prometheus \
--config.file=/etc/prometheus/prometheus.yml \
--web.config.file=/etc/prometheus/web.yml
이제 ip:port로 접속해보면 아래처럼 아이디/비밀번호를 입력을 요구한다.
prometheus 정상 설치 여부를 확인할 때는 이렇게 접속해도 괜찮겠지만,
정상 설치 확인한 이후에는 이 port로 접근이 불가능하도록 막는 것이 좋겠다.
접속하면 아래와 같은 화면이 나왔다.
status 메뉴에 들어가면 여러 방법으로 서비스 상태를 확인해볼 수 있다.
타겟으로 설정한 애플리케이션 컨테이너로부터 정상적으로 메트릭 수집이 진행 중이라는 것을 확인한다.
다음 글에서는 loki와 prometheus로 수집한 메트릭을 Grafana로 시각화 하는 내용을 정리하겠다.