0ef4c624c5
initial test from Ed's nuc:
metric pctl baseline current delta status
-----------------------------------------------------------------------------------------------
folder_cascade.list_depth1 p50 0.3ms 0.3ms -6.3% ok
folder_cascade.list_depth1 p95 2.3ms 0.5ms -75.7% ok
folder_cascade.list_depth1 p99 4.7ms 2.5ms -48.1% ok
folder_cascade.list_depth4 p50 0.4ms 0.3ms -10.0% ok
folder_cascade.list_depth4 p95 0.9ms 0.6ms -31.2% ok
folder_cascade.list_depth4 p99 2.4ms 1.0ms -56.7% ok
folder_cascade.list_depth8 p50 0.3ms 0.3ms -8.8% ok
folder_cascade.list_depth8 p95 0.6ms 0.5ms -22.2% ok
folder_cascade.list_depth8 p99 1.9ms 0.5ms -71.5% ok
folder_cascade.list_depth_deep p50 0.3ms 0.3ms -5.0% ok
folder_cascade.list_depth_deep p95 0.6ms 0.5ms -18.6% ok
folder_cascade.list_depth_deep p99 2.0ms 0.7ms -67.2% ok
share_cascade_rebac.list_grants p50 0.4ms 0.3ms -27.6% ok
share_cascade_rebac.list_grants p95 1.2ms 0.5ms -57.0% ok
share_cascade_rebac.list_grants p99 1.7ms 1.1ms -36.7% ok
share_cascade_rebac.fetch_as_grantee_depth1 p50 0.5ms 0.5ms -11.1% ok
share_cascade_rebac.fetch_as_grantee_depth1 p95 1.1ms 0.7ms -41.2% ok
share_cascade_rebac.fetch_as_grantee_depth1 p99 3.0ms 1.3ms -58.3% ok
share_cascade_rebac.fetch_as_grantee_depth4 p50 0.5ms 0.5ms -13.7% ok
share_cascade_rebac.fetch_as_grantee_depth4 p95 1.4ms 0.7ms -50.5% ok
share_cascade_rebac.fetch_as_grantee_depth4 p99 2.2ms 1.1ms -49.3% ok
share_cascade_rebac.fetch_as_grantee_depth8 p50 0.5ms 0.4ms -16.0% ok
share_cascade_rebac.fetch_as_grantee_depth8 p95 0.9ms 0.7ms -26.1% ok
share_cascade_rebac.fetch_as_grantee_depth8 p99 1.5ms 0.9ms -40.1% ok
share_cascade_rebac.fetch_as_grantee_depth_deep p50 0.5ms 0.4ms -17.3% ok
share_cascade_rebac.fetch_as_grantee_depth_deep p95 1.0ms 0.7ms -31.2% ok
share_cascade_rebac.fetch_as_grantee_depth_deep p99 1.6ms 0.8ms -49.4% ok
subject_group_nested.fetch_as_member_depth1 p50 0.5ms 0.4ms -8.4% ok
subject_group_nested.fetch_as_member_depth1 p95 0.6ms 0.6ms -10.2% ok
subject_group_nested.fetch_as_member_depth1 p99 1.4ms 0.6ms -55.2% ok
subject_group_nested.fetch_as_member_depth4 p50 0.5ms 0.5ms -7.9% ok
subject_group_nested.fetch_as_member_depth4 p95 0.6ms 0.6ms -4.0% ok
subject_group_nested.fetch_as_member_depth4 p99 0.7ms 0.6ms -2.2% ok
subject_group_nested.fetch_as_member_depth8 p50 0.5ms 0.4ms -8.9% ok
subject_group_nested.fetch_as_member_depth8 p95 0.5ms 0.6ms +7.1% ok
subject_group_nested.fetch_as_member_depth8 p99 0.6ms 0.7ms +10.3% ok
subject_group_nested.fetch_as_member_depth_deep p50 0.5ms 0.4ms -7.6% ok
subject_group_nested.fetch_as_member_depth_deep p95 0.6ms 0.5ms -11.9% ok
subject_group_nested.fetch_as_member_depth_deep p99 0.6ms 0.7ms +8.9% ok
41 lines
1.5 KiB
JavaScript
41 lines
1.5 KiB
JavaScript
#!/usr/bin/env node
|
|
// merge-summaries.mjs — combine multiple k6 --summary-export outputs into
|
|
// one. Used because k6 accepts a single script per invocation, but our
|
|
// regression-diff tooling (compare.mjs, bake-baseline.mjs) expects one
|
|
// summary per run.
|
|
//
|
|
// Per-scenario summaries are disjoint in their metric tags
|
|
// (folder_cascade.* vs share_cascade_rebac.* vs subject_group_nested.*),
|
|
// so merging is just a union of the `metrics` maps. The top-level
|
|
// envelope (root_group, options, etc.) is taken from the first input.
|
|
//
|
|
// Usage:
|
|
// node merge-summaries.mjs <in1.json> [in2.json …] <out.json>
|
|
|
|
import { readFileSync, writeFileSync } from 'node:fs';
|
|
import { argv, exit } from 'node:process';
|
|
|
|
if (argv.length < 5) {
|
|
console.error('usage: merge-summaries.mjs <in1.json> [in2.json …] <out.json>');
|
|
exit(2);
|
|
}
|
|
|
|
const inputs = argv.slice(2, -1);
|
|
const output = argv[argv.length - 1];
|
|
|
|
const merged = JSON.parse(readFileSync(inputs[0], 'utf8'));
|
|
merged.metrics = { ...merged.metrics };
|
|
|
|
for (const path of inputs.slice(1)) {
|
|
const next = JSON.parse(readFileSync(path, 'utf8'));
|
|
for (const [k, v] of Object.entries(next.metrics ?? {})) {
|
|
// If two scenarios both report a global metric (e.g. http_req_duration
|
|
// with no op tag), the second wins — these aren't gated by baseline.json,
|
|
// so it's only the per-`op` metrics that need to be preserved precisely.
|
|
merged.metrics[k] = v;
|
|
}
|
|
}
|
|
|
|
writeFileSync(output, `${JSON.stringify(merged, null, 2)}\n`);
|
|
console.log(`merged ${inputs.length} summaries → ${output}`);
|