애플리케이션의 성능 테스트를 하는데, 모니터링 및 시각화 도구를 사용해보고자 했습니다. 많은 사람들이 사용하는 Spring Boot Actuator , Prometheus, Grafana 의 사용 방법에 대해 기록하고자 합니다.
처음 보는 사람들이 있을 수도 있기 때문에 간략하게 각 모듈의 역할을 정리해보았습니다.
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-actuator'
implementation 'io.micrometer:micrometer-registry-prometheus'
}
logging:
level:
org:
springframework:
r2bc: DEBUG
management:
endpoints:
web:
exposure:
include: health,info,prometheus
prometheus:
metrics:
export:
enabled: true
# 빌드 스테이지
FROM openjdk:17-jdk-alpine AS builder
WORKDIR /app
# 필요한 파일들 복사
COPY gradlew .
COPY gradle gradle
COPY build.gradle .
COPY settings.gradle .
COPY src src
# gradlew에 실행 권한 부여 및 Windows 개행 문자 제거
RUN chmod +x ./gradlew && sed -i 's/\r$//' ./gradlew
# bootJar 태스크를 사용하여 JAR 생성
RUN ./gradlew bootJar
# 실행 스테이지
FROM eclipse-temurin:17-jre
WORKDIR /app
# 빌드 스테이지에서 생성된 JAR 파일을 현재 스테이지로 복사
COPY --from=builder /app/build/libs/*.jar app.jar
# 환경 변수 설정 (기본값은 prod)
ARG PROFILE=prod
ENV SPRING_PROFILES_ACTIVE=$PROFILE
ENTRYPOINT ["java", "-jar", "app.jar"]
version: '3'
services:
spring-boot-app:
build:
context: .
dockerfile: Dockerfile
ports:
- "8080:8080"
depends_on:
- database
networks:
- monitoring
prometheus:
image: prom/prometheus:latest
volumes:
- ./prometheus.yml:/etc/prometheus/prometheus.yml
ports:
- "9090:9090"
networks:
- monitoring
grafana:
image: grafana/grafana:latest
ports:
- "3000:3000"
networks:
- monitoring
depends_on:
- prometheus
environment:
- GF_SECURITY_ADMIN_PASSWORD=[Grafana 계정 비밀번호]
networks:
monitoring:
driver: bridge # default
$ docker-compose up -d
Prometheus
http:// [api url] /actuator/prometheus 에 해당 메트릭 정보가 있음을 볼 수 있습니다
Grafana
http://localhost:3000 에 Grafana를 볼 수 있습니다. (계정/암호
는 기본적으로 admin/admin
)
로그인 후, 초기 화면입니다.
연결할 datasource(Prometheus)를 설정(추가)합니다.
설정할 정보를 작성해줍니다. (url은 compose file에서 설정한 prometheus 주소)
대시보드 UI를 직접 만들기는 번거로우니 https://grafana.com/grafana/dashboards/
에서 제공하는 템플릿을 가져옵니다.
Dashboard 탭을 눌러 Import를 누릅니다
아까 클릭해서 복사해온 id
를 넣고 Load
를 클릭합니다.
아까 작성한 Promethus를 지정하고 import
를 클릭합니다.
생성이 완료되면 Dashboard 가 이런식으로 보여지게 됩니다.