84 lines
2.1 KiB
JavaScript
84 lines
2.1 KiB
JavaScript
// k6 load test — POST /v1/track against the local cdp-ingest service.
|
|
//
|
|
// Usage:
|
|
// brew install k6 # one-time
|
|
// k6 run tests/k6/track.js # defaults: 50 CCU, 1m
|
|
//
|
|
// Override at the CLI:
|
|
// k6 run -e WRITE_KEY=xxx -e BASE=http://localhost:3049 \
|
|
// -e VUS=100 -e DURATION=2m tests/k6/track.js
|
|
|
|
import http from 'k6/http';
|
|
import { check } from 'k6';
|
|
import encoding from 'k6/encoding';
|
|
|
|
const BASE = __ENV.BASE ?? 'http://localhost:3049';
|
|
const WRITE_KEY = __ENV.WRITE_KEY ?? 'cdp_dev_writekey_1234567890';
|
|
const VUS = parseInt(__ENV.VUS ?? '50', 10);
|
|
const DURATION = __ENV.DURATION ?? '1m';
|
|
|
|
// Segment-compatible auth: Basic base64(writeKey + ":")
|
|
const AUTH = 'Basic ' + encoding.b64encode(`${WRITE_KEY}:`);
|
|
|
|
export const options = {
|
|
scenarios: {
|
|
constant_load: {
|
|
executor: 'constant-vus',
|
|
vus: VUS,
|
|
duration: DURATION,
|
|
},
|
|
},
|
|
thresholds: {
|
|
http_req_failed: ['rate<0.01'], // < 1% errors
|
|
http_req_duration: ['p(95)<300', 'p(99)<800'],
|
|
checks: ['rate>0.99'],
|
|
},
|
|
};
|
|
|
|
export default function () {
|
|
const now = new Date().toISOString();
|
|
const messageId = `k6_${__VU}_${__ITER}_${Date.now()}`;
|
|
|
|
const payload = JSON.stringify({
|
|
type: 'track',
|
|
messageId,
|
|
anonymousId: `anon_${__VU}`,
|
|
userId: `user_${__VU}@example.com`,
|
|
event: 'k6 Test Event',
|
|
properties: {
|
|
testProp: 'load test',
|
|
vu: __VU,
|
|
iter: __ITER,
|
|
price: 42.5,
|
|
},
|
|
timestamp: now,
|
|
sentAt: now,
|
|
context: {
|
|
library_name: 'k6',
|
|
library_version: '0.1.0',
|
|
ip: '127.0.0.1',
|
|
userAgent: 'k6/loadtest',
|
|
locale: 'en-US',
|
|
page: {
|
|
path: '/',
|
|
host: 'example.com',
|
|
title: 'Example page',
|
|
url: 'https://example.com/',
|
|
},
|
|
},
|
|
});
|
|
|
|
const res = http.post(`${BASE}/v1/track`, payload, {
|
|
headers: {
|
|
'Content-Type': 'application/json',
|
|
Authorization: AUTH,
|
|
},
|
|
});
|
|
|
|
check(res, {
|
|
'status 200': (r) => r.status === 200,
|
|
'body ok': (r) => r.json('ok') === true,
|
|
'fast (<500ms)': (r) => r.timings.duration < 500,
|
|
});
|
|
}
|