
이번 포스팅에서는 시스템 성능 테스트와 실시간 모니터링에 대해 다루고자 합니다. 특히 Grafana와 Prometheus를 활용한 모니터링 방법을 살펴볼 예정입니다.
🍋 코드 링크
성능 테스트와 부하 테스트는 시스템의 안정성, 확장성, 그리고 응답성을 평가하는 데 필수적입니다. 이 과정에서 실시간 모니터링은 다음과 같은 이유로 중요한 역할을 합니다.
Grafana와 Prometheus는 사용이 쉽고 널리 사용되는 오픈소스 도구로, 성능 테스트를 위한 실시간 모니터링에 탁월합니다. 주요 장점은 다음과 같습니다:
이러한 특성을 활용하여, 본 내용에서는 Grafana와 Prometheus를 사용한 성능 테스트 모니터링 방법을 소개하겠습니다.
Docker Compose를 이용하면 서비스를 간단히 셋팅할 수 있습니다.
⌈code⌋ docker-compose.yml
...
prometheus:
image: prom/prometheus
volumes:
- ./prometheus.yml:/etc/prometheus/prometheus.yml
command:
- '--config.file=/etc/prometheus/prometheus.yml'
- '--storage.tsdb.path=/prometheus'
- '--web.console.libraries=/usr/share/prometheus/console_libraries'
- '--web.console.templates=/usr/share/prometheus/consoles'
ports:
- 9090:9090
environment:
- HOST_IP=${HOST_IP:-host.docker.internal}
networks:
- app-network
grafana:
image: grafana/grafana
ports:
- "3000:3000"
environment:
- GF_SECURITY_ADMIN_USER=${GF_SECURITY_ADMIN_USER}
- GF_SECURITY_ADMIN_PASSWORD=${GF_SECURITY_ADMIN_PASSWORD}
- GF_SERVER_HTTP_PORT=${GF_SERVER_HTTP_PORT}
volumes:
- grafana_data:/var/lib/grafana
networks:
- app-network
...
docker compose 실행합니다.
docker-compose up -d prometheus grafana
브라우저에서 http://localhost:9090 으로 접속하여 Prometheus 웹 인터페이스에 진입합니다.

Graph 탭에서 조회하고 싶은 메트릭을 입력하면 그래프로 확인할 수 있습니다.
예: 최근 5분 동안의 평균 CPU 사용률을 조회하는 PromQL 쿼리
avg_over_time(system_cpu_usage[5m])

http://localhost:3000으로 접속하여 Grafana 웹 인터페이스에 진입합니다.
Grafana에서 Prometheus를 데이터 소스로 추가합니다.

새로운 대시보드를 만들거나 기존 대시보드를 import하여 사용할 수 있습니다.
예를 들어, jvm 관련 dashboard를 가져오려면 id : 4701 을 입력하면 미리 잘 꾸며진 JVM 메트릭 대시보드를 가져와서 사용할 수 있습니다.

Spring Boot 애플리케이션에서 커스텀 메트릭을 수집하고 Prometheus에 노출하는 방법입니다.
build.gradle에 의존성 추가implementation 'io.micrometer:micrometer-registry-prometheus'
Micrometer 프레임워크의 Prometheus 레지스트리를 제공합니다. 이를 이용하면 코드 ㅂ녀경 없이 Prometheus 지원을 추가할 수 있습니다.
application.properties에 설정 추가# prometheus
management.endpoints.web.exposure.include=prometheus
management.endpoint.metrics.enabled=true
management.endpoint.prometheus.enabled=true
prometheus.yml 설정 추가global:
scrape_interval: 10s
scrape_configs:
- job_name: 'yoonnsshop-app'
metrics_path: '/actuator/prometheus'
static_configs:
- targets: ['app:8080']
scrape_configs에 job을 등록해서 prometheus에 쉽게 연동할 수 있습니다. prometheus는 주기적으로 해당 서비스의 데이터를 pull 합니다.
다음과 같이 추가가 추가하려는 컴포넌트를 작성합니다.
⌈code⌋ SessionMetricCounter.java
@Component
public class SessionMetricsCounter {
private final MeterRegistry meterRegistry;
private final EntityManagerFactory entityManagerFactory;
private long totalQueries = 0;
private long totalConnections = 0;
private long currentQueries = 0;
private long currentConnections = 0;
public SessionMetricsCounter(EntityManagerFactory entityManagerFactory, MeterRegistry meterRegistry) {
this.entityManagerFactory = entityManagerFactory;
this.meterRegistry = meterRegistry;
// Guage 메트릭 등록
Gauge.builder("session.queries", () -> totalQueries)
.register(meterRegistry);
Gauge.builder("session.connections", () -> totalConnections)
.register(meterRegistry);
Gauge.builder("session.queries.current", () -> currentQueries)
.register(meterRegistry);
Gauge.builder("session.connections.current", () -> currentConnections)
.register(meterRegistry);
}
@Scheduled(fixedRate = 5000)
public void collectAndPublishMetrics() {
SessionFactory sessionFactory = entityManagerFactory.unwrap(SessionFactory.class);
Statistics statistics = sessionFactory.getStatistics();
// 현재 쿼리 수와 연결 수 업데이트
currentQueries = statistics.getPrepareStatementCount();
currentConnections = statistics.getConnectCount();
// 총 쿼리 수와 연결 수 누적
totalQueries += currentQueries;
totalConnections += currentConnections;
log.info("Session Metrics - Total Queries: {}, Total Connections: {}, " +
"Current Queries: {}, Current Connections: {}",
totalQueries, totalConnections, currentQueries, currentConnections);
// 현재 통계 초기화.
statistics.clear();
}
}
...
Geauge는 메트릭의 한 종류로, 시간에 따라 증가하거나 감소할 수 있는 숫자 값이고 현재 상태를 나타내는 스냅샷 값입니다. 가변적인 값을 모니터링하는 데 적합합니다.
이 컴포넌트는 5초마다 데이터베이스 세션 메트릭을 수집하고 Prometheus에 노출합니다. Prometheus는 설정된 주기인 10초마다 이 데이터를 스크래핑합니다.
Grafana에서 새로운 대시보드를 생성하고, session_queries와 같은 커스텀 메트릭을 추가하면 실시간으로 수집되는 데이터를 시각화할 수 있습니다.

이번 포스팅에서는 Grafana와 Prometheus를 활용한 시스템 성능 테스트를 위한 실시간 모니터링의 이점과 구현 방법을 살펴보았습니다. 이러한 실시간 모니터링 접근 방식을 실제로 적용한다면, 성능 테스트의 효율성을 크게 향상시키고 시스템의 성능 최적화에 직접적으로 기여할 수 있을 것으로 기대됩니다.
본 내용에서는 다루지 않았지만 모니터링 툴의 향후 개선 방향으로는 알림 시스템 구축, 맞춤형 대시보드 최적화, 로그 분석 통합 등이 있습니다.