[yoonnsshop] Grafana와 Prometheus 활용

yoonn·2024년 6월 24일

yoonnsshop

목록 보기
3/7
post-thumbnail

Intro

이번 포스팅에서는 시스템 성능 테스트와 실시간 모니터링에 대해 다루고자 합니다. 특히 Grafana와 Prometheus를 활용한 모니터링 방법을 살펴볼 예정입니다.

  1. 성능 테스트 중 시스템의 실시간 상태 확인 방법
  2. 성능 병목 현상의 신속한 식별 및 분석 방법
  3. 커스텀 메트릭 정의 및 모니터링 활용 방법

🍋 코드 링크


1. 성능 테스트를 위한 실시간 모니터링의 중요성

성능 테스트와 부하 테스트는 시스템의 안정성, 확장성, 그리고 응답성을 평가하는 데 필수적입니다. 이 과정에서 실시간 모니터링은 다음과 같은 이유로 중요한 역할을 합니다.

  • 즉각적인 성능 메트릭 확인 : 테스트 중 시스템의 반응을 실시간으로 관찰할 수 있어, 성능 병목 현상을 즉시 식별할 수 있습니다.
  • 임계값 모니터링 : 중요 메트릭에 대한 임계값을 설정하고, 이를 초과할 경우 즉시 알림을 받도록 설정할 수 있습니다.
  • 다양한 메트릭의 상관관계 분석 : CPU 사용률, 메모리 소비, 응답 시간 등 다양한 메트릭을 한눈에 보기 쉽게 시각화하여, 이들 간의 상관관계를 효과적으로 분석할 수 있습니다.

2. Grafana와 Prometheus를 활용한 성능 테스트 모니터링

Grafana와 Prometheus는 사용이 쉽고 널리 사용되는 오픈소스 도구로, 성능 테스트를 위한 실시간 모니터링에 탁월합니다. 주요 장점은 다음과 같습니다:

  1. 효율적인 데이터 수집과 저장 : Prometheus의 pull 방식 데이터 수집 모델
  2. 강력한 시각화와 대시보드 기능 : Grafana의 다양한 차트 옵션과 사용자 정의 대시보드 설정
  3. 유연한 쿼리 언어 : Prometheus의 PromQL을 통해 복잡한 쿼리를 작성하여 심층적인 데이터 분석 가능

이러한 특성을 활용하여, 본 내용에서는 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

Prometheus

  1. 브라우저에서 http://localhost:9090 으로 접속하여 Prometheus 웹 인터페이스에 진입합니다.

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

avg_over_time(system_cpu_usage[5m])

Grafana

  1. http://localhost:3000으로 접속하여 Grafana 웹 인터페이스에 진입합니다.

  2. Grafana에서 Prometheus를 데이터 소스로 추가합니다.

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

3. Application 단에서의 커스텀 모니터링

Spring Boot 애플리케이션에서 커스텀 메트릭을 수집하고 Prometheus에 노출하는 방법입니다.

  1. build.gradle에 의존성 추가
    ⌈code⌋ build.gradle
implementation 'io.micrometer:micrometer-registry-prometheus'

Micrometer 프레임워크의 Prometheus 레지스트리를 제공합니다. 이를 이용하면 코드 ㅂ녀경 없이 Prometheus 지원을 추가할 수 있습니다.

  1. application.properties에 설정 추가
    Prometheus의 엔드포인트를 활성화합니다.
    ⌈code⌋ application.properties
# prometheus
management.endpoints.web.exposure.include=prometheus
management.endpoint.metrics.enabled=true
management.endpoint.prometheus.enabled=true
  1. prometheus.yml 설정 추가
    ⌈code⌋ 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와 같은 커스텀 메트릭을 추가하면 실시간으로 수집되는 데이터를 시각화할 수 있습니다.


Conclusion

이번 포스팅에서는 Grafana와 Prometheus를 활용한 시스템 성능 테스트를 위한 실시간 모니터링의 이점과 구현 방법을 살펴보았습니다. 이러한 실시간 모니터링 접근 방식을 실제로 적용한다면, 성능 테스트의 효율성을 크게 향상시키고 시스템의 성능 최적화에 직접적으로 기여할 수 있을 것으로 기대됩니다.

본 내용에서는 다루지 않았지만 모니터링 툴의 향후 개선 방향으로는 알림 시스템 구축, 맞춤형 대시보드 최적화, 로그 분석 통합 등이 있습니다.

Reference

0개의 댓글