Logging & Monitoring - 2. Prometheus

zuckerfrei·2023년 4월 18일
0

Monitoring

목록 보기
4/6

요약

prometheus의 http방식으로 spring boot의 metrics 수집하기


2. Prometheus

2.1 누구세요..?

Prometheus는 애플리케이션의 메트릭을 수집하여 알람 및 모니터링 기능을 구현할 때 사용한다.
PromQL로 쿼리하여 수집한 메트릭을 더 상세하게 분석해볼 수도 있다.

prometheus의 메트릭 수집 방법은 여러가지가 있으나, 대표적으로는 JMX와 HTTP가 있다.

  • HTTP
    • prometheus 사용시 가장 보편적으로 사용되는 메트릭 수집 방법
    • 애플리케이션이 http endpoint을 통해 메트릭 제공하는 방식을 사용한 것임
    • Spring Boot는 2.x 부터 metric 수집을 지원해서 micrometer를 dependency에 추가하면 사용 가능
  • JMX (Java Management eXtensions)
    • JAVA 애플리케이션의 메트릭을 수집하는 표준API

app -> prometheus -> grafana로 이어지는 메트릭 수집 및 시각화 과정


2.2 설정 파일 작성

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를 입력했다.


2.3 Spring Boot 설정

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
  • jmx를 사용하지 않으므로 모든 접근을 거부하는 설정
  • http는 health, info, prometheus만 접근 가능하도록 노출
  • 애플리케이션 서비스 포트와 겹치지 않도록 다른 포트 설정

2.4 basic auth 설정 추가

보안 설정을 추가해도 간단하게나마 인증을 거쳐야 메트릭에 접근할 수 있도록 basic auth를 추가했다.
공식문서 참조

basic auth를 위한 설정 파일 하나를 더 만들고, 아이디와 암호화된 패스워드를 입력한다.
공식 문서처럼 python3-bcrypt 모듈로 생성해도 되고, 의 도움을 받아도 된다.

# gen-pass.py 생성 및 실행
sudo yum install python3-bcrypt
vi gen-pass.py
...

web.yaml

basic_auth_users:
    [유저]: [암호화 비밀번호]

2.5 Prometheus 컨테이너 실행

준비가 되었으니 컨테이너를 띄워서 확인해본다
생성한 설정파일을 마운트 해주고, 설정 파일로 인식하도록 --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

2.6 확인

이제 ip:port로 접속해보면 아래처럼 아이디/비밀번호를 입력을 요구한다.
prometheus 정상 설치 여부를 확인할 때는 이렇게 접속해도 괜찮겠지만,
정상 설치 확인한 이후에는 이 port로 접근이 불가능하도록 막는 것이 좋겠다.

접속하면 아래와 같은 화면이 나왔다.

status 메뉴에 들어가면 여러 방법으로 서비스 상태를 확인해볼 수 있다.

타겟으로 설정한 애플리케이션 컨테이너로부터 정상적으로 메트릭 수집이 진행 중이라는 것을 확인한다.



다음 글에서는 loki와 prometheus로 수집한 메트릭을 Grafana로 시각화 하는 내용을 정리하겠다.

profile
무설탕 음료를 좋아합니다

0개의 댓글