1. Từ đo lường đến ra quyết định: vì sao cần thresholds
Ở mức nền tảng, k6 đo và in số liệu — nhưng con người vẫn phải nhìn và phán đoán. Trong một hệ thống thương mại điện tử với hàng chục pipeline mỗi ngày, việc để người đọc summary bằng mắt là không khả thi. Thresholds biến k6 từ công cụ đo thành công cụ ra quyết định: bạn khai báo các điều kiện pass/fail dựa trên metric, và nếu bất kỳ điều kiện nào bị vi phạm, k6 trả về exit code khác 0 — đủ để một pipeline tự động chặn việc phát hành.
Bài viết này đi sâu vào ba trụ cột nâng cao của k6: thresholds làm cổng pass/fail, scenarios & executors để tạo mô hình tải thực tế (đặc biệt là arrival-rate cho RPS ổn định), và custom metrics để đo những gì có ý nghĩa nghiệp vụ. Cuối cùng ta ghép chúng lại thành một mô hình lưu lượng giống thật cho một sàn TMĐT vào mùa cao điểm.
2. Cú pháp thresholds và ngữ nghĩa vi phạm
Thresholds được khai báo trong options.thresholds, khóa là tên metric và giá trị là mảng biểu thức. Mỗi biểu thức dùng một hàm tổng hợp (p(95), avg, rate, count, max...) so với một ngưỡng. Nếu biểu thức sai vào cuối lần chạy, threshold đó bị coi là thất bại. Ví dụ kinh điển: 'http_req_duration': ['p(95)<500'] nghĩa là 95% request phải nhanh hơn 500ms, nếu không lần chạy trượt.
import http from 'k6/http';
import { check, sleep } from 'k6';
export const options = {
stages: [
{ duration: '30s', target: 200 },
{ duration: '2m', target: 200 },
{ duration: '30s', target: 0 },
],
thresholds: {
// 95% request nhanh hơn 500ms VÀ 99% nhanh hơn 1.5s
http_req_duration: ['p(95)<500', 'p(99)<1500'],
// tỉ lệ lỗi phải dưới 1%
http_req_failed: ['rate<0.01'],
// ít nhất 99% checks phải pass
checks: ['rate>0.99'],
},
};
export default function () {
const res = http.get('https://test.k6.io');
check(res, { 'status 200': (r) => r.status === 200 });
sleep(1);
}Một tính năng mạnh là abortOnFail: nếu một threshold quan trọng bị vi phạm sớm, bạn có thể yêu cầu k6 dừng ngay lần chạy thay vì lãng phí thời gian tiếp tục áp tải lên một hệ thống rõ ràng đã hỏng. Điều này đặc biệt hữu ích trong CI, nơi thời gian pipeline là tiền.
export const options = {
thresholds: {
http_req_failed: [
// dừng ngay lần chạy nếu tỉ lệ lỗi vượt 5% sau 10s đầu
{ threshold: 'rate<0.05', abortOnFail: true, delayAbortEval: '10s' },
],
},
};3. Scenarios: nhiều kịch bản trong một lần chạy
options.scenarios cho phép định nghĩa nhiều kịch bản độc lập chạy song song trong cùng một lần k6 run, mỗi kịch bản có executor riêng, thời điểm bắt đầu riêng, và có thể gọi một hàm exec khác nhau. Đây là bước tiến lớn so với một default function duy nhất: một sàn TMĐT thực tế có người duyệt sản phẩm, người tìm kiếm, người thanh toán — mỗi nhóm có tần suất và tỉ trọng khác nhau.
import http from 'k6/http';
import { sleep } from 'k6';
export const options = {
scenarios: {
browsing: {
executor: 'ramping-vus',
exec: 'browse', // gọi hàm browse()
startVUs: 0,
stages: [
{ duration: '1m', target: 300 },
{ duration: '3m', target: 300 },
],
},
checkout: {
executor: 'constant-arrival-rate',
exec: 'checkout', // gọi hàm checkout()
rate: 50, timeUnit: '1s', // giữ ổn định 50 đơn/giây
duration: '4m',
preAllocatedVUs: 100, maxVUs: 300,
},
},
};
export function browse() {
http.get('https://test.k6.io/products');
sleep(2);
}
export function checkout() {
http.post('https://test.k6.io/checkout', JSON.stringify({ id: 1 }));
sleep(1);
}
💬 Bình luận (0)
Chưa có bình luận nào. Hãy là người đầu tiên!