callman-core 1.36.0 → 1.38.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/assertions/dbAssertions.d.ts +7 -0
- package/dist/assertions/dbAssertions.d.ts.map +1 -0
- package/dist/assertions/dbAssertions.js +191 -0
- package/dist/assertions/dbAssertions.js.map +1 -0
- package/dist/assertions/index.d.ts +4 -0
- package/dist/assertions/index.d.ts.map +1 -0
- package/dist/assertions/index.js +3 -0
- package/dist/assertions/index.js.map +1 -0
- package/dist/assertions/redisAssertions.d.ts +9 -0
- package/dist/assertions/redisAssertions.d.ts.map +1 -0
- package/dist/assertions/redisAssertions.js +159 -0
- package/dist/assertions/redisAssertions.js.map +1 -0
- package/dist/assertions/shared.d.ts +5 -0
- package/dist/assertions/shared.d.ts.map +1 -0
- package/dist/assertions/shared.js +25 -0
- package/dist/assertions/shared.js.map +1 -0
- package/dist/assertions/types.d.ts +46 -0
- package/dist/assertions/types.d.ts.map +1 -0
- package/dist/assertions/types.js +5 -0
- package/dist/assertions/types.js.map +1 -0
- package/dist/host/connections.d.ts +11 -0
- package/dist/host/connections.d.ts.map +1 -1
- package/dist/host/connections.js +22 -0
- package/dist/host/connections.js.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/loadtest/compare.d.ts +32 -0
- package/dist/loadtest/compare.d.ts.map +1 -0
- package/dist/loadtest/compare.js +55 -0
- package/dist/loadtest/compare.js.map +1 -0
- package/dist/loadtest/flow-eval.d.ts +21 -0
- package/dist/loadtest/flow-eval.d.ts.map +1 -0
- package/dist/loadtest/flow-eval.js +199 -0
- package/dist/loadtest/flow-eval.js.map +1 -0
- package/dist/loadtest/from-collection.d.ts +51 -0
- package/dist/loadtest/from-collection.d.ts.map +1 -0
- package/dist/loadtest/from-collection.js +131 -0
- package/dist/loadtest/from-collection.js.map +1 -0
- package/dist/loadtest/histogram.d.ts +41 -0
- package/dist/loadtest/histogram.d.ts.map +1 -0
- package/dist/loadtest/histogram.js +166 -0
- package/dist/loadtest/histogram.js.map +1 -0
- package/dist/loadtest/index.d.ts +18 -0
- package/dist/loadtest/index.d.ts.map +1 -0
- package/dist/loadtest/index.js +14 -0
- package/dist/loadtest/index.js.map +1 -0
- package/dist/loadtest/node/index.d.ts +4 -0
- package/dist/loadtest/node/index.d.ts.map +1 -0
- package/dist/loadtest/node/index.js +4 -0
- package/dist/loadtest/node/index.js.map +1 -0
- package/dist/loadtest/node/metrics.d.ts +84 -0
- package/dist/loadtest/node/metrics.d.ts.map +1 -0
- package/dist/loadtest/node/metrics.js +396 -0
- package/dist/loadtest/node/metrics.js.map +1 -0
- package/dist/loadtest/node/orchestrator.d.ts +24 -0
- package/dist/loadtest/node/orchestrator.d.ts.map +1 -0
- package/dist/loadtest/node/orchestrator.js +363 -0
- package/dist/loadtest/node/orchestrator.js.map +1 -0
- package/dist/loadtest/node/protocol.d.ts +102 -0
- package/dist/loadtest/node/protocol.d.ts.map +1 -0
- package/dist/loadtest/node/protocol.js +17 -0
- package/dist/loadtest/node/protocol.js.map +1 -0
- package/dist/loadtest/node/setup.d.ts +6 -0
- package/dist/loadtest/node/setup.d.ts.map +1 -0
- package/dist/loadtest/node/setup.js +100 -0
- package/dist/loadtest/node/setup.js.map +1 -0
- package/dist/loadtest/node/step-compiler.d.ts +29 -0
- package/dist/loadtest/node/step-compiler.d.ts.map +1 -0
- package/dist/loadtest/node/step-compiler.js +229 -0
- package/dist/loadtest/node/step-compiler.js.map +1 -0
- package/dist/loadtest/node/transport.d.ts +66 -0
- package/dist/loadtest/node/transport.d.ts.map +1 -0
- package/dist/loadtest/node/transport.js +414 -0
- package/dist/loadtest/node/transport.js.map +1 -0
- package/dist/loadtest/node/worker-core.d.ts +77 -0
- package/dist/loadtest/node/worker-core.d.ts.map +1 -0
- package/dist/loadtest/node/worker-core.js +744 -0
- package/dist/loadtest/node/worker-core.js.map +1 -0
- package/dist/loadtest/node/worker.d.ts +2 -0
- package/dist/loadtest/node/worker.d.ts.map +1 -0
- package/dist/loadtest/node/worker.js +28 -0
- package/dist/loadtest/node/worker.js.map +1 -0
- package/dist/loadtest/plan-file.d.ts +91 -0
- package/dist/loadtest/plan-file.d.ts.map +1 -0
- package/dist/loadtest/plan-file.js +134 -0
- package/dist/loadtest/plan-file.js.map +1 -0
- package/dist/loadtest/plan.d.ts +47 -0
- package/dist/loadtest/plan.d.ts.map +1 -0
- package/dist/loadtest/plan.js +259 -0
- package/dist/loadtest/plan.js.map +1 -0
- package/dist/loadtest/report.d.ts +8 -0
- package/dist/loadtest/report.d.ts.map +1 -0
- package/dist/loadtest/report.js +211 -0
- package/dist/loadtest/report.js.map +1 -0
- package/dist/loadtest/thresholds.d.ts +55 -0
- package/dist/loadtest/thresholds.d.ts.map +1 -0
- package/dist/loadtest/thresholds.js +203 -0
- package/dist/loadtest/thresholds.js.map +1 -0
- package/dist/loadtest/types.d.ts +500 -0
- package/dist/loadtest/types.d.ts.map +1 -0
- package/dist/loadtest/types.js +8 -0
- package/dist/loadtest/types.js.map +1 -0
- package/dist/loadtest/validate.d.ts +30 -0
- package/dist/loadtest/validate.d.ts.map +1 -0
- package/dist/loadtest/validate.js +162 -0
- package/dist/loadtest/validate.js.map +1 -0
- package/dist/runner/requestAssertions.d.ts +19 -0
- package/dist/runner/requestAssertions.d.ts.map +1 -0
- package/dist/runner/requestAssertions.js +45 -0
- package/dist/runner/requestAssertions.js.map +1 -0
- package/dist/runner/requestRunner.d.ts.map +1 -1
- package/dist/runner/requestRunner.js +25 -0
- package/dist/runner/requestRunner.js.map +1 -1
- package/dist/runner/runCollection.d.ts.map +1 -1
- package/dist/runner/runCollection.js +4 -1
- package/dist/runner/runCollection.js.map +1 -1
- package/dist/runner/runRequestWithDataset.d.ts.map +1 -1
- package/dist/runner/runRequestWithDataset.js +15 -2
- package/dist/runner/runRequestWithDataset.js.map +1 -1
- package/dist/templating/compile.d.ts +8 -0
- package/dist/templating/compile.d.ts.map +1 -0
- package/dist/templating/compile.js +110 -0
- package/dist/templating/compile.js.map +1 -0
- package/dist/templating/index.d.ts +2 -0
- package/dist/templating/index.d.ts.map +1 -1
- package/dist/templating/index.js +1 -0
- package/dist/templating/index.js.map +1 -1
- package/dist/templating/template-engine.d.ts +6 -0
- package/dist/templating/template-engine.d.ts.map +1 -1
- package/dist/templating/template-engine.js +6 -6
- package/dist/templating/template-engine.js.map +1 -1
- package/dist/types/index.d.ts +10 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist-cjs/assertions/dbAssertions.js +195 -0
- package/dist-cjs/assertions/dbAssertions.js.map +1 -0
- package/dist-cjs/assertions/index.js +8 -0
- package/dist-cjs/assertions/index.js.map +1 -0
- package/dist-cjs/assertions/redisAssertions.js +163 -0
- package/dist-cjs/assertions/redisAssertions.js.map +1 -0
- package/dist-cjs/assertions/shared.js +30 -0
- package/dist-cjs/assertions/shared.js.map +1 -0
- package/dist-cjs/assertions/types.js +6 -0
- package/dist-cjs/assertions/types.js.map +1 -0
- package/dist-cjs/host/connections.js +24 -1
- package/dist-cjs/host/connections.js.map +1 -1
- package/dist-cjs/index.js +2 -0
- package/dist-cjs/index.js.map +1 -1
- package/dist-cjs/loadtest/compare.js +59 -0
- package/dist-cjs/loadtest/compare.js.map +1 -0
- package/dist-cjs/loadtest/flow-eval.js +205 -0
- package/dist-cjs/loadtest/flow-eval.js.map +1 -0
- package/dist-cjs/loadtest/from-collection.js +139 -0
- package/dist-cjs/loadtest/from-collection.js.map +1 -0
- package/dist-cjs/loadtest/histogram.js +171 -0
- package/dist-cjs/loadtest/histogram.js.map +1 -0
- package/dist-cjs/loadtest/index.js +78 -0
- package/dist-cjs/loadtest/index.js.map +1 -0
- package/dist-cjs/loadtest/node/index.js +12 -0
- package/dist-cjs/loadtest/node/index.js.map +1 -0
- package/dist-cjs/loadtest/node/metrics.js +402 -0
- package/dist-cjs/loadtest/node/metrics.js.map +1 -0
- package/dist-cjs/loadtest/node/orchestrator.js +372 -0
- package/dist-cjs/loadtest/node/orchestrator.js.map +1 -0
- package/dist-cjs/loadtest/node/protocol.js +20 -0
- package/dist-cjs/loadtest/node/protocol.js.map +1 -0
- package/dist-cjs/loadtest/node/setup.js +105 -0
- package/dist-cjs/loadtest/node/setup.js.map +1 -0
- package/dist-cjs/loadtest/node/step-compiler.js +234 -0
- package/dist-cjs/loadtest/node/step-compiler.js.map +1 -0
- package/dist-cjs/loadtest/node/transport.js +422 -0
- package/dist-cjs/loadtest/node/transport.js.map +1 -0
- package/dist-cjs/loadtest/node/worker-core.js +749 -0
- package/dist-cjs/loadtest/node/worker-core.js.map +1 -0
- package/dist-cjs/loadtest/node/worker.js +30 -0
- package/dist-cjs/loadtest/node/worker.js.map +1 -0
- package/dist-cjs/loadtest/plan-file.js +143 -0
- package/dist-cjs/loadtest/plan-file.js.map +1 -0
- package/dist-cjs/loadtest/plan.js +271 -0
- package/dist-cjs/loadtest/plan.js.map +1 -0
- package/dist-cjs/loadtest/report.js +220 -0
- package/dist-cjs/loadtest/report.js.map +1 -0
- package/dist-cjs/loadtest/thresholds.js +213 -0
- package/dist-cjs/loadtest/thresholds.js.map +1 -0
- package/dist-cjs/loadtest/types.js +9 -0
- package/dist-cjs/loadtest/types.js.map +1 -0
- package/dist-cjs/loadtest/validate.js +169 -0
- package/dist-cjs/loadtest/validate.js.map +1 -0
- package/dist-cjs/runner/requestAssertions.js +49 -0
- package/dist-cjs/runner/requestAssertions.js.map +1 -0
- package/dist-cjs/runner/requestRunner.js +25 -0
- package/dist-cjs/runner/requestRunner.js.map +1 -1
- package/dist-cjs/runner/runCollection.js +4 -1
- package/dist-cjs/runner/runCollection.js.map +1 -1
- package/dist-cjs/runner/runRequestWithDataset.js +15 -2
- package/dist-cjs/runner/runRequestWithDataset.js.map +1 -1
- package/dist-cjs/templating/compile.js +114 -0
- package/dist-cjs/templating/compile.js.map +1 -0
- package/dist-cjs/templating/index.js +3 -1
- package/dist-cjs/templating/index.js.map +1 -1
- package/dist-cjs/templating/template-engine.js +14 -12
- package/dist-cjs/templating/template-engine.js.map +1 -1
- package/package.json +10 -1
|
@@ -0,0 +1,500 @@
|
|
|
1
|
+
import type { ClientCertificateConfig, RequestAuthConfig } from "../types/index.js";
|
|
2
|
+
export interface LoadStage {
|
|
3
|
+
/** How long this stage lasts. */
|
|
4
|
+
durationMs: number;
|
|
5
|
+
/** VUs (vus executors) or iterations per `timeUnitMs` (arrival-rate executors) at the END of the stage. */
|
|
6
|
+
target: number;
|
|
7
|
+
}
|
|
8
|
+
/** A fixed number of virtual users looping for a while (closed model). */
|
|
9
|
+
export interface ConstantVusExecutor {
|
|
10
|
+
type: "constant-vus";
|
|
11
|
+
vus: number;
|
|
12
|
+
durationMs: number;
|
|
13
|
+
}
|
|
14
|
+
/** VUs ramped through stages (closed model). */
|
|
15
|
+
export interface RampingVusExecutor {
|
|
16
|
+
type: "ramping-vus";
|
|
17
|
+
startVus: number;
|
|
18
|
+
stages: LoadStage[];
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Iterations START at a constant rate regardless of how fast the server
|
|
22
|
+
* answers (open model). If the VUs are all busy when an iteration is due, it
|
|
23
|
+
* is counted as dropped — the generator never silently slows down.
|
|
24
|
+
*/
|
|
25
|
+
export interface ConstantArrivalRateExecutor {
|
|
26
|
+
type: "constant-arrival-rate";
|
|
27
|
+
/** Iterations per `timeUnitMs`. */
|
|
28
|
+
rate: number;
|
|
29
|
+
durationMs: number;
|
|
30
|
+
/** Defaults to 1000 (so `rate` is iterations per second). */
|
|
31
|
+
timeUnitMs?: number;
|
|
32
|
+
/** In-flight iterations the generator may keep. Defaults to `max(rate, 50)`. */
|
|
33
|
+
maxVus?: number;
|
|
34
|
+
}
|
|
35
|
+
/** Arrival rate ramped through stages (open model). */
|
|
36
|
+
export interface RampingArrivalRateExecutor {
|
|
37
|
+
type: "ramping-arrival-rate";
|
|
38
|
+
startRate: number;
|
|
39
|
+
stages: LoadStage[];
|
|
40
|
+
timeUnitMs?: number;
|
|
41
|
+
maxVus?: number;
|
|
42
|
+
}
|
|
43
|
+
export type LoadExecutor = ConstantVusExecutor | RampingVusExecutor | ConstantArrivalRateExecutor | RampingArrivalRateExecutor;
|
|
44
|
+
/**
|
|
45
|
+
* The four profiles the desktop shipped with before the engine moved to
|
|
46
|
+
* core. Kept so saved configs and presets keep loading; they compile to an
|
|
47
|
+
* executor via `legacyProfileToExecutor`.
|
|
48
|
+
*/
|
|
49
|
+
export type LegacyLoadProfile = {
|
|
50
|
+
type: "fixed";
|
|
51
|
+
vus: number;
|
|
52
|
+
durationMs: number;
|
|
53
|
+
} | {
|
|
54
|
+
type: "ramp-up";
|
|
55
|
+
peakVus: number;
|
|
56
|
+
rampDurationMs: number;
|
|
57
|
+
holdDurationMs: number;
|
|
58
|
+
} | {
|
|
59
|
+
type: "spike";
|
|
60
|
+
baselineVus: number;
|
|
61
|
+
spikeVus: number;
|
|
62
|
+
spikeStartAtMs: number;
|
|
63
|
+
spikeDurationMs: number;
|
|
64
|
+
totalDurationMs: number;
|
|
65
|
+
} | {
|
|
66
|
+
type: "peak-hold";
|
|
67
|
+
peakVus: number;
|
|
68
|
+
rampUpDurationMs: number;
|
|
69
|
+
holdDurationMs: number;
|
|
70
|
+
rampDownDurationMs: number;
|
|
71
|
+
};
|
|
72
|
+
export interface VuTimelinePoint {
|
|
73
|
+
atMs: number;
|
|
74
|
+
/** Target VUs (vus executors) or target rate per second (arrival executors). */
|
|
75
|
+
target: number;
|
|
76
|
+
}
|
|
77
|
+
export interface LoadKeyValue {
|
|
78
|
+
key: string;
|
|
79
|
+
value: string;
|
|
80
|
+
enabled?: boolean;
|
|
81
|
+
}
|
|
82
|
+
/** Where an extractor reads from. */
|
|
83
|
+
export type ExtractSource = {
|
|
84
|
+
from: "json";
|
|
85
|
+
path: string;
|
|
86
|
+
} | {
|
|
87
|
+
from: "regex";
|
|
88
|
+
pattern: string;
|
|
89
|
+
group?: number;
|
|
90
|
+
flags?: string;
|
|
91
|
+
} | {
|
|
92
|
+
from: "header";
|
|
93
|
+
name: string;
|
|
94
|
+
} | {
|
|
95
|
+
from: "status";
|
|
96
|
+
} | {
|
|
97
|
+
from: "body";
|
|
98
|
+
};
|
|
99
|
+
export interface LoadExtractor {
|
|
100
|
+
/** Variable the extracted value is stored in (usable as `{{name}}` afterwards). */
|
|
101
|
+
variable: string;
|
|
102
|
+
source: ExtractSource;
|
|
103
|
+
/** Used when the source yields nothing. */
|
|
104
|
+
defaultValue?: string;
|
|
105
|
+
}
|
|
106
|
+
export type CheckOperator = "equals" | "not_equals" | "contains" | "not_contains" | "matches" | "exists" | "not_exists" | "gt" | "gte" | "lt" | "lte";
|
|
107
|
+
export type CheckTarget = {
|
|
108
|
+
on: "status";
|
|
109
|
+
} | {
|
|
110
|
+
on: "duration";
|
|
111
|
+
} | {
|
|
112
|
+
on: "body";
|
|
113
|
+
} | {
|
|
114
|
+
on: "json";
|
|
115
|
+
path: string;
|
|
116
|
+
} | {
|
|
117
|
+
on: "header";
|
|
118
|
+
name: string;
|
|
119
|
+
};
|
|
120
|
+
export interface LoadCheck {
|
|
121
|
+
/** Shown in the report; also the check's identity. */
|
|
122
|
+
name: string;
|
|
123
|
+
target: CheckTarget;
|
|
124
|
+
operator: CheckOperator;
|
|
125
|
+
/** Compared value (templates allowed). Unused for `exists` / `not_exists`. */
|
|
126
|
+
value?: string;
|
|
127
|
+
}
|
|
128
|
+
export interface LoadStep {
|
|
129
|
+
id: string;
|
|
130
|
+
/** The saved request this step was made from (stable across renames; used by plan files). */
|
|
131
|
+
sourceId?: string;
|
|
132
|
+
/** Report name — the per-step breakdown is keyed by it. */
|
|
133
|
+
name: string;
|
|
134
|
+
method: string;
|
|
135
|
+
url: string;
|
|
136
|
+
headers?: LoadKeyValue[];
|
|
137
|
+
query?: LoadKeyValue[];
|
|
138
|
+
/** `:id` path variables. */
|
|
139
|
+
pathVariables?: LoadKeyValue[];
|
|
140
|
+
/** Persisted request body shape (plain JSON value or `{ mode, raw | formEntries }`). */
|
|
141
|
+
body?: unknown;
|
|
142
|
+
auth?: RequestAuthConfig;
|
|
143
|
+
extract?: LoadExtractor[];
|
|
144
|
+
checks?: LoadCheck[];
|
|
145
|
+
/** Status that counts as success ("200", "2xx", "200-299", "404,409"). Default: 200–399. */
|
|
146
|
+
expectedStatus?: string;
|
|
147
|
+
/** Pause after this step, per VU (overrides the run-wide think time). */
|
|
148
|
+
thinkTimeMs?: {
|
|
149
|
+
min: number;
|
|
150
|
+
max: number;
|
|
151
|
+
};
|
|
152
|
+
timeoutMs?: number;
|
|
153
|
+
/** `setup` steps run once before the load starts; their extracted variables are shared. */
|
|
154
|
+
phase?: "setup" | "iteration";
|
|
155
|
+
/** Run only on a VU's first iteration (per-VU login). */
|
|
156
|
+
firstIterationOnly?: boolean;
|
|
157
|
+
/** End this iteration early when the step fails (status outside the expected range or a network error). */
|
|
158
|
+
stopIterationOnFailure?: boolean;
|
|
159
|
+
}
|
|
160
|
+
export type LoadDataset = {
|
|
161
|
+
kind: "rows";
|
|
162
|
+
rows: Array<Record<string, string>>;
|
|
163
|
+
mode: "sequential" | "random";
|
|
164
|
+
} | {
|
|
165
|
+
kind: "fakers";
|
|
166
|
+
/** `generator` is any `{{...}}` expression body, e.g. `$randomEmail` or `random.int(1,100)`. */
|
|
167
|
+
bindings: Array<{
|
|
168
|
+
name: string;
|
|
169
|
+
generator: string;
|
|
170
|
+
}>;
|
|
171
|
+
};
|
|
172
|
+
/**
|
|
173
|
+
* `expression` grammar: `metric{tag:value}:aggregate operator number[unit]`.
|
|
174
|
+
* Examples: `http_req_duration:p(95)<500`, `http_req_failed:rate<0.01`,
|
|
175
|
+
* `http_req_duration{step:login}:avg<=200ms`, `checks:rate>0.99`.
|
|
176
|
+
*/
|
|
177
|
+
export interface LoadThreshold {
|
|
178
|
+
id: string;
|
|
179
|
+
expression: string;
|
|
180
|
+
/** Stop the run as soon as this threshold is violated. */
|
|
181
|
+
abortOnFail?: boolean;
|
|
182
|
+
/** Don't evaluate for abort until this much of the run has elapsed. */
|
|
183
|
+
delayAbortEvalMs?: number;
|
|
184
|
+
}
|
|
185
|
+
export interface ThresholdVerdict {
|
|
186
|
+
threshold: LoadThreshold;
|
|
187
|
+
metric: string;
|
|
188
|
+
aggregate: string;
|
|
189
|
+
operator: string;
|
|
190
|
+
limit: number;
|
|
191
|
+
actual: number | null;
|
|
192
|
+
passed: boolean;
|
|
193
|
+
/** True when the run was stopped because of this threshold. */
|
|
194
|
+
aborted?: boolean;
|
|
195
|
+
/** Human message when it can't be evaluated (unknown metric, no data). */
|
|
196
|
+
note?: string;
|
|
197
|
+
}
|
|
198
|
+
export interface LoadMonitorOptions {
|
|
199
|
+
enabled: boolean;
|
|
200
|
+
/** Capture full detail for 1 of every N successful requests (failures are always captured). */
|
|
201
|
+
sampleEvery?: number;
|
|
202
|
+
}
|
|
203
|
+
export interface LoadTestConfig {
|
|
204
|
+
runId: string;
|
|
205
|
+
name?: string;
|
|
206
|
+
executor: LoadExecutor;
|
|
207
|
+
/** The iteration. Steps with `phase: "setup"` run once first. */
|
|
208
|
+
steps: LoadStep[];
|
|
209
|
+
/** Run-wide variables (environment + globals snapshot). */
|
|
210
|
+
environment?: Record<string, string>;
|
|
211
|
+
dataset?: LoadDataset;
|
|
212
|
+
thresholds?: LoadThreshold[];
|
|
213
|
+
/** Pause between iterations, per VU. */
|
|
214
|
+
thinkTimeMs?: {
|
|
215
|
+
min: number;
|
|
216
|
+
max: number;
|
|
217
|
+
};
|
|
218
|
+
keepAlive?: boolean;
|
|
219
|
+
verifySsl?: boolean;
|
|
220
|
+
timeoutMs?: number;
|
|
221
|
+
/** Redirects followed per request. 0 disables. Default 5. */
|
|
222
|
+
maxRedirects?: number;
|
|
223
|
+
userAgent?: string;
|
|
224
|
+
clientCertificate?: ClientCertificateConfig;
|
|
225
|
+
/** Status codes that count as success when a step has no `expectedStatus`. Default 200–399. */
|
|
226
|
+
okStatus?: {
|
|
227
|
+
min: number;
|
|
228
|
+
max: number;
|
|
229
|
+
};
|
|
230
|
+
monitor?: LoadMonitorOptions;
|
|
231
|
+
/** Keep cookies per virtual user, like a browser session. Default true. */
|
|
232
|
+
cookieJar?: boolean;
|
|
233
|
+
/** Worker threads generating load. Default: min(CPU cores − 1, 8), at least 1. */
|
|
234
|
+
workers?: number;
|
|
235
|
+
/** How long in-flight iterations get to finish after the run ends. Default 5000. */
|
|
236
|
+
gracefulStopMs?: number;
|
|
237
|
+
/**
|
|
238
|
+
* Open-model runs measure latency from when the iteration was SUPPOSED to
|
|
239
|
+
* start, so a stalled server can't hide behind a stalled generator
|
|
240
|
+
* (coordinated omission). The corrected series is reported next to the raw
|
|
241
|
+
* one. Default true.
|
|
242
|
+
*/
|
|
243
|
+
correctCoordinatedOmission?: boolean;
|
|
244
|
+
}
|
|
245
|
+
export interface GeneratorHealth {
|
|
246
|
+
workers: number;
|
|
247
|
+
/** Worst mean event-loop delay across workers, ms. */
|
|
248
|
+
maxLoopLagMs: number;
|
|
249
|
+
/** True when the load generator itself is the bottleneck — results are then unreliable. */
|
|
250
|
+
saturated: boolean;
|
|
251
|
+
/** Requests that waited for a free socket client-side, last interval. */
|
|
252
|
+
blockedRequests: number;
|
|
253
|
+
/** Memory used by the generator (RSS), MB. */
|
|
254
|
+
rssMb: number;
|
|
255
|
+
}
|
|
256
|
+
export interface LoadStepLiveStats {
|
|
257
|
+
stepId: string;
|
|
258
|
+
name: string;
|
|
259
|
+
requests: number;
|
|
260
|
+
failed: number;
|
|
261
|
+
avgMs: number;
|
|
262
|
+
p95Ms: number;
|
|
263
|
+
rps: number;
|
|
264
|
+
checksPassed: number;
|
|
265
|
+
checksFailed: number;
|
|
266
|
+
}
|
|
267
|
+
export interface LoadTickEvent {
|
|
268
|
+
type: "tick";
|
|
269
|
+
runId: string;
|
|
270
|
+
elapsedMs: number;
|
|
271
|
+
/** Phase of the run: ramping through stages or draining after the end. */
|
|
272
|
+
phase: "running" | "draining";
|
|
273
|
+
activeVus: number;
|
|
274
|
+
/** What the plan says the target is right now. */
|
|
275
|
+
targetVus: number;
|
|
276
|
+
/** Arrival-rate runs: target iterations/second right now. */
|
|
277
|
+
targetRate: number | null;
|
|
278
|
+
totalIterations: number;
|
|
279
|
+
totalRequests: number;
|
|
280
|
+
droppedIterations: number;
|
|
281
|
+
rps: number;
|
|
282
|
+
avgRps: number;
|
|
283
|
+
/** Rolling 5 s. */
|
|
284
|
+
p50DurationMs: number;
|
|
285
|
+
p95DurationMs: number;
|
|
286
|
+
p99DurationMs: number;
|
|
287
|
+
avgDurationMs: number;
|
|
288
|
+
errorRate: number;
|
|
289
|
+
errorCount: number;
|
|
290
|
+
checksPassRate: number | null;
|
|
291
|
+
bytesSentPerSec: number;
|
|
292
|
+
bytesReceivedPerSec: number;
|
|
293
|
+
generator: GeneratorHealth;
|
|
294
|
+
steps: LoadStepLiveStats[];
|
|
295
|
+
/** Live threshold status (evaluated on cumulative data). */
|
|
296
|
+
thresholds: Array<{
|
|
297
|
+
id: string;
|
|
298
|
+
expression: string;
|
|
299
|
+
passed: boolean;
|
|
300
|
+
actual: number | null;
|
|
301
|
+
}>;
|
|
302
|
+
timeseriesPoint: LoadTimeseriesPoint;
|
|
303
|
+
}
|
|
304
|
+
export interface LoadTimeseriesPoint {
|
|
305
|
+
atMs: number;
|
|
306
|
+
activeVus: number;
|
|
307
|
+
rps: number;
|
|
308
|
+
p50: number;
|
|
309
|
+
p90: number;
|
|
310
|
+
p95: number;
|
|
311
|
+
p99: number;
|
|
312
|
+
errors: number;
|
|
313
|
+
dropped: number;
|
|
314
|
+
bytesReceivedPerSec: number;
|
|
315
|
+
loopLagMs: number;
|
|
316
|
+
}
|
|
317
|
+
export interface LoadMonitorRecord {
|
|
318
|
+
id: string;
|
|
319
|
+
iterationIndex: number;
|
|
320
|
+
vuId: number;
|
|
321
|
+
stepId: string;
|
|
322
|
+
stepName: string;
|
|
323
|
+
atMs: number;
|
|
324
|
+
method: string;
|
|
325
|
+
url: string;
|
|
326
|
+
status: number;
|
|
327
|
+
ok: boolean;
|
|
328
|
+
durationMs: number;
|
|
329
|
+
bytesSent: number;
|
|
330
|
+
bytesReceived: number;
|
|
331
|
+
errorMessage?: string;
|
|
332
|
+
errorClass?: LoadErrorClass;
|
|
333
|
+
detail?: {
|
|
334
|
+
request: {
|
|
335
|
+
headers: LoadKeyValue[];
|
|
336
|
+
query: LoadKeyValue[];
|
|
337
|
+
body: string;
|
|
338
|
+
bodyTruncated: boolean;
|
|
339
|
+
};
|
|
340
|
+
response: {
|
|
341
|
+
headers: LoadKeyValue[];
|
|
342
|
+
body: string;
|
|
343
|
+
bodyTruncated: boolean;
|
|
344
|
+
};
|
|
345
|
+
};
|
|
346
|
+
}
|
|
347
|
+
export interface LoadMonitorBatchEvent {
|
|
348
|
+
type: "monitor";
|
|
349
|
+
runId: string;
|
|
350
|
+
records: LoadMonitorRecord[];
|
|
351
|
+
}
|
|
352
|
+
export interface LoadErrorEvent {
|
|
353
|
+
type: "error";
|
|
354
|
+
runId: string;
|
|
355
|
+
errorMessage: string;
|
|
356
|
+
}
|
|
357
|
+
/**
|
|
358
|
+
* Who is to blame. `generator` errors mean the load machine ran out of
|
|
359
|
+
* something (file descriptors, ephemeral ports, memory); `server` errors
|
|
360
|
+
* mean the target refused, dropped or timed out; `http` is a normal 4xx/5xx
|
|
361
|
+
* answer; `config` is a request we could not even build.
|
|
362
|
+
*/
|
|
363
|
+
export type LoadErrorClass = "timeout" | "connection_refused" | "connection_reset" | "dns" | "tls" | "generator_limit" | "http_4xx" | "http_5xx" | "body_too_large" | "aborted" | "config" | "other";
|
|
364
|
+
export type LoadErrorBlame = "generator" | "server" | "http" | "config";
|
|
365
|
+
export interface LoadErrorBreakdownEntry {
|
|
366
|
+
errorClass: LoadErrorClass;
|
|
367
|
+
blame: LoadErrorBlame;
|
|
368
|
+
count: number;
|
|
369
|
+
/** One representative message. */
|
|
370
|
+
example: string;
|
|
371
|
+
}
|
|
372
|
+
export interface LatencyStats {
|
|
373
|
+
count: number;
|
|
374
|
+
min: number;
|
|
375
|
+
avg: number;
|
|
376
|
+
max: number;
|
|
377
|
+
p50: number;
|
|
378
|
+
p75: number;
|
|
379
|
+
p90: number;
|
|
380
|
+
p95: number;
|
|
381
|
+
p99: number;
|
|
382
|
+
p999: number;
|
|
383
|
+
}
|
|
384
|
+
export interface LoadStepResult {
|
|
385
|
+
stepId: string;
|
|
386
|
+
name: string;
|
|
387
|
+
method: string;
|
|
388
|
+
url: string;
|
|
389
|
+
requests: number;
|
|
390
|
+
failed: number;
|
|
391
|
+
failedRate: number;
|
|
392
|
+
rps: number;
|
|
393
|
+
duration: LatencyStats;
|
|
394
|
+
checks: Array<{
|
|
395
|
+
name: string;
|
|
396
|
+
passed: number;
|
|
397
|
+
failed: number;
|
|
398
|
+
}>;
|
|
399
|
+
statusCodes: Record<string, number>;
|
|
400
|
+
}
|
|
401
|
+
export interface LoadRunSummary {
|
|
402
|
+
totalRequests: number;
|
|
403
|
+
successCount: number;
|
|
404
|
+
failedCount: number;
|
|
405
|
+
networkErrorCount: number;
|
|
406
|
+
successRate: number;
|
|
407
|
+
totalIterations: number;
|
|
408
|
+
droppedIterations: number;
|
|
409
|
+
avgRps: number;
|
|
410
|
+
peakRps: number;
|
|
411
|
+
peakVus: number;
|
|
412
|
+
durationMs: number;
|
|
413
|
+
bytesSent: number;
|
|
414
|
+
bytesReceived: number;
|
|
415
|
+
checksPassed: number;
|
|
416
|
+
checksFailed: number;
|
|
417
|
+
startedAt: string;
|
|
418
|
+
finishedAt: string;
|
|
419
|
+
}
|
|
420
|
+
export interface LoadHistogramBucket {
|
|
421
|
+
rangeMs: [number, number];
|
|
422
|
+
count: number;
|
|
423
|
+
}
|
|
424
|
+
export interface LoadSlowestRequest {
|
|
425
|
+
iterationIndex: number;
|
|
426
|
+
vuId: number;
|
|
427
|
+
stepId: string;
|
|
428
|
+
stepName: string;
|
|
429
|
+
atMs: number;
|
|
430
|
+
status: number;
|
|
431
|
+
durationMs: number;
|
|
432
|
+
errorMessage?: string;
|
|
433
|
+
row?: Record<string, string>;
|
|
434
|
+
}
|
|
435
|
+
export interface LoadStatusBreakdown {
|
|
436
|
+
"2xx": number;
|
|
437
|
+
"3xx": number;
|
|
438
|
+
"4xx": number;
|
|
439
|
+
"5xx": number;
|
|
440
|
+
/** Network / DNS / TLS / timeout — no HTTP status. */
|
|
441
|
+
"0": number;
|
|
442
|
+
}
|
|
443
|
+
export interface LoadPhaseBreakdown {
|
|
444
|
+
/** Mean per request, ms. */
|
|
445
|
+
blocked: number;
|
|
446
|
+
/** DNS lookup + TCP connect (0 on reused keep-alive connections). */
|
|
447
|
+
connecting: number;
|
|
448
|
+
tls: number;
|
|
449
|
+
sending: number;
|
|
450
|
+
waiting: number;
|
|
451
|
+
receiving: number;
|
|
452
|
+
}
|
|
453
|
+
export interface LoadCompleteEvent {
|
|
454
|
+
type: "complete";
|
|
455
|
+
runId: string;
|
|
456
|
+
summary: LoadRunSummary;
|
|
457
|
+
/** Whole-run request latency (what the thresholds on `http_req_duration` see). */
|
|
458
|
+
duration: LatencyStats;
|
|
459
|
+
/** Open model only: latency measured from the intended start time. */
|
|
460
|
+
correctedDuration: LatencyStats | null;
|
|
461
|
+
iterationDuration: LatencyStats;
|
|
462
|
+
phases: LoadPhaseBreakdown;
|
|
463
|
+
thresholds: ThresholdVerdict[];
|
|
464
|
+
/** The run was stopped by an `abortOnFail` threshold. */
|
|
465
|
+
abortedByThreshold: boolean;
|
|
466
|
+
statusCodes: LoadStatusBreakdown;
|
|
467
|
+
/** Exact status code counts, e.g. { "200": 41234, "503": 12 }. */
|
|
468
|
+
statusCodeCounts: Record<string, number>;
|
|
469
|
+
errors: LoadErrorBreakdownEntry[];
|
|
470
|
+
steps: LoadStepResult[];
|
|
471
|
+
histogramBuckets: LoadHistogramBucket[];
|
|
472
|
+
timeseries: LoadTimeseriesPoint[];
|
|
473
|
+
slowest: LoadSlowestRequest[];
|
|
474
|
+
generator: {
|
|
475
|
+
workers: number;
|
|
476
|
+
maxLoopLagMs: number;
|
|
477
|
+
saturated: boolean;
|
|
478
|
+
peakRssMb: number;
|
|
479
|
+
};
|
|
480
|
+
stoppedByUser: boolean;
|
|
481
|
+
}
|
|
482
|
+
export type LoadTestEvent = LoadTickEvent | LoadMonitorBatchEvent | LoadErrorEvent | LoadCompleteEvent;
|
|
483
|
+
/** The saved shape of a finished run (JSON report, schema v2). */
|
|
484
|
+
export interface LoadTestReport {
|
|
485
|
+
schemaVersion: 2;
|
|
486
|
+
exportedAt: string;
|
|
487
|
+
config: Omit<LoadTestConfig, "dataset"> & {
|
|
488
|
+
dataset?: LoadDataset | {
|
|
489
|
+
kind: "omitted";
|
|
490
|
+
rows: number;
|
|
491
|
+
};
|
|
492
|
+
};
|
|
493
|
+
result: LoadCompleteEvent;
|
|
494
|
+
}
|
|
495
|
+
export interface LoadValidationIssue {
|
|
496
|
+
field: string;
|
|
497
|
+
message: string;
|
|
498
|
+
severity: "error" | "warning";
|
|
499
|
+
}
|
|
500
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/loadtest/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
// Load / stress testing — shared types.
|
|
2
|
+
//
|
|
3
|
+
// This file is the single source of truth for the load-test config, the live
|
|
4
|
+
// events and the final result. It is renderer-safe (types only); the Node-only
|
|
5
|
+
// engine lives in `./node` and is reached through the `callman-core/loadtest`
|
|
6
|
+
// subpath so the desktop renderer bundle never pulls `node:*` modules.
|
|
7
|
+
export {};
|
|
8
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/loadtest/types.ts"],"names":[],"mappings":"AAAA,wCAAwC;AACxC,EAAE;AACF,6EAA6E;AAC7E,+EAA+E;AAC/E,8EAA8E;AAC9E,uEAAuE"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { LoadTestConfig, LoadValidationIssue } from "./types.js";
|
|
2
|
+
export declare const MAX_RUN_DURATION_MS: number;
|
|
3
|
+
export declare const MAX_TARGET = 100000;
|
|
4
|
+
/** Above this a single laptop is very likely to hit descriptor / port limits. */
|
|
5
|
+
export declare const HEAVY_CONCURRENCY = 2000;
|
|
6
|
+
export declare const validateLoadTestConfig: (config: LoadTestConfig) => LoadValidationIssue[];
|
|
7
|
+
export declare const hasBlockingIssues: (issues: readonly LoadValidationIssue[]) => boolean;
|
|
8
|
+
export type SystemImpact = "light" | "moderate" | "heavy" | "extreme";
|
|
9
|
+
export interface LoadEstimate {
|
|
10
|
+
durationMs: number;
|
|
11
|
+
/** Peak concurrent iterations (VUs or max in-flight). */
|
|
12
|
+
peakConcurrency: number;
|
|
13
|
+
/** Peak start rate, iterations/s (arrival plans) or best-case from VUs and the supplied iteration time. */
|
|
14
|
+
peakIterationsPerSec: number;
|
|
15
|
+
totalIterations: number;
|
|
16
|
+
totalRequests: number;
|
|
17
|
+
/** Rough, from a 400 B request. */
|
|
18
|
+
estimatedUploadMb: number;
|
|
19
|
+
impact: SystemImpact;
|
|
20
|
+
/** What the estimate assumed. */
|
|
21
|
+
assumedIterationMs: number;
|
|
22
|
+
}
|
|
23
|
+
export declare const systemImpact: (concurrency: number) => SystemImpact;
|
|
24
|
+
/**
|
|
25
|
+
* `iterationMs` is the expected time of one iteration. Without measurements
|
|
26
|
+
* it is a guess — the UI labels it as such and replaces it with the observed
|
|
27
|
+
* figure after a first run.
|
|
28
|
+
*/
|
|
29
|
+
export declare const estimateLoad: (config: LoadTestConfig, iterationMs?: number) => LoadEstimate;
|
|
30
|
+
//# sourceMappingURL=validate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../../src/loadtest/validate.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAgB,cAAc,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAEpF,eAAO,MAAM,mBAAmB,QAAqB,CAAC;AACtD,eAAO,MAAM,UAAU,SAAU,CAAC;AAClC,iFAAiF;AACjF,eAAO,MAAM,iBAAiB,OAAQ,CAAC;AAiDvC,eAAO,MAAM,sBAAsB,GAAI,QAAQ,cAAc,KAAG,mBAAmB,EAwDlF,CAAC;AAEF,eAAO,MAAM,iBAAiB,GAAI,QAAQ,SAAS,mBAAmB,EAAE,KAAG,OACvB,CAAC;AAIrD,MAAM,MAAM,YAAY,GAAG,OAAO,GAAG,UAAU,GAAG,OAAO,GAAG,SAAS,CAAC;AAEtE,MAAM,WAAW,YAAY;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,yDAAyD;IACzD,eAAe,EAAE,MAAM,CAAC;IACxB,2GAA2G;IAC3G,oBAAoB,EAAE,MAAM,CAAC;IAC7B,eAAe,EAAE,MAAM,CAAC;IACxB,aAAa,EAAE,MAAM,CAAC;IACtB,mCAAmC;IACnC,iBAAiB,EAAE,MAAM,CAAC;IAC1B,MAAM,EAAE,YAAY,CAAC;IACrB,iCAAiC;IACjC,kBAAkB,EAAE,MAAM,CAAC;CAC5B;AAED,eAAO,MAAM,YAAY,GAAI,aAAa,MAAM,KAAG,YAKlD,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,YAAY,GAAI,QAAQ,cAAc,EAAE,oBAAiB,KAAG,YA8BxE,CAAC"}
|