Prometheus로 메트릭 데이터를 수집하여 DB에 저장하고, Grafana를 이용해 데이터를 가져와 시각화 하는 과정
내가 사용할 프로젝트의 각 서비스에 Actuator 의존성을 추가하고 yml 파일에서 각 서비스를 scrape_configs 섹션에 추가하여 메트릭을 수집하도록 한다.
// actuator
implementation 'org.springframework.boot:spring-boot-starter-actuator'
// prometheus
runtimeOnly 'io.micrometer:micrometer-registry-prometheus'
management:
endpoints:
web:
exposure:
include: 'prometheus'
이 설정들을 해주고 나면
아래의 엔드포인트에서 다음과 같은 response를 확인할 수 있다.
이 정보들이 Spring Boot의 Metric 정보들이고, 이를 prometheus로 넘겨주어야 한다.
이제 prometheus를 설치하고
docker pull prom/prometheus
prometheus 설정을 할 service 모듈을 추가하여 prometheus.yml 파일을 설정한다.
global:
scrape_interval: 15s # 메트릭 수집 주기
scrape_configs:
- job_name: 'eureka'
metrics_path: '/actuator/prometheus'
static_configs:
- targets: [ 'host.docker.internal:12001' ] # Eureka Server의 메트릭 엔드포인트
- job_name: 'gateway-service'
metrics_path: '/actuator/prometheus'
static_configs:
- targets: ['host.docker.internal:12011'] # Gateway 서비스의 메트릭 엔드포인트
- job_name: 'user-service'
metrics_path: '/actuator/prometheus'
static_configs:
- targets: ['host.docker.internal:12021'] # User 서비스의 메트릭 엔드포인트
- job_name: 'concert-service'
metrics_path: '/actuator/prometheus'
static_configs:
- targets: ['host.docker.internal:12031'] # Concert 서비스의 메트릭 엔드포인트
- job_name: 'order-service'
metrics_path: '/actuator/prometheus'
static_configs:
- targets: ['host.docker.internal:12041'] # Order 서비스의 메트릭 엔드포인트
이 설정은 로컬 환경에서 통신할 수 있도록 제공된 주소이므로 배포 환경에서는 targets의 수정이 필요하다.
모든 설정이 완료되었다면 yml 파일을 도커 컨테이너 내부에 마운트하여 가동시킨다.
docker-compose.yml(prometheus.yml 파일과 같은 경로에 위치)
version: '3'
services:
prometheus:
image: prom/prometheus
container_name: prometheus
ports:
- "9090:9090" # Prometheus의 기본 포트
volumes:
- ./prometheus.yml:/etc/prometheus/prometheus.yml # 호스트의 prometheus.yml 파일을 컨테이너에 마운트
command:
- '--config.file=/etc/prometheus/prometheus.yml' # 설정 파일 경로 지정
터미널에서 해당 파일들이 있는 경로로 가서 docker compose --project-name prometheus up
을 입력
(원래는 docker compose up
인데 컨테이너 이름을 prometheus로 지정하고 싶어서)
localhost:9090으로 연결된 것을 확인할 수 있고
localhost:9090/targets에서 각 서비스가 정상적으로 설정이 된 것을 확인 할 수 있다.
우선, Grafana를 사용하기 위해 docker로 이미지를 가져온다.
docker pull grafana/grafana
도커를 통해 받아온 이미지를 3000번 포트로 가동시킨다.(grafana의 기본 포트가 3000번이라서)
docker run -d --name=grafana -p 3000:3000 grafana/grafana
localhost:3000으로 접속하고 로그인을 한다.
(기본 계정의 아이디와 비밀번호는 admin/admin 이다.)
해당 화면에서 DATA SOURCES 선택
Prometheus 선택
Name과 Connection URL을 지정
했는데 에러 발생
이 오류는 Grafana가 prometheus 호스트 이름을 DNS를 통해 해결하지 못함을 의미
Docker network 목록을 확인해보니 Grafana 컨테이너가 네트워크에 속해있지 않은 상태임을 확인
(base) ~-MacBookAir ~ % docker network ls
NETWORK ID NAME DRIVER SCOPE
...
adcdef123456 prometheus_default bridge local
...
version: '3'
services:
prometheus:
image: prom/prometheus
container_name: prometheus
ports:
- "9090:9090"
volumes:
- ./prometheus.yml:/etc/prometheus/prometheus.yml
command:
- '--config.file=/etc/prometheus/prometheus.yml'
networks:
- prometheus-network # Prometheus를 prometheus-network에 연결
grafana:
image: grafana/grafana
container_name: grafana
ports:
- "3000:3000"
depends_on:
- prometheus
networks:
- prometheus-network # Grafana를 prometheus-network에 연결
networks:
prometheus-network:
external: false # 내부 네트워크로 설정
prometheus와 grafana를 같은 네트워크로 설정을 해주고 컨테이너를 확인을 해보니
(base) sangwoo@sang-uui-MacBookAir resources % docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7818333aa000 grafana/grafana "/run.sh" 3 minutes ago Created grafana
3a239ee5e000 prom/prometheus "/bin/prometheus --c…" 15 minutes ago Exited (137) 3 minutes ago prometheus
261ee743c000 grafana/grafana "/run.sh" 2 hours ago Up 22 minutes 0.0.0.0:3000->3000/tcp intelligent_sammet
grafana가 2개가 충돌이 일어나고 있는 것을 확인
둘 모두 삭제해주고나서 다시 compose up을 한 후 시도해보니 성공
보여질 대시보드를 설정해줘야됨
새로운 대시보드를 생성하고
대시보드를 커스텀해서 사용할 수 있지만 기존에 만들어져있는 대시보드를 임포트하여 사용할 수 있다.
강의자료에서 사용했던 spring boot 3용 대시보드를 Load
설정한 prometheus를 선택 후 Import
연동한 프로젝트의 정보를 시각화하여 확인할 수 있다.