Spring Boot 애플리케이션에서 Health Check 및 Prometheus 기반 메트릭 수집을 위한 설정을 추가하였습니다. 이를 통해 애플리케이션 상태를 확인하고 Prometheus가 메트릭을 수집하여 Grafana에서 시각화할 수 있도록 구성할 수 있습니다.
application.yml 설정 변경management:
endpoints:
web:
exposure:
include: "health,info,prometheus"
management.endpoints.web.exposure.includehealth: 애플리케이션 상태 확인 (/actuator/health)info: 애플리케이션 정보 확인 (/actuator/info)prometheus: Prometheus에서 사용할 메트릭 노출 (/actuator/prometheus)prometheus 엔드포인트 활성화build.gradle 의존성 추가implementation 'org.springframework.boot:spring-boot-starter-actuator'
implementation 'io.micrometer:micrometer-registry-prometheus'
spring-boot-starter-actuator → Spring Boot Actuator를 활성화하여 애플리케이션 상태 모니터링 가능micrometer-registry-prometheus → Micrometer를 사용하여 Prometheus와 연동하여 메트릭 수집global:
scrape_interval: 15s
evaluation_interval: 15s
scrape_configs:
- job_name: 'prometheus'
static_configs:
- targets: ['localhost:9090']
- job_name: 'backend'
metrics_path: '/actuator/prometheus'
static_configs:
- targets: ['backend:8080']
- job_name: 'node'
static_configs:
- targets: ['node-exporter:9100']
- job_name: 'cadvisor'
static_configs:
- targets: ['cadvisor:8080']
이 prometheus.yml 설정 파일은 Prometheus가 메트릭 데이터를 수집하는 방법을 정의합니다. 이 설정을 통해 Prometheus 자체, Backend, Node Exporter, cAdvisor의 메트릭을 수집하여 서비스 및 시스템 상태를 모니터링할 수 있습니다.
global:
scrape_interval: 15s
evaluation_interval: 15s
scrape_interval: 15s → 모든 타겟의 메트릭을 15초마다 수집evaluation_interval: 15s → 규칙을 평가하고 경보(Alert)를 감지하는 주기 설정- job_name: 'prometheus'
static_configs:
- targets: ['localhost:9090']
targets: ['localhost:9090'] → Prometheus가 자신의 메트릭을 localhost:9090에서 수집- job_name: 'backend'
metrics_path: '/actuator/prometheus'
static_configs:
- targets: ['backend:8080']
/actuator/prometheus)에서 메트릭을 가져옴backend:8080에서 데이터를 가져와 Prometheus에 저장- job_name: 'node'
static_configs:
- targets: ['node-exporter:9100']
targets: ['node-exporter:9100'] → node-exporter의 메트릭을 수집- job_name: 'cadvisor'
static_configs:
- targets: ['cadvisor:8080']
targets: ['cadvisor:8080'] → cAdvisor의 메트릭을 수집하여 컨테이너의 CPU, 메모리, 네트워크, 디스크 사용량 등을 추적기존 Jenkinsfile에서 EC2에 배포 시 Prometheus 설정 파일(prometheus.yml)을 추가로 전송하도록 변경하였습니다. 이를 통해 배포 프로세스에서 Prometheus 설정을 자동으로 적용할 수 있습니다.
Deploy to EC2 단계에서 Prometheus 설정 파일 전송 추가stage('Deploy to EC2') {
steps {
sshagent(credentials: ['ec2-ssh-key']) {
sh "scp -o StrictHostKeyChecking=no .env ${DEPLOY_HOST}:${DEPLOY_PATH}/.env"
sh "scp -o StrictHostKeyChecking=no docker-compose.yml ${DEPLOY_HOST}:${DEPLOY_PATH}/docker-compose.yml"
sh "scp -o StrictHostKeyChecking=no prometheus.yml ${DEPLOY_HOST}:${DEPLOY_PATH}/prometheus.yml"
prometheus.yml)을 EC2로 전송.env 및 docker-compose.yml 파일과 함께 prometheus.yml을 추가하여 배포 환경에서 Prometheus가 정상적으로 작동할 수 있도록 설정scp 명령어 사용-o StrictHostKeyChecking=no 옵션을 추가하여 SSH 접속 시 호스트 키 확인을 생략하고 자동화 수행 sh """
ssh -o StrictHostKeyChecking=no ${DEPLOY_HOST} '
cd ${DEPLOY_PATH} &&
docker compose down --remove-orphans &&
docker compose pull &&
docker compose up -d &&
docker image prune -f &&
rm -f ${DEPLOY_PATH}/.env
'
"""
}
}
}
docker compose up -d 실행 시, Prometheus 설정(prometheus.yml)이 포함된 docker-compose.yml을 기반으로 컨테이너가 실행됨.env 파일을 제거하여 민감한 환경 변수 정보를 보호 prometheus:
image: prom/prometheus:v2.53.3
container_name: prometheus
restart: always
volumes:
- ./prometheus.yml:/etc/prometheus/prometheus.yml
- prometheus-data:/prometheus
ports:
- "9090:9090"
depends_on:
backend:
condition: service_healthy
networks:
- moonggeul-network
grafana:
image: grafana/grafana:11.5.1
container_name: grafana
restart: always
volumes:
- grafana-data:/var/lib/grafana
ports:
- "3000:3000"
depends_on:
- prometheus
networks:
- moonggeul-network
node-exporter:
image: prom/node-exporter:latest
container_name: node-exporter
restart: always
ports:
- "9100:9100"
networks:
- moonggeul-network
cadvisor:
image: gcr.io/cadvisor/cadvisor:v0.47.2
container_name: cadvisor
restart: always
privileged: true
ports:
- "8081:8080"
volumes:
- /:/rootfs:ro
- /var/run:/var/run:ro
- /sys:/sys:ro
- /var/lib/docker/:/var/lib/docker:ro
- /dev/kmsg:/dev/kmsg:ro
networks:
- moonggeul-network
volumes:
mysql-data:
name: mysql-data
prometheus-data:
name: prometheus-data
grafana-data:
name: grafana-data
networks:
moonggeul-network:
name: moonggeul-network
driver: bridge
기존 docker-compose.yml에 Prometheus, Grafana, Node Exporter 및 cAdvisor를 추가하여 서비스 및 시스템 모니터링을 강화하였습니다.
prometheus:
image: prom/prometheus:v2.53.3
container_name: prometheus
restart: always
volumes:
- ./prometheus.yml:/etc/prometheus/prometheus.yml
- prometheus-data:/prometheus
ports:
- "9090:9090"
depends_on:
backend:
condition: service_healthy
networks:
- moonggeul-network
prom/prometheus:v2.53.3 이미지 사용restart: always 옵션을 추가하여 컨테이너가 종료되더라도 자동 재시작되도록 설정prometheus.yml)prometheus-data 볼륨에 저장하여 데이터 영속화9090:9090 포트 개방backend가 정상 실행된 후 시작되도록 depends_on 설정moonggeul-network 네트워크에 포함하여 다른 서비스와 통신 가능grafana:
image: grafana/grafana:11.5.1
container_name: grafana
restart: always
volumes:
- grafana-data:/var/lib/grafana
ports:
- "3000:3000"
depends_on:
- prometheus
networks:
- moonggeul-network
grafana/grafana:11.5.1 최신 버전의 Grafana 이미지 사용restart: always 옵션으로 컨테이너 자동 재시작grafana-data)grafana-data 볼륨 사용3000:3000 포트 개방depends_on: - prometheus 설정 추가moonggeul-network에 포함하여 Prometheus 및 백엔드 서비스와 연동 가능node-exporter:
image: prom/node-exporter:latest
container_name: node-exporter
restart: always
ports:
- "9100:9100"
networks:
- moonggeul-network
prom/node-exporter:latest 이미지 사용9100:9100 포트 개방moonggeul-network에 포함하여 Prometheus와 연동 가능cadvisor:
image: gcr.io/cadvisor/cadvisor:v0.47.2
container_name: cadvisor
restart: always
privileged: true
ports:
- "8081:8080"
volumes:
- /:/rootfs:ro
- /var/run:/var/run:ro
- /sys:/sys:ro
- /var/lib/docker/:/var/lib/docker:ro
- /dev/kmsg:/dev/kmsg:ro
networks:
- moonggeul-network
gcr.io/cadvisor/cadvisor:v0.47.2 이미지 사용8081:8080 포트 개방/rootfs, /sys, /var/lib/docker 등의 정보를 읽을 수 있도록 마운트moonggeul-network에 포함하여 Prometheus와 연동 가능volumes:
mysql-data:
name: mysql-data
prometheus-data:
name: prometheus-data
grafana-data:
name: grafana-data
networks:
moonggeul-network:
name: moonggeul-network
driver: bridge
prometheus-data 볼륨을 생성하여 Prometheus가 수집한 데이터를 보존grafana-data 볼륨을 생성하여 Grafana의 설정 및 대시보드 데이터를 유지moonggeul-network를 bridge 네트워크로 설정하여 서비스 간 통신 가능