SpringBoot 프로젝트에 K6 + Grafana + InfluxDB를 사용해서 부하 테스트와 성능 테스트를 진행해보겠다.
1. k6 설치
cmd 창에 다음을 입력한다.
window가 아닌 다른 환경이라면 여기를 참고하면 된다.
choco install k6
동작 확인을 위해 프로젝트 root 폴더 하위에 scripts폴더를 만들어 sample.js 파일을 생성해서 다음 코드를 작성해주었다.
Http Get 메서드를 사용하여 해당 url로 요청을 보낸다.
해당 코드는 공식 문서에 있는 sample 코드이다.
import http from 'k6/http';
import { sleep } from 'k6';
export default function () {
http.get('https://test.k6.io');
sleep(1);
}
터미널에 다음을 입력한다.
cd scripts
k6 run sample.js
다음과 같이 나오면 정상적으로 동작하는 것이다.
2. 테스트 시나리오
여기에 10명의 사용자가 30초 동안 url로 GET 요청을 발생시키는 테스트를 하고 싶다면 다음과 같이 작성할 수 있다.
script.js를 실행할 때 가상 사용자의 수와, 테스트의 총 실행 시간을 결정할 수 있다.
k6 run --vus 10 --duration 30s sample.js
또는 다음과 같이 실행 옵션을 설정하여 k6 run scripte.js 로 실행해도 된다.
import http from 'k6/http';
import { sleep } from 'k6';
export const options = {
vus: 10, //가상 사용자 수
duration: '30s', //총 테스트 시간
};
export default function () {
http.get('http://test.k6.io');
sleep(1);
}
다음과 같이 성능 테스트 시나리오를 작성할 수 있다.
다음 시나리오는 10명의 가상 사용자가 각자 20번씩 수행하도록 한다. 때문에 테스트는 총 200회 반복 실행된다.
import http from 'k6/http';
import { sleep } from 'k6';
export const options = {
discardResponseBodies: true, //모든 http응답 본문 무시
scenarios: {
contacts: {
executor: 'per-vu-iterations', //각 사용자에 대해 지정한 수 만큼 반복 수행하도록 함
vus: 10, //가상 사용자
iterations: 20, //각 가상 사용자가 반복 수행할 횟수
maxDuration: '30s', //시나리오의 최대 실행 시간
},
},
};
export default function () {
http.get('https://test.k6.io/contacts.php');
// Injecting sleep
// Sleep time is 500ms. Total iteration time is sleep + time to finish request.
sleep(0.5);
}
더 많은 시나리오는 여기서 확인할 수 있다.
3. 테스트 결과 생성
CSV나 JSON 형식으로 테스트 결과를 생성할 수도 있다.
//csv 생성
k6 run --out csv=파일명.csv sample.js
//json 생성
k6 run --out json=파일명.json sample.js
js 파일이 있는 위치에 파일이 생성된다.
4. k6 메트릭
k6는 built-int 메트릭과 사용자가 직접 설정하는 custom 메트릭을 제공한다.
자세한 메트릭은 여기서 확인할 수 있다.
커스텀 메트릭도 확인해보자. k6/metrics 라이브러리를 통해서 간단하게 테스트할 수 있다.
import http from 'k6/http';
import { sleep } from 'k6';
import { Trend } from 'k6/metrics';
export const options = {
discardResponseBodies: true,
scenarios: {
contacts: {
executor: 'per-vu-iterations',
vus: 10,
iterations: 20,
maxDuration: '30s',
},
},
};
const myTrend = new Trend('waiting_time');
export default function () {
const r = http.get('https://httpbin.test.k6.io');
myTrend.add(r.timings.waiting);
}
다른 custom 메트릭 sample은 여기서 확인할 수 있다.
5. k6 & influxDb & Grafana
우선 influxDB와 Grafana를 설치하자. docker가 이미 컴퓨터에 깔려있다는 전제이다.
레포지토리를 clone하여 docker-compse.yml을 통해 설치할 것이다.
git clone https://github.com/grafana/k6 && cd k6
git submodule update --init
docker-compose up -d influxdb grafana
다음과 같이 이미지가 생성되고 컨테이너가 실행 중인 것을 확인할 수 있다.
기존에 sample.js에 있는 프로젝트로 가서 sample.js가 있는 경로로 이동한 후 터미널에 다음을 입력하자
필자는 sample.js를 다음 내용으로 변경했다.
import http from "k6/http";
import { check, sleep } from "k6";
// Test configuration
export const options = {
thresholds: {
// Assert that 99% of requests finish within 3000ms.
http_req_duration: ["p(99) < 3000"],
},
// Ramp the number of virtual users up and down
stages: [
{ duration: "30s", target: 15 },
{ duration: "1m", target: 15 },
{ duration: "20s", target: 0 },
],
};
// Simulated user behavior
export default function () {
let res = http.get("https://test-api.k6.io/public/crocodiles/1/");
// Validate response status
check(res, { "status was 200": (r) => r.status == 200 });
sleep(1);
}
k6 run --out influxdb=http://localhost:8086 sample.js
주소창에 localhost:3000으로 이동하여 ID/Password는 admin/admin으로 로그인한다.
Grafana에 대시보드를 추가해주자. New dashboard를 클릭하자.
New > Import를 클릭한다.
Grafana에서 제공하는 k6 로드 테스트 결과를 보여주는 대시보드를 사용하겠다.
2587이라고 입력하고 Load를 클릭한다.
하단의 k6를 다음과 같이 설정하고 Import를 클릭한다.
이제 k6 테스트 결과를 grafana를 통해 시각적으로 확인할 수 있다.
'Spring' 카테고리의 다른 글
[Spring] 아임포트 사용한 결제 구현 + JavaScript/React 코드 (0) | 2023.06.20 |
---|---|
[Spring] Webflux + RSocket, React 사용한 전체 채팅 구현 (0) | 2023.06.02 |
[Spring] Jacoco 적용하여 코드 커버리지 확인 및 Codecov사용한 PR에 커버리지 코멘트 추가 (0) | 2023.05.27 |
[Spring] SpringBoot Prometheus, Grafana를 사용한 모니터링(Feat. Docker) (0) | 2023.05.25 |
[Spring] Spring WebFlux 간단한 예제 (0) | 2023.05.25 |