CYBERSOFT
Đăng nhập

k6 nâng cao: thresholds, scenarios và custom metrics

Chuyên nâng caok6/PerfNâng cao
🗓 1 tháng trước19 phút đọc·👁 176 lượt xem👤 176 người đọc

Thresholds làm cổng pass/fail (exit code), scenarios & executors (arrival-rate cho RPS thật), custom metrics Counter/Gauge/Rate/Trend, tags & groups, tham số hóa dữ liệu với SharedArray và mô hình hóa lưu lượng giống thật — trên domain TMĐT.

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.

checks nói 'bao nhiêu phần trăm điều kiện đúng'. thresholds nói 'lần chạy này ĐẠT hay TRƯỢT'. Chỉ thresholds mới ảnh hưởng exit code.

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.

javascript
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.

javascript
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' },
    ],
  },
};
⚠️ Đặt ngưỡng theo SLA nghiệp vụ thật, không phải con số cho đẹp. Ngưỡng quá lỏng thì cổng vô dụng; quá chặt thì pipeline đỏ liên tục và đội sẽ bỏ qua nó.

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.

javascript
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);
}
🔒

Nội dung bị khoá

Bạn đang xem bản xem trước. Đăng nhập để mở khoá toàn bộ bài viết và tất cả tài liệu Tester/QA.

Đã xem 24% nội dung
  • Đọc trọn vẹn mọi bài viết
  • Lưu bài & ghi chú cá nhân
  • Theo dõi tiến độ đã đọc
  • Luyện phỏng vấn, ISTQB, Mock
Đăng nhập để đọc tiếp

Chưa có mã? Lấy mã qua Fanpage / Zalo CyberSoft.

0

💬 Bình luận (0)

Bạn có thể đọc mọi bình luận. Đăng nhập để bình luận

Chưa có bình luận nào. Hãy là người đầu tiên!