본문 바로가기

백엔드 엔지니어링 일지

마켓 백엔드 엔진 9 : k6 부하 테스트 - Prometheus, Grafana 연동

k6는 로컬에서 실행하는편이 스크립트 수정도 더 간단하고, 현실환경에 더 가깝습니다.

먼저 파워쉘에서 k6를 설치합니다. 

 

설치 명령어:

winget install k6 --source winget

 

 

backend/scripts/k6/list.js

import http from "k6/http";
import { check, sleep } from "k6";

export const options = {
  vus: 5,
  duration: "30s",
};

export default function () {
  const res = http.get("http://localhost:8080/api/products?page=0&size=12");

  check(res, {
    "status is 200": (r) => r.status === 200,
    "success is true": (r) => r.json("success") === true,
    "items is array": (r) => Array.isArray(r.json("data.items")),
  });

  sleep(1);
}

 

5명(vus)이 동시에 30초(duration)동안 default 함수를 돌립니다.

 

 

실행 명령어:

k6 run scripts/k6/list.js

 

 

check: response 검증

http_req_duration p(90), p(95): 사용자 90%, 95% 체감 응답속도

vus: 가상사용자 수
iterations: 반복 수

 

k6 테스트 결과는 end-to-end 시간이므로, 서버측 모니터링 결과보다 사용자가 실제로 느낀 지연과 더 가깝습니다.

grafana에서 k6 prometheus (Native Histograms) 템플릿을 사용해서 k6 테스트 결과를 그래프로 쉽게 확인할 수 있습니다.

 

prometheus에서 기본적으로 k6는 스크랩하는 대상이 아니라서, remote write로 밀어넣어야 합니다.

그래서 prometheus에서 수신(receive)를 켜야 합니다.

native histogram을 쓰기 위해 enable했습니다.

엔드포인트는 http://prometheus:9090/api/v1/write 입니다.

 

실행 명령어:

$env:K6_PROMETHEUS_RW_SERVER_URL = "http://localhost:9090/api/v1/write"
$env:K6_PROMETHEUS_RW_TREND_AS_NATIVE_HISTOGRAM = "true"
k6 run -o experimental-prometheus-rw scripts/k6/list.js

실행 전 k6 실행 환경 설정도 해줘야 합니다.

env 환경설정은 터미널 세션마다 적용됩니다.

 

output에 Prometheus remote write가 적용됩니다.

grafana k6 template 대시보드에서 k6 테스트 결과를 볼 수 있습니다.