K6
K6는 API 및 시스템 부하 테스트를 위한 명령줄 도구입니다. 이 통합은 K6의 experimental-prometheus-rw 출력을 사용하여 부하 테스트 메트릭을 DataKit의 Prometheus Remote Write 엔드포인트에 기록한 다음 Guance에 보고합니다. K6는 상시 실행 서비스가 필요하지 않으며, 부하 생성 머신에서 DataKit에 접근할 수 있으면 됩니다.
설정¶
사전 요구 사항¶
- K6를 설치하고
k6 version이 정상적으로 실행되는지 확인합니다. - DataKit을 설치하고 부하 생성 머신에서 DataKit의
9529포트에 접근할 수 있는지 확인합니다. - DataKit에서
prom_remote_write수집기를 활성화합니다. - 실행마다 고유한
benchmark_id와testid를 설정하여 서로 다른 부하 테스트의 데이터가 섞이지 않도록 합니다.
DataKit 설정¶
DataKit 설치 디렉터리의 conf.d/prom 아래에 다음과 같이 prom_remote_write.conf를 생성합니다.
[[inputs.prom_remote_write]]
path = "/prom_remote_write"
methods = ["PUT", "POST"]
# K6 메트릭은 k6_로 시작합니다. k6 measurement에 기록하고 원래 메트릭 이름을 유지합니다.
job_as_measurement = false
measurement_name = "k6"
keep_exist_metric_name = true
설정을 완료한 후 변경 사항을 적용하려면 DataKit을 다시 시작합니다.
K6 설정¶
Remote Write URL이 DataKit을 가리키도록 하고 experimental-prometheus-rw 출력을 사용합니다.
export K6_PROMETHEUS_RW_SERVER_URL="http://<datakit-ip>:9529/prom_remote_write"
export K6_PROMETHEUS_RW_PUSH_INTERVAL="5s"
export K6_PROMETHEUS_RW_TREND_STATS="p(95),p(99),min,max"
k6 run \
-o experimental-prometheus-rw \
--tag benchmark_id="k6-demo-20260917" \
--tag testid="baseline-r300-rep1" \
script.js
DataKit 엔드포인트에 HTTP Basic Authentication이 활성화되어 있으면 K6_PROMETHEUS_RW_USERNAME과 K6_PROMETHEUS_RW_PASSWORD도 설정합니다. 자격 증명은 시크릿 관리 시스템을 통해 주입하고 실제 비밀번호를 스크립트나 명령 기록에 저장하지 마십시오.
K6 스크립트 예시¶
다음 스크립트는 일정한 도착률로 10분 동안 실행됩니다. 대상 URL을 실제 테스트 엔드포인트로 바꾸고 서비스 처리 용량에 맞게 VU 수를 조정하십시오.
import http from 'k6/http';
import { check } from 'k6';
export const options = {
scenarios: {
steady_load: {
executor: 'constant-arrival-rate',
rate: 300,
timeUnit: '1s',
duration: '10m',
preAllocatedVUs: 100,
maxVUs: 300,
},
},
};
export default function () {
const response = http.get(`${__ENV.TARGET_URL}/health`);
check(response, {
'HTTP status is 200': (res) => res.status === 200,
});
}
데이터 검증¶
- K6 콘솔을 확인하여 테스트 중 HTTP 오류나 Remote Write 출력 오류가 발생하지 않았는지 확인합니다.
- Guance에서 메트릭 쿼리를 열고
k6measurement를 선택한 다음benchmark_id와testid로 필터링합니다. - 테스트 중 총 요청 수, 실패율, 평균 소요 시간, P95, P99, 최대 VU가 지속적으로 보고되는지 확인합니다.
- 요청률은 누적 요청 수에서 계산해야 하며 누적 합계를 RPS로 직접 사용해서는 안 됩니다. 쿼리 윈도우는
K6_PROMETHEUS_RW_PUSH_INTERVAL보다 길어야 하며, 그렇지 않으면 요청률 그래프에 빈 지점이 생길 수 있습니다.
메트릭¶
K6 measurement 이름은 k6입니다. 다음 표는 일반적인 K6 부하 테스트 메트릭과 단위 및 의미를 보여 줍니다. 소요 시간 메트릭은 밀리초 단위로 표시됩니다. 비율 메트릭의 원시 값 범위는 0에서 1이며 백분율로 표시할 때 100을 곱합니다.
| 메트릭 | 단위 | 설명 |
|---|---|---|
k6_checks_rate |
%(원시 값: 0-1) |
check 성공 비율. 백분율로 표시할 때 100을 곱합니다. |
k6_data_received_total |
bytes |
K6가 수신한 누적 데이터 양. |
k6_data_sent_total |
bytes |
K6가 전송한 누적 데이터 양. |
k6_http_req_blocked_avg |
ms |
평균 요청 차단 시간. |
k6_http_req_blocked_max |
ms |
최대 요청 차단 시간. |
k6_http_req_blocked_p90 |
ms |
요청 차단 시간 90. |
k6_http_req_blocked_p95 |
ms |
요청 차단 시간 95. |
k6_http_req_blocked_p99 |
ms |
요청 차단 시간 99. |
k6_http_req_connecting_avg |
ms |
평균 TCP 연결 시간. |
k6_http_req_connecting_max |
ms |
최대 TCP 연결 시간. |
k6_http_req_connecting_p90 |
ms |
TCP 연결 시간 90. |
k6_http_req_connecting_p95 |
ms |
TCP 연결 시간 95. |
k6_http_req_connecting_p99 |
ms |
TCP 연결 시간 99. |
k6_http_req_duration_avg |
ms |
평균 HTTP 요청 종단 간 시간. |
k6_http_req_duration_max |
ms |
최대 HTTP 요청 종단 간 시간. |
k6_http_req_duration_p90 |
ms |
HTTP 요청 종단 간 시간 90. |
k6_http_req_duration_p95 |
ms |
HTTP 요청 종단 간 시간 95. |
k6_http_req_duration_p99 |
ms |
HTTP 요청 종단 간 시간 99. |
k6_http_req_failed_rate |
%(원시 값: 0-1) |
HTTP 요청 실패 비율. 백분율로 표시할 때 100을 곱합니다. |
k6_http_req_receiving_avg |
ms |
평균 응답 데이터 수신 시간. |
k6_http_req_receiving_max |
ms |
최대 응답 데이터 수신 시간. |
k6_http_req_receiving_p90 |
ms |
응답 데이터 수신 시간 90. |
k6_http_req_receiving_p95 |
ms |
응답 데이터 수신 시간 95. |
k6_http_req_receiving_p99 |
ms |
응답 데이터 수신 시간 99. |
k6_http_req_sending_avg |
ms |
평균 요청 데이터 전송 시간. |
k6_http_req_sending_max |
ms |
최대 요청 데이터 전송 시간. |
k6_http_req_sending_p90 |
ms |
요청 데이터 전송 시간 90. |
k6_http_req_sending_p95 |
ms |
요청 데이터 전송 시간 95. |
k6_http_req_sending_p99 |
ms |
요청 데이터 전송 시간 99. |
k6_http_req_tls_handshaking_avg |
ms |
평균 TLS 핸드셰이크 시간. |
k6_http_req_tls_handshaking_max |
ms |
최대 TLS 핸드셰이크 시간. |
k6_http_req_tls_handshaking_p90 |
ms |
TLS 핸드셰이크 시간 90. |
k6_http_req_tls_handshaking_p95 |
ms |
TLS 핸드셰이크 시간 95. |
k6_http_req_tls_handshaking_p99 |
ms |
TLS 핸드셰이크 시간 99. |
k6_http_req_waiting_avg |
ms |
평균 서버 응답 대기 시간. |
k6_http_req_waiting_max |
ms |
최대 서버 응답 대기 시간. |
k6_http_req_waiting_p90 |
ms |
서버 응답 대기 시간 90. |
k6_http_req_waiting_p95 |
ms |
서버 응답 대기 시간 95. |
k6_http_req_waiting_p99 |
ms |
서버 응답 대기 시간 99. |
k6_http_reqs_total |
requests |
누적 HTTP 요청 수. 요청률을 계산할 때 이 메트릭의 RATE를 사용합니다. |
k6_iteration_duration_avg |
ms |
평균 시나리오 반복 시간. |
k6_iteration_duration_max |
ms |
최대 시나리오 반복 시간. |
k6_iteration_duration_p90 |
ms |
시나리오 반복 시간 90. |
k6_iteration_duration_p95 |
ms |
시나리오 반복 시간 95. |
k6_iteration_duration_p99 |
ms |
시나리오 반복 시간 99. |
k6_iterations_total |
iterations |
누적 시나리오 반복 횟수. |
k6_vus |
VUs |
현재 VU 수. |
k6_vus_max |
VUs |
테스트 중 최대 VU 수. |
모든 HTTP 메트릭에는 scenario, testid, benchmark_id 등의 태그가 포함됩니다. 요청 수준 메트릭에는 method, url, name, status, error, expected_response가 포함될 수도 있습니다. 서로 다른 부하 테스트 실행의 데이터가 집계되지 않도록 쿼리에서 최소한 benchmark_id와 testid를 필터링해야 합니다.
K6_PROMETHEUS_RW_TREND_STATS에 설정되지 않은 백분위수 메트릭은 기록되지 않습니다. P90, P95 또는 P99가 필요하면 K6를 시작하기 전에 명시적으로 설정하십시오. 예: K6_PROMETHEUS_RW_TREND_STATS="p(90),p(95),p(99),min,max".