k6 + Prometheus + Grafana 통합 서비스 모니터링 구축

박하늘·2025년 6월 4일

K6

목록 보기
1/1
post-thumbnail

이번 글에서는 부하 테스트란 무엇인지, 그리고 왜 필요한지에 대한 개념부터 시작해 직접 k6를 활용해 부하 테스트를 진행한 과정테스트 결과를 Grafana로 시각화해 모니터링한 방식을 정리하려고 한다.
또한 단순한 부타 테스트 뿐 아니라 실제 서비스가 정상적으로 운영되고 있는지에 대한 상태 정보도 함께 모니터링 하기 위해 Spring Actuator와 Prometheus를 연동한 방식도 함께 두려려고 한다.

부하 테스트란 ?

부하 테스트는 시스템에 점진적으로 부하를 증가시켜 임계점까지 도달하게 해 시스템이 얼마나 많은 트래픽이나 요청을 처리할 수 있는지 평가하는 테스트이다.

✅ 부하 테스트의 목적

  • 시스템에 얼마나 많은 사용자가 동시에 접근할 수 있는지, 즉 시스템의 가용성을 사전에 파악하기 위함
  • 사용자가 급격히 늘어날 경우 scale out과 같은 사전 대응 방안을 마련할 수 있음
  • 병목 현상이나 성능 저하가 발생하는 지점을 파악하여 개선 가능

🛠️ 부하 테스트 도구

  • 대표적인 부하 테스트 도구로는 JMeterK6가 있다.
  • 이번 테스트에서는 아래와 같은 스택을 활용하였다.
    • K6: 부하 테스트 시나리오 실행 도구
    • Spring API + Actuator: 앱 상태 지표 제공 (JVM, CPU, 메모리, HTTP 요청 수 등)
    • Micrometer: Actuator의 메트릭을 Prometheus 포맷으로 노출하는 데 사용
    • Prometheus: 시계열 DB로 메트릭 수집
    • Grafana: Prometheus에서 수집된 데이터 시각화
    ※ Spring API + Actuator와 Micrometer는 서비스 모니터링을 위한 구성 요소입니다.

K6 사용하기 전: SLO, SLI, SLA 개념 이해하기

  • SLO(Service Level Objectives)
    서비스가 목표로 삼는 수준의 성능 지표 (ex. 99.9%의 가용성)
  • SLI(Service Level Indicators)
    SLO를 측정하기 위한 핵심 지표 (ex. 평균 응답 시간, 성공률)
  • SLA(Service Level Agreements)
    서비스 제공자와 고객 간의 법적 계약으로 SLO가 지켜지지 않았을 경우의 보상 등 조건을 명시

정리하자면, SLO: 목표, SLI: 지표, SLA: 계약으로 이해하면 쉽다!

✅ 왜 중요할까?

  • 부하 테스트 시나리오를 작성할 때, SLO, SLI는 꼭 포함되어야 한다.
  • 특히 중요한 포인트는
    • 몇 명까지 사용자를 수용할 수 있는가
    • 응답 시간(평균, 최대, 최소)이 어떻게 되는가
  • 이 데이터를 기반으로 안정성을 평가하고 향후 확장 전략을 수립할 수 있다.

서비스 상태 모니터링 구축하기 (Spring Actuator 기반)

  • Spring Boot + Actuator + Micrometer → Prometheus -> Grafana

1️⃣ 기본 설정 구성

(1) application.yml 설정

management:
  endpoints:
    web:
      exposure:
        include: "prometheus"
  metrics:
    export:
      prometheus:
        enabled: true

(2) build.gradle 의존성 추가

	implementation("org.springframework.boot:spring-boot-starter-actuator:3.4.3")
	implementation("io.micrometer:micrometer-registry-prometheus:1.14.5")

(3) 실행 확인

http://localhost:8080/actuator/prometheus
  • 접속 후 아래 화면처럼 뜨면 Actuator + Micrometer 설정이 제대로 되어 있고 Prometheus 형식으로 메트릭이 노출되고 있다는걸 의미한다.

2️⃣ Prometheus + Grafana 연동

(1) prometheus.yml 설정

global:
  scrape_interval: 15s  # 메트릭 수집 주기 (기본 15초)

scrape_configs:
  - job_name: 'spring-boot-app'
    metrics_path: '/actuator/prometheus'
    static_configs:
      - targets: ['localhost:8080']

(2) docker-compose.yml에 서비스 추가

  prometheus:
    image: prom/prometheus:v2.47.0
    volumes:
      - ./prometheus.yml:/etc/prometheus/prometheus.yml
    ports:
      - "9090:9090"

  grafana:
    image: grafana/grafana:10.1.2
    ports:
      - "3000:3000"
    environment:
      - GF_SECURITY_ADMIN_USER=admin
      - GF_SECURITY_ADMIN_PASSWORD=admin

(3) Prometheus 접속 및 상태 확인

http://localhost:9090/targets
  • Status > Targets에서 Spring Boot 앱이 UP 상태인지 확인

3️⃣ Grafana 대시보드 생성

- [데이터 소스 등록]
1. 로그인 (admin/admin)
2. 왼쪽 메뉴에서 Data sources > Add data source > Prometheus
3. URL 칸에 Prometheus 서버 주소 입력 (http://host.docker.internal:9090)
4. Save & Test 클릭 -> "Successfully queried the Prometheus API." 메시지 확인

- [대시보드 생성]
1. Dashbboard > New > import
2. Dashboard ID 입력 : 4701
3. import 후 grafana 대시보드 확인

이 시점까지는 Actuator에서 제공하는 JVM, Tomcat, 메모리 등의 기본 시스템 메트릭만 확인할 수 있다. 아래는 k6로 실제 부하 테스트 결과를 시각화한 내용이다.

부하 테스트 모니터링 구축하기 (k6 기반)

  • K6 → Prometheus Remote Write -> Grafana

1️⃣ 부하 테스트 환경 구성

(1) k6 스크립트 생성
➡️ user-k6-script.js

(2) docker-compose.yml (k6 추가 및 기존 설정 수정)

  prometheus:
    image: prom/prometheus:v2.47.0
    command:
      - --web.enable-remote-write-receiver ✅ Prometheus가 외부에서 데이터를 remote write 방식으로 받을 수 있게 해주는 옵션 -> k6 결과를 Prometheus로 보내려면 필요함
      - --enable-feature=native-histograms ✅ native histograms 기능 활성화 (정확하고 고해상도 지표 분석에 유용)
      - --config.file=/etc/prometheus/prometheus.yml
    volumes:
      - ./prometheus.yml:/etc/prometheus/prometheus.yml
    ports:
      - "9090:9090"

  k6:
    image: grafana/k6:latest
    command: run -o experimental-prometheus-rw /scripts/user-k6-script.js
    volumes:
      - ./src/main/java/kr/hhplus/be/server/support/k6:/scripts
    environment:
      - K6_PROMETHEUS_RW_SERVER_URL=http://prometheus:9090/api/v1/write
      - K6_PROMETHEUS_RW_TREND_AS_NATIVE_HISTOGRAM=true
    extra_hosts:
      - "host.docker.internal:host-gateway"
    depends_on:
      - prometheus  
  
  networks:
    k6:

(3) docker-compose 실행

  docker-compose up -d 

2️⃣ Grafana 대시보드 생성

- 대시보드 생성
1. Dashboard > New > import : 아래 json 파일 import
https://github.com/grafana/xk6-output-prometheus-remote/blob/main/grafana/dashboards/k6-prometheus-native-histogram.json
2. 아래처럼 k6 결과가 grafana로 시각화된 것을 확인할 수 있다.

마무리

이번 글에서는 Spring Actuator를 활용해 서비스 자체의 상태(CPU, 메모리 사용량, 애플리케이션 기동 시간 등)를 모니터링하는 방법과 k6를 통해 수행한 부하 테스트 결과를 Grafana로 시각화하는 과정을 직접 구성해보았다.

이렇게 시각화된 데이터를 통해 실제로 어느 구간에서 부하가 많이 발생했는지, 응답 시간이 급격히 늘어나는 시점은 언제인지등을 한 눈에 파악할 수 있었다.

이러한 환경을 바탕으로 실제 서비스에서 부하 테스트를 수행했고 아래 링크에는 그에 따른 부하 테스트 시나리오 문서 예시를 첨부했다.

👉 부하 테스트 시나리오 문서 보기 (Notion)

profile
백엔드 개발자

0개의 댓글