Spring Boot + MySQL + Prometheus + Grafana + Docker

junsangyu·2026년 7월 20일

Spring Boot

Dockerfile

원하는 자바 버전에 맞게 수정

FROM eclipse-temurin:25-jdk-alpine AS build

WORKDIR /app

COPY build.gradle settings.gradle gradlew ./
COPY gradle ./gradle
COPY src ./src

RUN ./gradlew clean bootJar --no-daemon

FROM eclipse-temurin:25-jre-alpine

WORKDIR /app

COPY --from=build /app/build/libs/*.jar app.jar

EXPOSE 8080

ENTRYPOINT ["java", "-jar", "app.jar"]

compose.yaml

MySQL 패스워드와 데이터베이스 수정
compose 컨테이너간 통신만 필요하면 3306 포트포워딩 필요없음

services:
  app:
    build: .
    ports: ["8080:8080"]
    environment:
      SPRING_DATASOURCE_URL: jdbc:mysql://db:3306/test
      SPRING_DATASOURCE_USERNAME: root
      SPRING_DATASOURCE_PASSWORD: test
    depends_on:
      db:
        condition: service_healthy

  db:
    image: mysql:9
    ports: ["3306:3306"]
    volumes:
      - db-data:/var/lib/mysql
    environment:
      MYSQL_ROOT_PASSWORD: test
      MYSQL_DATABASE: test
    healthcheck:
      test: ["CMD-SHELL", "mysqladmin ping -h 127.0.0.1 -uroot -ptest --silent"]
      interval: 5s
      timeout: 3s
      retries: 20
      start_period: 20s

volumes:
  db-data:

Prometheus + Grafana

compose.yaml

포트포워딩한 MySQL 경로로 --mysqld.address= 수정

services:
  mysqld-exporter:
    image: prom/mysqld-exporter
    ports: ["9104:9104"]
    command:
      - "--mysqld.address=localhost:3306"
      - "--mysqld.username=root"
    environment:
      MYSQLD_EXPORTER_PASSWORD: test

  prometheus:
    image: prom/prometheus
    ports: ["9090:9090"]
    volumes:
      - ./prometheus.yml:/etc/prometheus/prometheus.yml
    depends_on: ["mysqld-exporter"]

  grafana:
    image: grafana/grafana
    ports: ["3000:3000"]
    depends_on: ["prometheus"]

prometheus.yml

Spring Actuator 경로 지정

global:
  scrape_interval: 15s

scrape_configs:
  - job_name: "spring"
    metrics_path: "/actuator/prometheus"
    static_configs:
      - targets: ["localhost:8080"]

  - job_name: "mysql"
    static_configs:
      - targets: ["mysqld-exporter:9104"]

.yaml 이면 인식 못하는 버그가 있는듯?

Spring 설정

application.yaml

management:
  endpoints:
    web:
      exposure:
        include: health,prometheus
  metrics:
    tags:
      application: ${spring.application.name}
    distribution:
      percentiles-histogram:
        http.server.requests: true

build.gradle

  • spring-boot-starter-actuator
  • micrometer-registry-prometheus

기타

그 후 알아서 필요한 grafana dashboard import하면 됨

연동 확인한 대시보드들

profile
👨🏻‍💻

0개의 댓글