Docker를 활용한 Prometheus & Grafana 연동

말하는 감자·2025년 6월 11일

내일배움캠프

목록 보기
67/73
post-thumbnail

스프링 배치를 쓰면서 담당 팀원이 모니터링을 하는게 좋을 것 같다는 말을해서
연동해보려고한다!

전에 아주짧게 각 개념이랑 특징 호로롭



🌋 프로메테우스

  • Prometheus 는 모니터링 도구
  • 서버나 애플리케이션 등의 성능 데이터를 주기적으로 수집
  • 이 데이터는 시계열(time-series) 형식으로 저장.
    (예: CPU 사용률, 메모리 사용량, 요청 수, 응답 시간 등등.)

Prometheus 특징

  • Pull 방식: Prometheus가 설정된 대상에게 데이터를 끌어옴 (scrape)
  • 자신도 자신을 모니터링할 수 있음 (localhost:9090).
  • 데이터를 저장하고, 쿼리 언어 (PromQL)로 조회 가능.

🪄 Grafana

  • Grafana는 시각화 도구
  • Prometheus가 수집한 숫자 데이터를 그래프/대시보드로 시각화 해줌







도커에 프로메테우스 + 그라파나 띄우기

이건 docker-compse.yml 파일

version: '3.8'

services:
 ...

  prometheus:
    image: prom/prometheus
    container_name: prometheus
    volumes:
      - ./prometheus/prometheus.yml:/etc/prometheus/prometheus.yml
    ports:
      - "9090:9090"

  grafana:
    image: grafana/grafana
    container_name: grafana
    ports:
      - "3000:3000"
    volumes:
      - grafana-data:/var/lib/grafana
    depends_on:
      - prometheus

volumes:
  mysql-data:
  redis-data:
  chroma-data:
  grafana-data:

일케 프로메테우스 설정, 그라파나 설정 넣어주고 볼륨도 정해줫다

그런다음 프로테메우스 설정yml이 필요함
경로는 이렇게

global:
  scrape_interval: 20s

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

벌써 다했음 정말쉽죠??
이제 스프링 부트 앱을 프로메테우스가 추적하도록 설정해야함







Spring Boot 애플리케이션을 Prometheus와 연동해서 모니터링하기

먼저 의존성 추가해주기

build.gradle

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

1번째 의존성은 애플리케이션의 상태, 메트릭, 환경 정보 등을 자동으로 노출해주는 기능이다. (애플리케이션 자체의 모니터링 인터페이스)

2번 째 의존성은 모니터링 툴마다 메트릭의 포맷(양식)이 다른데, 이 micrometer 라는 라이브러리는 프로메테우스 툴이 사용하는 메트릭 포맷에 맞춰 메트릭을 변경시켜준다고 함.

micrometer = 인터페이스, 프로메테우스 = 구현체

즉, 두 의존성을 추가해주면

Spring Boot 앱이 /actuator/prometheus 라는 엔드포인트를 만들어서
👉 Prometheus가 수집 가능한 텍스트 포맷의 메트릭을 제공해줌

application.properties

management.endpoints.web.exposure.include=*
management.server.port=9292
server.tomcat.mbeanregistry.enabled=true
  • exposure.include=*: 모든 Actuator 엔드포인트를 외부로 노출
  • management.server.port=9292
    • 액츄에이터의 포트를 8080포트 에서 9292포트로 변경
    • AWS 를 사용해서 배포했을 때를 고려해서, EC2의 인바운드에 9292포트는 허용하지 않아야한다.
  • server.tomcat.mbeanregistry.enabled=true : 톰캣 쓰레드 풀의 최대 쓰레드 수, 사용 쓰레드 수도 보기 위해 톰캣 관련 메트릭을 추가

prometheus.yml

global:
  scrape_interval: 15s
  evaluation_interval: 15s
  
scrape_configs:
  - job_name: 'prometheus'
    static_configs:
      - targets: [ 'localhost:9090' ]

  - job_name: "spring-actuator"          // 수집하는 이름으로 임의의 이름
    metrics_path: '/actuator/prometheus' // 수집할 경로를 지정
    scrape_interval: 1m                  // 수집할 주기를 설정 1m은 1분, 1s는 1초
    static_configs:
      - targets: ['host.docker.internal:9292'] // 수집할 서버의 IP, PORT 를 지정, application.yml 에 포트를 9292로 지정했음

그런다음 도커 실행시켜주고 compse.yml 실행시켜주고~~
스프링 어플리케이션 작동시켜준다.

localhost:3000 접속

하면 로그인하라고 뜨는데
Id : admin
pwd : admin
으로 접속하고나서 비밀번호 변경시켜준다.


여기들어가서
프로메테우스 설정해주면되늗데

http://prometheus:9090
으로 작성해준다.

단, 이 경우는 docker-compse.yml 하나의 파일안에 promethues랑 grafana가 같이있어야함

이유는 ?

docker-compse 안에서는 서비스 이름 = 도커 네트워크 호스트 이름

이렇게 컴포즈 파일안에 여러 서비스들이 있는데 각 이름들이 호스트 이름이될수잇음

이렇게 설정해주면 이제 그라파나가 프로메테우스의 정보를 읽어오기시작함

http://localhost:9292/actuator/prometheus 접속

참고로 나는 properties에서 포트번호 바꿔준거니깐
원래는 http://localhost:8080/actuator/prometheus 으로 들어가면됨!!

이런식으로 정보들을 15초마다 불러와줌

그라파나 대시보드로 그래프 만들기

https://grafana.com/grafana/dashboards/?search=spring
여기들어간다

호환되는거 확인하고 나는 제일 처음에있는거 선택했음!!

여기서 ID 복사해오고 다시
localhost:3000으로 들어간다

여기다가 필요한 아이디값 치고 로드 갈기면댐

굿

ㅊㅊ : https://dkswhdgur246.tistory.com/64
https://alswns7984.tistory.com/63







JVM Statistics -Memory

Heap 관련

그래프설명
G1 Eden Space (heap)새 객체가 주로 할당되는 공간. 여기가 꽉 차면 GC가 발생하여 일부 객체가 Survivor나 Old로 이동
G1 Old Gen (heap)오래 살아남은 객체들이 저장되는 공간. 이 영역이 계속 커지면 Full GC 가능성이 높아진다
G1 Survivor Space (heap)Eden에서 살아남은 객체들이 잠시 머무는 공간. 일정 횟수 이상 살아남으면 Old Gen으로 이동.



Non-Heap 관련

그래프설명
CodeCache (non-heap)JIT 컴파일된 코드가 저장되는 영역. 코드 실행 최적화와 관련 있다.
Compressed Class Space (non-heap)클래스 메타데이터를 위한 공간 (Compressed Oops 사용 시).
Metaspace (non-heap)클래스 메타데이터가 저장됩니다. 과거 PermGen의 대체 공간입니다.

먼소린지모르겠군...




기타

그래프설명
Direct BuffersByteBuffer.allocateDirect() 같은 네이티브 메모리를 사용한 버퍼 크기. 네트워크/파일 I/O에서 자주 사용.
Threads현재 실행 중인 스레드 수. Daemon과 Live 스레드, Peak (최대치) 모두 보여준다.
profile
대충 데굴데굴 굴러가는 개발?자

0개의 댓글