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 연결
- 접속: http://localhost:3000
- 로그인: admin / admin
- 왼쪽 사이드바 → Connections → Data sources → InfluxDB 선택
- 아래 표대로 설정 후 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)
대시보드에 표시되는걸 확인하면 끝!
'프로젝트 > 쿠폰' 카테고리의 다른 글
[쿠폰] 성능 테스트 및 개선 (JDBC Bulk Insert) (0) | 2025.04.30 |
---|---|
[쿠폰] 쿠폰 발급 수정 (saveAll, @Transactional) (0) | 2025.04.29 |
[쿠폰] 쿠폰 발급 (Redis Stream, CustomDbWorker) (0) | 2025.04.29 |
[쿠폰] 쿠폰 조회 (Redis 예외처리) (0) | 2025.04.28 |
[쿠폰] 쿠폰 생성 (@Transactional, CustomException) (0) | 2025.04.28 |