Tiny Star

프로젝트/쿠폰

[쿠폰] 테스트를 위한 k6 + InfluxDB + Grafana 구성

흰둥아 2025. 4. 30. 01:17

k6 → InfluxDB → Grafana

k6: 테스트 트래픽 생성
InfluxDB: 시계열 DB, 테스트 메트릭 저장
Grafana: 실시간 시각화

 


 

1. k6 Docker

docker pull grafana/k6
// coupon_test.js
import http from 'k6/http';
import { check } from 'k6';

export const options = {
  vus: 100, 	   // 가상 사용자 수
  duration: '10s', // 테스트 시간
};

export default function () {
  // 1 ~ 10 사이의 랜덤 couponId
  const couponId = Math.floor(Math.random() * 10) + 1;

  const url = `http://host.docker.internal:8080/api/coupons/${couponId}/issue`;
  const payload = JSON.stringify({
    userId: `user-${__VU}-${__ITER}`
  });

  const params = {
    headers: { 'Content-Type': 'application/json' },
  };

  const res = http.post(url, payload, params);

  check(res, {
    'status was 200': (r) => r.status === 200,
  });
}

k6를 Docker에 설치했으면 호스트를 host.docker.internal로 설정해야 한다. 

 

 

 

2. InfluxDB + Grafana Docker

# docker-compose.yml
version: '3'

services:
  influxdb:
    image: influxdb:1.8
    ports:
      - "8086:8086"
    environment:
      - INFLUXDB_DB=k6
    volumes:
      - ./influxdb:/var/lib/influxdb

  grafana:
    image: grafana/grafana:latest
    ports:
      - "3000:3000"
    environment:
      - GF_SECURITY_ADMIN_PASSWORD=admin
    depends_on:
      - influxdb
    volumes:
      - grafana-storage:/var/lib/grafana

volumes:
  grafana-storage:
docker-compose up -d
  • InfluxDB → http://localhost:8086
  • Grafana → http://localhost:3000 (ID: admin, PW: admin)

 

 

 

3. Grafana + InfluxDB 연결

  1. 접속: http://localhost:3000
  2. 로그인: admin / admin
  3. 왼쪽 사이드바 → Connections → Data sources → InfluxDB 선택
  4. 아래 표대로 설정 후 save & test
항목
URL http://influxdb:8086
Database k6
HTTP Method GET 또는 POST
Save & Test

 

 

 

 

4. Grafana 대시보드 구성

docker run -i grafana/k6 run --out influxdb=http://host.docker.internal:8086/k6 - < coupon_test.js

먼저 스크립트를 실행시켜 데이터를 만들어야한다.

 

 

대시보드에 쿼리 추가했다.

 

# A. 초당 요청 수 (RPS)
SELECT count("value") FROM "http_reqs" WHERE $timeFilter GROUP BY time($__interval) fill(null)

# B. 평균 응답 시간
SELECT mean("value") FROM "http_req_duration" WHERE $timeFilter GROUP BY time($__interval) fill(null)

# C. VUs (활성 사용자 수)
SELECT last("value") FROM "vus" WHERE $timeFilter GROUP BY time($__interval) fill(null)

# D. 실패율
SELECT mean("value") FROM "http_req_failed" WHERE $timeFilter GROUP BY time($__interval) fill(null)

 

대시보드에 표시되는걸 확인하면 끝!

top