feat: Refactor stress test configuration for improved user ramp-up and limit analysis
This commit is contained in:
+51
-22
@@ -1,34 +1,63 @@
|
|||||||
import { chessUserJourney } from '../scenarios/chessUserScenario.js';
|
import { chessUserJourney } from '../scenarios/chessUserScenario.js';
|
||||||
import { thresholds } from '../config.js';
|
import { thresholds } from '../config.js';
|
||||||
|
import { Counter } from 'k6/metrics';
|
||||||
|
|
||||||
const START_USERS = parseInt(__ENV.START_USERS || '2', 10);
|
const START_USERS = parseInt(__ENV.START_USERS || '1', 10);
|
||||||
const USERS_INCREMENT = parseInt(__ENV.USERS_INCREMENT || '2', 10);
|
const MAX_USERS = parseInt(__ENV.MAX_USERS || '100', 10);
|
||||||
const STEPS = parseInt(__ENV.STEPS || '2', 10);
|
const RAMP_DURATION = parseInt(__ENV.RAMP_DURATION || '300', 10);
|
||||||
const STEP_DURATION = parseInt(__ENV.STEP_DURATION || '30', 10);
|
|
||||||
const RAMP_DURATION = parseInt(__ENV.RAMP_DURATION || '10', 10);
|
|
||||||
|
|
||||||
const stages = [];
|
const userLimitCounter = new Counter('user_limit_tracker');
|
||||||
let currentUsers = START_USERS;
|
|
||||||
|
|
||||||
for (let i = 0; i < STEPS; i++) {
|
|
||||||
// Ramp up
|
|
||||||
stages.push({
|
|
||||||
duration: `${RAMP_DURATION}s`,
|
|
||||||
target: currentUsers,
|
|
||||||
});
|
|
||||||
// Hold at level
|
|
||||||
stages.push({
|
|
||||||
duration: `${STEP_DURATION}s`,
|
|
||||||
target: currentUsers,
|
|
||||||
});
|
|
||||||
currentUsers += USERS_INCREMENT;
|
|
||||||
}
|
|
||||||
|
|
||||||
export const options = {
|
export const options = {
|
||||||
stages,
|
stages: [
|
||||||
|
{
|
||||||
|
duration: `${RAMP_DURATION}s`,
|
||||||
|
target: MAX_USERS,
|
||||||
|
},
|
||||||
|
],
|
||||||
thresholds,
|
thresholds,
|
||||||
};
|
};
|
||||||
|
|
||||||
export default function () {
|
export default function () {
|
||||||
chessUserJourney();
|
chessUserJourney();
|
||||||
|
userLimitCounter.add(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
export function handleSummary(data) {
|
||||||
|
const metrics = data.metrics;
|
||||||
|
|
||||||
|
// Find breaking point by analyzing metrics over time
|
||||||
|
let breakingPointUsers = START_USERS;
|
||||||
|
let maxSuccessfulUsers = START_USERS;
|
||||||
|
|
||||||
|
// Check final threshold results
|
||||||
|
const summaryText = JSON.stringify(data.metrics, null, 2);
|
||||||
|
|
||||||
|
// Calculate estimated limit based on error rates
|
||||||
|
if (metrics['http_req_failed']) {
|
||||||
|
const failedReqs = metrics['http_req_failed'].values.count || 0;
|
||||||
|
const totalReqs = metrics['http_reqs']?.values.count || 1;
|
||||||
|
const failureRate = (failedReqs / totalReqs) * 100;
|
||||||
|
|
||||||
|
// Estimate breaking point based on load curve
|
||||||
|
const timeElapsed = RAMP_DURATION;
|
||||||
|
const usersPerSecond = MAX_USERS / timeElapsed;
|
||||||
|
const estimatedBreakingPoint = Math.floor((failureRate / 100) * MAX_USERS);
|
||||||
|
|
||||||
|
if (estimatedBreakingPoint > 0) {
|
||||||
|
maxSuccessfulUsers = Math.max(estimatedBreakingPoint - 1, START_USERS);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Print summary
|
||||||
|
console.log('');
|
||||||
|
console.log('=== STRESS TEST LIMIT ANALYSIS ===');
|
||||||
|
console.log(`Test Duration: ${RAMP_DURATION}s`);
|
||||||
|
console.log(`Ramp Range: ${START_USERS} → ${MAX_USERS} users`);
|
||||||
|
console.log(`Estimated System Limit: ${maxSuccessfulUsers} concurrent users`);
|
||||||
|
console.log('');
|
||||||
|
|
||||||
|
return {
|
||||||
|
stdout: summaryText,
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user