@browserstack/mcp-server 1.4.0-beta.2 → 1.5.0-beta.1
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/capability/loadtesting.capability-index.json +1754 -0
- package/capability/tm.capability-index.json +19793 -0
- package/dist/index.js +2 -5
- package/dist/server-factory.js +5 -5
- package/dist/tools/accessibility.js +2 -5
- package/dist/tools/capability-registry/bind.d.ts +29 -0
- package/dist/tools/capability-registry/bind.js +134 -0
- package/dist/tools/capability-registry/config.d.ts +62 -0
- package/dist/tools/capability-registry/config.js +218 -0
- package/dist/tools/capability-registry/discovery.d.ts +44 -0
- package/dist/tools/capability-registry/discovery.js +99 -0
- package/dist/tools/capability-registry/egress.d.ts +44 -0
- package/dist/tools/capability-registry/egress.js +128 -0
- package/dist/tools/capability-registry/index-loader.d.ts +119 -0
- package/dist/tools/capability-registry/index-loader.js +314 -0
- package/dist/tools/capability-registry/register.d.ts +34 -0
- package/dist/tools/capability-registry/register.js +354 -0
- package/dist/tools/capability-registry/resolve.d.ts +38 -0
- package/dist/tools/capability-registry/resolve.js +45 -0
- package/dist/tools/capability-registry/search.d.ts +65 -0
- package/dist/tools/capability-registry/search.js +342 -0
- package/dist/tools/capability-registry/types.d.ts +208 -0
- package/dist/tools/capability-registry/types.js +33 -0
- package/dist/tools/get-failure-logs.js +1 -3
- package/dist/tools/rca-agent.js +2 -5
- package/dist/tools/selfheal.js +2 -5
- package/dist/tools/testmanagement.js +15 -33
- package/package.json +3 -2
- package/dist/tools/ask-browserstack/central-oauth.d.ts +0 -114
- package/dist/tools/ask-browserstack/central-oauth.js +0 -271
- package/dist/tools/ask-browserstack/config.d.ts +0 -96
- package/dist/tools/ask-browserstack/config.js +0 -134
- package/dist/tools/ask-browserstack/egress.d.ts +0 -34
- package/dist/tools/ask-browserstack/egress.js +0 -31
- package/dist/tools/ask-browserstack/register.d.ts +0 -61
- package/dist/tools/ask-browserstack/register.js +0 -403
- package/dist/tools/ask-browserstack/relay.d.ts +0 -201
- package/dist/tools/ask-browserstack/relay.js +0 -577
- package/dist/tools/ask-browserstack/stream.d.ts +0 -116
- package/dist/tools/ask-browserstack/stream.js +0 -237
- package/dist/tools/ask-browserstack/types.d.ts +0 -196
- package/dist/tools/ask-browserstack/types.js +0 -10
- package/dist/tools/tool-handoff.d.ts +0 -37
- package/dist/tools/tool-handoff.js +0 -47
|
@@ -0,0 +1,1754 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schema_version": 1,
|
|
3
|
+
"version": "1.0",
|
|
4
|
+
"build_id": "43eba70_2026-09-02T14:26:51Z",
|
|
5
|
+
"loadtesting": {
|
|
6
|
+
"summary": "Load and performance testing: run k6, JMeter, Gatling and Locust load tests at scale. List and inspect projects and load tests; create, update, start, stop and monitor runs; read run reports, AI insights and historical trends; compare runs; and check VU-hour quota and cost estimates. Test definitions, runs and their results live here. Account plan and billing do not — only VU-hour entitlement is exposed, via quota.",
|
|
7
|
+
"base_url": "https://load-api.browserstack.com",
|
|
8
|
+
"auth": {
|
|
9
|
+
"type": "http",
|
|
10
|
+
"scheme": "basic"
|
|
11
|
+
},
|
|
12
|
+
"capabilities": [
|
|
13
|
+
{
|
|
14
|
+
"method": "GET",
|
|
15
|
+
"path": "/api/v1/agent/platform/status",
|
|
16
|
+
"mode": "read",
|
|
17
|
+
"entity": "platform",
|
|
18
|
+
"intent": "Check whether the Load Testing service is operational — use this if calls are failing or to confirm availability before starting work.",
|
|
19
|
+
"guidance": [
|
|
20
|
+
"Always returns HTTP 200; read platformState (operational|degraded), not the status code.",
|
|
21
|
+
"Shallow dependency probe (database, redis) — it does not check a specific test or run."
|
|
22
|
+
],
|
|
23
|
+
"returns": [
|
|
24
|
+
"platformState",
|
|
25
|
+
"components",
|
|
26
|
+
"checkedAt"
|
|
27
|
+
],
|
|
28
|
+
"responses": {
|
|
29
|
+
"200": {
|
|
30
|
+
"$response": "Success"
|
|
31
|
+
},
|
|
32
|
+
"400": {
|
|
33
|
+
"$response": "BadRequest"
|
|
34
|
+
},
|
|
35
|
+
"401": {
|
|
36
|
+
"$response": "Unauthorized"
|
|
37
|
+
},
|
|
38
|
+
"500": {
|
|
39
|
+
"$response": "InternalServerError"
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
},
|
|
43
|
+
{
|
|
44
|
+
"method": "GET",
|
|
45
|
+
"path": "/api/v1/agent/projects",
|
|
46
|
+
"mode": "read",
|
|
47
|
+
"entity": "project",
|
|
48
|
+
"query": [
|
|
49
|
+
{
|
|
50
|
+
"name": "limit",
|
|
51
|
+
"type": "integer",
|
|
52
|
+
"description": "Max items to return (1-100, default 50)."
|
|
53
|
+
},
|
|
54
|
+
{
|
|
55
|
+
"name": "cursor",
|
|
56
|
+
"type": "string",
|
|
57
|
+
"description": "Opaque pagination cursor from a previous response's nextCursor; pass back verbatim."
|
|
58
|
+
},
|
|
59
|
+
{
|
|
60
|
+
"name": "search",
|
|
61
|
+
"type": "string",
|
|
62
|
+
"description": "Filter projects by name (<=200 chars)."
|
|
63
|
+
},
|
|
64
|
+
{
|
|
65
|
+
"name": "fields",
|
|
66
|
+
"type": "string",
|
|
67
|
+
"description": "Comma-separated response fields to include."
|
|
68
|
+
}
|
|
69
|
+
],
|
|
70
|
+
"intent": "List the caller's load-testing projects, most recently active first — use this to find a projectId or answer 'what projects do I have?'",
|
|
71
|
+
"guidance": [
|
|
72
|
+
"projectId from here is required by listLoadTests and createLoadTest.",
|
|
73
|
+
"Page with cursor + limit; nextCursor is opaque."
|
|
74
|
+
],
|
|
75
|
+
"returns": [
|
|
76
|
+
"projects",
|
|
77
|
+
"hasMore",
|
|
78
|
+
"nextCursor"
|
|
79
|
+
],
|
|
80
|
+
"responses": {
|
|
81
|
+
"200": {
|
|
82
|
+
"$response": "Success"
|
|
83
|
+
},
|
|
84
|
+
"400": {
|
|
85
|
+
"$response": "BadRequest"
|
|
86
|
+
},
|
|
87
|
+
"401": {
|
|
88
|
+
"$response": "Unauthorized"
|
|
89
|
+
},
|
|
90
|
+
"500": {
|
|
91
|
+
"$response": "InternalServerError"
|
|
92
|
+
}
|
|
93
|
+
},
|
|
94
|
+
"paginated": true,
|
|
95
|
+
"max_page_size": 100
|
|
96
|
+
},
|
|
97
|
+
{
|
|
98
|
+
"method": "GET",
|
|
99
|
+
"path": "/api/v1/agent/projects/{projectId}/loadTests",
|
|
100
|
+
"mode": "read",
|
|
101
|
+
"entity": "loadTest",
|
|
102
|
+
"path_params": [
|
|
103
|
+
{
|
|
104
|
+
"name": "projectId",
|
|
105
|
+
"type": "integer",
|
|
106
|
+
"required": true
|
|
107
|
+
}
|
|
108
|
+
],
|
|
109
|
+
"query": [
|
|
110
|
+
{
|
|
111
|
+
"name": "limit",
|
|
112
|
+
"type": "integer",
|
|
113
|
+
"description": "Max items to return (1-100, default 50)."
|
|
114
|
+
},
|
|
115
|
+
{
|
|
116
|
+
"name": "cursor",
|
|
117
|
+
"type": "string",
|
|
118
|
+
"description": "Opaque pagination cursor from a previous response's nextCursor; pass back verbatim."
|
|
119
|
+
},
|
|
120
|
+
{
|
|
121
|
+
"name": "testType",
|
|
122
|
+
"type": "string",
|
|
123
|
+
"values": [
|
|
124
|
+
"plu",
|
|
125
|
+
"blu",
|
|
126
|
+
"hybrid"
|
|
127
|
+
],
|
|
128
|
+
"description": "Filter by test type."
|
|
129
|
+
},
|
|
130
|
+
{
|
|
131
|
+
"name": "framework",
|
|
132
|
+
"type": "string",
|
|
133
|
+
"values": [
|
|
134
|
+
"k6",
|
|
135
|
+
"jmeter",
|
|
136
|
+
"gatling",
|
|
137
|
+
"locust"
|
|
138
|
+
],
|
|
139
|
+
"description": "Filter by framework."
|
|
140
|
+
},
|
|
141
|
+
{
|
|
142
|
+
"name": "tag",
|
|
143
|
+
"type": "string",
|
|
144
|
+
"description": "Filter by tag."
|
|
145
|
+
},
|
|
146
|
+
{
|
|
147
|
+
"name": "search",
|
|
148
|
+
"type": "string",
|
|
149
|
+
"description": "Filter by test name."
|
|
150
|
+
},
|
|
151
|
+
{
|
|
152
|
+
"name": "updatedSince",
|
|
153
|
+
"type": "string",
|
|
154
|
+
"description": "ISO-8601 timestamp; only tests updated after it.",
|
|
155
|
+
"example": "2026-08-01T00:00:00Z"
|
|
156
|
+
}
|
|
157
|
+
],
|
|
158
|
+
"intent": "List the load tests in a project — use this to find a testId or browse tests, optionally filtered by type, framework, tag or recent activity.",
|
|
159
|
+
"guidance": [
|
|
160
|
+
"Resolve projectId via listLoadTestProjects first.",
|
|
161
|
+
"The numeric testId returned here is what getLoadTest and startLoadTestRun need — not a runId.",
|
|
162
|
+
"lastRun summarises the most recent execution when present."
|
|
163
|
+
],
|
|
164
|
+
"returns": [
|
|
165
|
+
"tests",
|
|
166
|
+
"hasMore",
|
|
167
|
+
"nextCursor"
|
|
168
|
+
],
|
|
169
|
+
"responses": {
|
|
170
|
+
"200": {
|
|
171
|
+
"$response": "Success"
|
|
172
|
+
},
|
|
173
|
+
"400": {
|
|
174
|
+
"$response": "BadRequest"
|
|
175
|
+
},
|
|
176
|
+
"401": {
|
|
177
|
+
"$response": "Unauthorized"
|
|
178
|
+
},
|
|
179
|
+
"404": {
|
|
180
|
+
"$response": "NotFound"
|
|
181
|
+
},
|
|
182
|
+
"500": {
|
|
183
|
+
"$response": "InternalServerError"
|
|
184
|
+
}
|
|
185
|
+
},
|
|
186
|
+
"paginated": true,
|
|
187
|
+
"max_page_size": 100
|
|
188
|
+
},
|
|
189
|
+
{
|
|
190
|
+
"method": "GET",
|
|
191
|
+
"path": "/api/v1/agent/projects/{projectId}/trends",
|
|
192
|
+
"mode": "read",
|
|
193
|
+
"entity": "trend",
|
|
194
|
+
"path_params": [
|
|
195
|
+
{
|
|
196
|
+
"name": "projectId",
|
|
197
|
+
"type": "integer",
|
|
198
|
+
"required": true
|
|
199
|
+
}
|
|
200
|
+
],
|
|
201
|
+
"query": [
|
|
202
|
+
{
|
|
203
|
+
"name": "windowRuns",
|
|
204
|
+
"type": "integer",
|
|
205
|
+
"description": "How many recent runs to aggregate (1-100, default 10)."
|
|
206
|
+
},
|
|
207
|
+
{
|
|
208
|
+
"name": "aggregation",
|
|
209
|
+
"type": "string",
|
|
210
|
+
"values": [
|
|
211
|
+
"perRun"
|
|
212
|
+
],
|
|
213
|
+
"description": "Aggregation granularity. Only perRun is supported today."
|
|
214
|
+
},
|
|
215
|
+
{
|
|
216
|
+
"name": "verdictFilter",
|
|
217
|
+
"type": "string",
|
|
218
|
+
"values": [
|
|
219
|
+
"passed",
|
|
220
|
+
"failed",
|
|
221
|
+
"all"
|
|
222
|
+
],
|
|
223
|
+
"description": "Restrict to runs of this verdict."
|
|
224
|
+
},
|
|
225
|
+
{
|
|
226
|
+
"name": "metrics",
|
|
227
|
+
"type": "string",
|
|
228
|
+
"description": "Comma-separated dotted metric names or @ aliases (e.g. @vitals, @all). Resolve valid names via getLoadTestMetricsManifest."
|
|
229
|
+
},
|
|
230
|
+
{
|
|
231
|
+
"name": "sinceIso",
|
|
232
|
+
"type": "string",
|
|
233
|
+
"description": "ISO-8601 lower bound.",
|
|
234
|
+
"example": "2026-08-01T00:00:00Z"
|
|
235
|
+
},
|
|
236
|
+
{
|
|
237
|
+
"name": "untilIso",
|
|
238
|
+
"type": "string",
|
|
239
|
+
"description": "ISO-8601 upper bound."
|
|
240
|
+
}
|
|
241
|
+
],
|
|
242
|
+
"intent": "Show how a project's load-test metrics trend across recent runs — use this for 'is performance getting better or worse across this project?'",
|
|
243
|
+
"guidance": [
|
|
244
|
+
"metrics accepts dotted names or @ aliases; @vitals / @all expand to metric sets.",
|
|
245
|
+
"windowRuns bounds how many recent runs are aggregated."
|
|
246
|
+
],
|
|
247
|
+
"returns": [
|
|
248
|
+
"metrics"
|
|
249
|
+
],
|
|
250
|
+
"responses": {
|
|
251
|
+
"200": {
|
|
252
|
+
"$response": "Success"
|
|
253
|
+
},
|
|
254
|
+
"400": {
|
|
255
|
+
"$response": "BadRequest"
|
|
256
|
+
},
|
|
257
|
+
"401": {
|
|
258
|
+
"$response": "Unauthorized"
|
|
259
|
+
},
|
|
260
|
+
"404": {
|
|
261
|
+
"$response": "NotFound"
|
|
262
|
+
},
|
|
263
|
+
"500": {
|
|
264
|
+
"$response": "InternalServerError"
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
},
|
|
268
|
+
{
|
|
269
|
+
"method": "GET",
|
|
270
|
+
"path": "/api/v1/agent/projects/{projectId}/runs",
|
|
271
|
+
"mode": "read",
|
|
272
|
+
"entity": "run",
|
|
273
|
+
"path_params": [
|
|
274
|
+
{
|
|
275
|
+
"name": "projectId",
|
|
276
|
+
"type": "integer",
|
|
277
|
+
"required": true
|
|
278
|
+
}
|
|
279
|
+
],
|
|
280
|
+
"query": [
|
|
281
|
+
{
|
|
282
|
+
"name": "limit",
|
|
283
|
+
"type": "integer",
|
|
284
|
+
"description": "Max items to return (1-100, default 50)."
|
|
285
|
+
},
|
|
286
|
+
{
|
|
287
|
+
"name": "cursor",
|
|
288
|
+
"type": "string",
|
|
289
|
+
"description": "Opaque pagination cursor from a previous response's nextCursor; pass back verbatim."
|
|
290
|
+
},
|
|
291
|
+
{
|
|
292
|
+
"name": "status",
|
|
293
|
+
"type": "string",
|
|
294
|
+
"values": [
|
|
295
|
+
"active",
|
|
296
|
+
"terminal",
|
|
297
|
+
"all"
|
|
298
|
+
],
|
|
299
|
+
"description": "Filter by lifecycle state."
|
|
300
|
+
},
|
|
301
|
+
{
|
|
302
|
+
"name": "verdict",
|
|
303
|
+
"type": "string",
|
|
304
|
+
"values": [
|
|
305
|
+
"passed",
|
|
306
|
+
"failed",
|
|
307
|
+
"error"
|
|
308
|
+
],
|
|
309
|
+
"description": "Filter by run verdict."
|
|
310
|
+
},
|
|
311
|
+
{
|
|
312
|
+
"name": "startedBy",
|
|
313
|
+
"type": "string",
|
|
314
|
+
"description": "Filter by the user id that started the run."
|
|
315
|
+
},
|
|
316
|
+
{
|
|
317
|
+
"name": "sinceIso",
|
|
318
|
+
"type": "string",
|
|
319
|
+
"description": "ISO-8601 lower bound.",
|
|
320
|
+
"example": "2026-08-01T00:00:00Z"
|
|
321
|
+
},
|
|
322
|
+
{
|
|
323
|
+
"name": "untilIso",
|
|
324
|
+
"type": "string",
|
|
325
|
+
"description": "ISO-8601 upper bound."
|
|
326
|
+
},
|
|
327
|
+
{
|
|
328
|
+
"name": "hadSlaBreach",
|
|
329
|
+
"type": "boolean",
|
|
330
|
+
"description": "Filter to runs that did / did not breach SLA."
|
|
331
|
+
}
|
|
332
|
+
],
|
|
333
|
+
"intent": "List the execution history across every load test in a project — newest first, paginated. Use for 'what ran last week in this project?' or to find runs across tests to compare.",
|
|
334
|
+
"guidance": [
|
|
335
|
+
"Returns run metadata only, not metrics — use getLoadTestRunReport for a run's KPIs.",
|
|
336
|
+
"Page with cursor + limit; nextCursor is opaque.",
|
|
337
|
+
"For a single test's history use /loadTests/{testId}/runs; for currently-live runs use /loadTests/runs/active."
|
|
338
|
+
],
|
|
339
|
+
"returns": [
|
|
340
|
+
"runs",
|
|
341
|
+
"hasMore",
|
|
342
|
+
"nextCursor"
|
|
343
|
+
],
|
|
344
|
+
"responses": {
|
|
345
|
+
"200": {
|
|
346
|
+
"$response": "Success"
|
|
347
|
+
},
|
|
348
|
+
"400": {
|
|
349
|
+
"$response": "BadRequest"
|
|
350
|
+
},
|
|
351
|
+
"401": {
|
|
352
|
+
"$response": "Unauthorized"
|
|
353
|
+
},
|
|
354
|
+
"404": {
|
|
355
|
+
"$response": "NotFound"
|
|
356
|
+
},
|
|
357
|
+
"500": {
|
|
358
|
+
"$response": "InternalServerError"
|
|
359
|
+
}
|
|
360
|
+
},
|
|
361
|
+
"paginated": true,
|
|
362
|
+
"max_page_size": 100
|
|
363
|
+
},
|
|
364
|
+
{
|
|
365
|
+
"method": "GET",
|
|
366
|
+
"path": "/api/v1/agent/loadTests/runs/active",
|
|
367
|
+
"mode": "read",
|
|
368
|
+
"entity": "run",
|
|
369
|
+
"query": [
|
|
370
|
+
{
|
|
371
|
+
"name": "limit",
|
|
372
|
+
"type": "integer",
|
|
373
|
+
"description": "Max items to return (1-200, default 50)."
|
|
374
|
+
},
|
|
375
|
+
{
|
|
376
|
+
"name": "minElapsedSec",
|
|
377
|
+
"type": "integer",
|
|
378
|
+
"description": "Only runs elapsed at least this many seconds."
|
|
379
|
+
},
|
|
380
|
+
{
|
|
381
|
+
"name": "projectId",
|
|
382
|
+
"type": "integer",
|
|
383
|
+
"description": "Restrict to a project."
|
|
384
|
+
},
|
|
385
|
+
{
|
|
386
|
+
"name": "userId",
|
|
387
|
+
"type": "integer",
|
|
388
|
+
"description": "Restrict to runs started by a user."
|
|
389
|
+
}
|
|
390
|
+
],
|
|
391
|
+
"intent": "List load-test runs currently executing — use this for 'what's running right now?' or to find a runId to stop or monitor.",
|
|
392
|
+
"guidance": [
|
|
393
|
+
"Returns non-terminal runs across the account.",
|
|
394
|
+
"runId here is the UUID needed by getLoadTestRunStatus and stopLoadTestRun.",
|
|
395
|
+
"vuHoursBurnedSoFar reflects consumption at the moment of the call."
|
|
396
|
+
],
|
|
397
|
+
"returns": [
|
|
398
|
+
"runs"
|
|
399
|
+
],
|
|
400
|
+
"responses": {
|
|
401
|
+
"200": {
|
|
402
|
+
"$response": "Success"
|
|
403
|
+
},
|
|
404
|
+
"400": {
|
|
405
|
+
"$response": "BadRequest"
|
|
406
|
+
},
|
|
407
|
+
"401": {
|
|
408
|
+
"$response": "Unauthorized"
|
|
409
|
+
},
|
|
410
|
+
"500": {
|
|
411
|
+
"$response": "InternalServerError"
|
|
412
|
+
}
|
|
413
|
+
}
|
|
414
|
+
},
|
|
415
|
+
{
|
|
416
|
+
"method": "GET",
|
|
417
|
+
"path": "/api/v1/agent/loadTests/runs/{jobId}/status",
|
|
418
|
+
"mode": "read",
|
|
419
|
+
"entity": "run",
|
|
420
|
+
"path_params": [
|
|
421
|
+
{
|
|
422
|
+
"name": "jobId",
|
|
423
|
+
"type": "string",
|
|
424
|
+
"required": true,
|
|
425
|
+
"example": "b1e2c3d4-...",
|
|
426
|
+
"description": "Run UUID (runId)."
|
|
427
|
+
}
|
|
428
|
+
],
|
|
429
|
+
"query": [
|
|
430
|
+
{
|
|
431
|
+
"name": "metrics",
|
|
432
|
+
"type": "string",
|
|
433
|
+
"description": "Comma-separated dotted metric names or @ aliases (e.g. @vitals, @all). Resolve valid names via getLoadTestMetricsManifest."
|
|
434
|
+
}
|
|
435
|
+
],
|
|
436
|
+
"intent": "Poll the live status and progress of a run — use this to wait for a run to finish or check elapsed/remaining time.",
|
|
437
|
+
"guidance": [
|
|
438
|
+
"jobId is the run UUID from startLoadTestRun or listLoadTestRuns.",
|
|
439
|
+
"Respect pollAfterSeconds between polls instead of tight-looping.",
|
|
440
|
+
"slaBreachFlags surfaces threshold breaches as they trip."
|
|
441
|
+
],
|
|
442
|
+
"returns": [
|
|
443
|
+
"status",
|
|
444
|
+
"elapsedSec",
|
|
445
|
+
"remainingSec",
|
|
446
|
+
"pollAfterSeconds",
|
|
447
|
+
"slaBreachFlags"
|
|
448
|
+
],
|
|
449
|
+
"responses": {
|
|
450
|
+
"200": {
|
|
451
|
+
"$response": "Success"
|
|
452
|
+
},
|
|
453
|
+
"400": {
|
|
454
|
+
"$response": "BadRequest"
|
|
455
|
+
},
|
|
456
|
+
"401": {
|
|
457
|
+
"$response": "Unauthorized"
|
|
458
|
+
},
|
|
459
|
+
"404": {
|
|
460
|
+
"$response": "NotFound"
|
|
461
|
+
},
|
|
462
|
+
"500": {
|
|
463
|
+
"$response": "InternalServerError"
|
|
464
|
+
}
|
|
465
|
+
}
|
|
466
|
+
},
|
|
467
|
+
{
|
|
468
|
+
"method": "GET",
|
|
469
|
+
"path": "/api/v1/agent/loadTests/runs/{jobId}/insights",
|
|
470
|
+
"mode": "read",
|
|
471
|
+
"entity": "insight",
|
|
472
|
+
"path_params": [
|
|
473
|
+
{
|
|
474
|
+
"name": "jobId",
|
|
475
|
+
"type": "string",
|
|
476
|
+
"required": true,
|
|
477
|
+
"description": "Run UUID (runId)."
|
|
478
|
+
}
|
|
479
|
+
],
|
|
480
|
+
"query": [
|
|
481
|
+
{
|
|
482
|
+
"name": "sections",
|
|
483
|
+
"type": "string",
|
|
484
|
+
"values": [
|
|
485
|
+
"summary",
|
|
486
|
+
"rootCause",
|
|
487
|
+
"recommendations",
|
|
488
|
+
"evidence"
|
|
489
|
+
],
|
|
490
|
+
"description": "Comma-separated subset of insight sections (default summary)."
|
|
491
|
+
}
|
|
492
|
+
],
|
|
493
|
+
"intent": "Get the AI insight (summary, root cause, recommendations) for a completed run — use this for 'why did this run regress or fail?'",
|
|
494
|
+
"guidance": [
|
|
495
|
+
"Only meaningful after the run is terminal; a running job returns an in_progress state, not a report.",
|
|
496
|
+
"May return 503 if the insight backend is unavailable — retry later."
|
|
497
|
+
],
|
|
498
|
+
"returns": [
|
|
499
|
+
"state",
|
|
500
|
+
"status",
|
|
501
|
+
"report"
|
|
502
|
+
],
|
|
503
|
+
"responses": {
|
|
504
|
+
"200": {
|
|
505
|
+
"$response": "Success"
|
|
506
|
+
},
|
|
507
|
+
"400": {
|
|
508
|
+
"$response": "BadRequest"
|
|
509
|
+
},
|
|
510
|
+
"401": {
|
|
511
|
+
"$response": "Unauthorized"
|
|
512
|
+
},
|
|
513
|
+
"404": {
|
|
514
|
+
"$response": "NotFound"
|
|
515
|
+
},
|
|
516
|
+
"503": {
|
|
517
|
+
"$response": "ServiceUnavailable"
|
|
518
|
+
},
|
|
519
|
+
"500": {
|
|
520
|
+
"$response": "InternalServerError"
|
|
521
|
+
}
|
|
522
|
+
}
|
|
523
|
+
},
|
|
524
|
+
{
|
|
525
|
+
"method": "GET",
|
|
526
|
+
"path": "/api/v1/agent/loadTests/runs/{jobId}/report",
|
|
527
|
+
"mode": "read",
|
|
528
|
+
"entity": "report",
|
|
529
|
+
"path_params": [
|
|
530
|
+
{
|
|
531
|
+
"name": "jobId",
|
|
532
|
+
"type": "string",
|
|
533
|
+
"required": true,
|
|
534
|
+
"description": "Run UUID (runId)."
|
|
535
|
+
}
|
|
536
|
+
],
|
|
537
|
+
"query": [
|
|
538
|
+
{
|
|
539
|
+
"name": "detail",
|
|
540
|
+
"type": "string",
|
|
541
|
+
"values": [
|
|
542
|
+
"aggregate",
|
|
543
|
+
"per-txn",
|
|
544
|
+
"full"
|
|
545
|
+
],
|
|
546
|
+
"description": "Level of detail (default aggregate)."
|
|
547
|
+
},
|
|
548
|
+
{
|
|
549
|
+
"name": "view",
|
|
550
|
+
"type": "string",
|
|
551
|
+
"values": [
|
|
552
|
+
"summary",
|
|
553
|
+
"detail",
|
|
554
|
+
"full"
|
|
555
|
+
],
|
|
556
|
+
"description": "Response view."
|
|
557
|
+
},
|
|
558
|
+
{
|
|
559
|
+
"name": "topN",
|
|
560
|
+
"type": "integer",
|
|
561
|
+
"description": "Top-N transactions/errors to include (1-100, default 10)."
|
|
562
|
+
},
|
|
563
|
+
{
|
|
564
|
+
"name": "byteCap",
|
|
565
|
+
"type": "integer",
|
|
566
|
+
"description": "Hard response size cap in KB (1-256, default 128). Sets meta.truncated when hit."
|
|
567
|
+
},
|
|
568
|
+
{
|
|
569
|
+
"name": "groupBy",
|
|
570
|
+
"type": "string",
|
|
571
|
+
"description": "Rollup dimension (url/browser/location/transaction/step)."
|
|
572
|
+
},
|
|
573
|
+
{
|
|
574
|
+
"name": "slaOnly",
|
|
575
|
+
"type": "boolean",
|
|
576
|
+
"description": "Return only SLA-related data."
|
|
577
|
+
},
|
|
578
|
+
{
|
|
579
|
+
"name": "errorCategory",
|
|
580
|
+
"type": "string",
|
|
581
|
+
"values": [
|
|
582
|
+
"5xx",
|
|
583
|
+
"4xx",
|
|
584
|
+
"timeout",
|
|
585
|
+
"connection",
|
|
586
|
+
"assertion"
|
|
587
|
+
],
|
|
588
|
+
"description": "Comma-separated error categories to include."
|
|
589
|
+
},
|
|
590
|
+
{
|
|
591
|
+
"name": "metrics",
|
|
592
|
+
"type": "string",
|
|
593
|
+
"description": "Comma-separated dotted metric names or @ aliases (e.g. @vitals, @all). Resolve valid names via getLoadTestMetricsManifest."
|
|
594
|
+
},
|
|
595
|
+
{
|
|
596
|
+
"name": "fields",
|
|
597
|
+
"type": "string",
|
|
598
|
+
"description": "Comma-separated response fields to include."
|
|
599
|
+
},
|
|
600
|
+
{
|
|
601
|
+
"name": "sinceIso",
|
|
602
|
+
"type": "string",
|
|
603
|
+
"description": "ISO-8601 lower bound; slices the report to data in this time window."
|
|
604
|
+
},
|
|
605
|
+
{
|
|
606
|
+
"name": "untilIso",
|
|
607
|
+
"type": "string",
|
|
608
|
+
"description": "ISO-8601 upper bound for the time-window slice."
|
|
609
|
+
}
|
|
610
|
+
],
|
|
611
|
+
"intent": "Get the full metrics report for a completed run — KPIs, SLA verdicts, per-transaction and error breakdowns. Use this to answer 'how did this run perform?'",
|
|
612
|
+
"guidance": [
|
|
613
|
+
"Only valid for a terminal run.",
|
|
614
|
+
"Start with detail=aggregate; escalate to per-txn or full only when you need transaction- or network-level detail — full is large.",
|
|
615
|
+
"groupBy and errorCategory narrow the payload; byteCap hard-caps the response (max 256 KB).",
|
|
616
|
+
"metrics accepts dotted names or @ aliases; see getLoadTestMetricsManifest for what applies to this test type."
|
|
617
|
+
],
|
|
618
|
+
"returns": [
|
|
619
|
+
"runId",
|
|
620
|
+
"testType",
|
|
621
|
+
"status",
|
|
622
|
+
"testName",
|
|
623
|
+
"durationSec",
|
|
624
|
+
"kpis",
|
|
625
|
+
"slaVerdicts",
|
|
626
|
+
"transactions",
|
|
627
|
+
"errorsByCategory",
|
|
628
|
+
"meta"
|
|
629
|
+
],
|
|
630
|
+
"responses": {
|
|
631
|
+
"200": {
|
|
632
|
+
"$response": "Success"
|
|
633
|
+
},
|
|
634
|
+
"400": {
|
|
635
|
+
"$response": "BadRequest"
|
|
636
|
+
},
|
|
637
|
+
"401": {
|
|
638
|
+
"$response": "Unauthorized"
|
|
639
|
+
},
|
|
640
|
+
"404": {
|
|
641
|
+
"$response": "NotFound"
|
|
642
|
+
},
|
|
643
|
+
"500": {
|
|
644
|
+
"$response": "InternalServerError"
|
|
645
|
+
}
|
|
646
|
+
}
|
|
647
|
+
},
|
|
648
|
+
{
|
|
649
|
+
"method": "POST",
|
|
650
|
+
"path": "/api/v1/agent/loadTests/runs/{jobId}/stop",
|
|
651
|
+
"mode": "write",
|
|
652
|
+
"entity": "run",
|
|
653
|
+
"path_params": [
|
|
654
|
+
{
|
|
655
|
+
"name": "jobId",
|
|
656
|
+
"type": "string",
|
|
657
|
+
"required": true,
|
|
658
|
+
"description": "Run UUID (runId) to stop."
|
|
659
|
+
}
|
|
660
|
+
],
|
|
661
|
+
"intent": "Stop a running load test — use this to abort an execution that is running or queued.",
|
|
662
|
+
"guidance": [
|
|
663
|
+
"Idempotent: stopping an already-terminal run returns alreadyTerminal:true, not an error.",
|
|
664
|
+
"Returns status:'stopping'; poll getLoadTestRunStatus to confirm it reaches a terminal state."
|
|
665
|
+
],
|
|
666
|
+
"returns": [
|
|
667
|
+
"runId",
|
|
668
|
+
"status",
|
|
669
|
+
"stoppedAt"
|
|
670
|
+
],
|
|
671
|
+
"responses": {
|
|
672
|
+
"200": {
|
|
673
|
+
"$response": "Success"
|
|
674
|
+
},
|
|
675
|
+
"400": {
|
|
676
|
+
"$response": "BadRequest"
|
|
677
|
+
},
|
|
678
|
+
"401": {
|
|
679
|
+
"$response": "Unauthorized"
|
|
680
|
+
},
|
|
681
|
+
"404": {
|
|
682
|
+
"$response": "NotFound"
|
|
683
|
+
},
|
|
684
|
+
"500": {
|
|
685
|
+
"$response": "InternalServerError"
|
|
686
|
+
}
|
|
687
|
+
}
|
|
688
|
+
},
|
|
689
|
+
{
|
|
690
|
+
"method": "GET",
|
|
691
|
+
"path": "/api/v1/agent/loadTests/quota",
|
|
692
|
+
"mode": "read",
|
|
693
|
+
"entity": "quota",
|
|
694
|
+
"intent": "Check the account's remaining VU-hours and concurrency headroom — use this before starting runs to confirm capacity.",
|
|
695
|
+
"guidance": [
|
|
696
|
+
"Account-scoped from the caller's credentials; takes no parameters.",
|
|
697
|
+
"Pair with estimateLoadTestRunCost to check a specific run fits before starting it."
|
|
698
|
+
],
|
|
699
|
+
"returns": [
|
|
700
|
+
"plan",
|
|
701
|
+
"vuHours",
|
|
702
|
+
"concurrency"
|
|
703
|
+
],
|
|
704
|
+
"responses": {
|
|
705
|
+
"200": {
|
|
706
|
+
"$response": "Success"
|
|
707
|
+
},
|
|
708
|
+
"400": {
|
|
709
|
+
"$response": "BadRequest"
|
|
710
|
+
},
|
|
711
|
+
"401": {
|
|
712
|
+
"$response": "Unauthorized"
|
|
713
|
+
},
|
|
714
|
+
"500": {
|
|
715
|
+
"$response": "InternalServerError"
|
|
716
|
+
}
|
|
717
|
+
}
|
|
718
|
+
},
|
|
719
|
+
{
|
|
720
|
+
"method": "POST",
|
|
721
|
+
"path": "/api/v1/agent/loadTests/estimate",
|
|
722
|
+
"mode": "read",
|
|
723
|
+
"entity": "quota",
|
|
724
|
+
"body": [
|
|
725
|
+
{
|
|
726
|
+
"name": "testId",
|
|
727
|
+
"type": "integer",
|
|
728
|
+
"required": true,
|
|
729
|
+
"description": "The test to price."
|
|
730
|
+
},
|
|
731
|
+
{
|
|
732
|
+
"name": "overrides",
|
|
733
|
+
"type": "object",
|
|
734
|
+
"description": "Hypothetical run configuration to price instead of the saved one.",
|
|
735
|
+
"fields": [
|
|
736
|
+
{
|
|
737
|
+
"name": "vus",
|
|
738
|
+
"type": "integer"
|
|
739
|
+
},
|
|
740
|
+
{
|
|
741
|
+
"name": "durationSec",
|
|
742
|
+
"type": "integer"
|
|
743
|
+
}
|
|
744
|
+
]
|
|
745
|
+
}
|
|
746
|
+
],
|
|
747
|
+
"intent": "Estimate the VU-hour cost of running a test before starting it — use this to answer 'how much will this run cost / will it fit in my quota?'",
|
|
748
|
+
"guidance": [
|
|
749
|
+
"Read-only despite being a POST — nothing is started.",
|
|
750
|
+
"fitsInQuota / remainingAfterEstimate compare the estimate against current quota.",
|
|
751
|
+
"For the same check at start time, call startLoadTestRun with dryRun:true."
|
|
752
|
+
],
|
|
753
|
+
"returns": [
|
|
754
|
+
"estimatedVuHours",
|
|
755
|
+
"estimationBasis",
|
|
756
|
+
"rangeBasis",
|
|
757
|
+
"rangeExplanation",
|
|
758
|
+
"fitsInQuota",
|
|
759
|
+
"remainingAfterEstimate"
|
|
760
|
+
],
|
|
761
|
+
"responses": {
|
|
762
|
+
"200": {
|
|
763
|
+
"$response": "Success"
|
|
764
|
+
},
|
|
765
|
+
"400": {
|
|
766
|
+
"$response": "BadRequest"
|
|
767
|
+
},
|
|
768
|
+
"401": {
|
|
769
|
+
"$response": "Unauthorized"
|
|
770
|
+
},
|
|
771
|
+
"500": {
|
|
772
|
+
"$response": "InternalServerError"
|
|
773
|
+
}
|
|
774
|
+
}
|
|
775
|
+
},
|
|
776
|
+
{
|
|
777
|
+
"method": "POST",
|
|
778
|
+
"path": "/api/v1/agent/loadTests/compare",
|
|
779
|
+
"mode": "read",
|
|
780
|
+
"entity": "report",
|
|
781
|
+
"body": [
|
|
782
|
+
{
|
|
783
|
+
"name": "baselineRunId",
|
|
784
|
+
"type": "string",
|
|
785
|
+
"required": true,
|
|
786
|
+
"description": "Run UUID to compare against."
|
|
787
|
+
},
|
|
788
|
+
{
|
|
789
|
+
"name": "candidateRunId",
|
|
790
|
+
"type": "string",
|
|
791
|
+
"required": true,
|
|
792
|
+
"description": "Run UUID being evaluated; must differ from baselineRunId."
|
|
793
|
+
},
|
|
794
|
+
{
|
|
795
|
+
"name": "dimensions",
|
|
796
|
+
"type": "array",
|
|
797
|
+
"description": "Which delta dimensions to compute (any of kpi, transaction, sla).",
|
|
798
|
+
"values": [
|
|
799
|
+
"kpi",
|
|
800
|
+
"transaction",
|
|
801
|
+
"sla"
|
|
802
|
+
]
|
|
803
|
+
},
|
|
804
|
+
{
|
|
805
|
+
"name": "metrics",
|
|
806
|
+
"type": "string",
|
|
807
|
+
"description": "Comma-separated dotted metric names or @ aliases (e.g. @vitals, @all). Resolve valid names via getLoadTestMetricsManifest."
|
|
808
|
+
},
|
|
809
|
+
{
|
|
810
|
+
"name": "groupBy",
|
|
811
|
+
"type": "string",
|
|
812
|
+
"description": "Rollup dimension for transaction deltas."
|
|
813
|
+
},
|
|
814
|
+
{
|
|
815
|
+
"name": "topN",
|
|
816
|
+
"type": "integer",
|
|
817
|
+
"description": "Top-N deltas to include (1-100)."
|
|
818
|
+
},
|
|
819
|
+
{
|
|
820
|
+
"name": "regressedOnly",
|
|
821
|
+
"type": "boolean",
|
|
822
|
+
"description": "Return only regressed rows."
|
|
823
|
+
},
|
|
824
|
+
{
|
|
825
|
+
"name": "pctChangeMin",
|
|
826
|
+
"type": "number",
|
|
827
|
+
"description": "Minimum percent change to include."
|
|
828
|
+
}
|
|
829
|
+
],
|
|
830
|
+
"intent": "Compare two completed runs and surface the deltas — use this for 'did this run regress vs the baseline?'",
|
|
831
|
+
"guidance": [
|
|
832
|
+
"baselineRunId and candidateRunId are run UUIDs and must differ; both runs must be terminal.",
|
|
833
|
+
"regressedOnly + pctChangeMin filter to material regressions; dimensions accepts kpi, transaction, sla."
|
|
834
|
+
],
|
|
835
|
+
"returns": [
|
|
836
|
+
"kpiDeltas",
|
|
837
|
+
"transactionDeltas"
|
|
838
|
+
],
|
|
839
|
+
"responses": {
|
|
840
|
+
"200": {
|
|
841
|
+
"$response": "Success"
|
|
842
|
+
},
|
|
843
|
+
"400": {
|
|
844
|
+
"$response": "BadRequest"
|
|
845
|
+
},
|
|
846
|
+
"401": {
|
|
847
|
+
"$response": "Unauthorized"
|
|
848
|
+
},
|
|
849
|
+
"500": {
|
|
850
|
+
"$response": "InternalServerError"
|
|
851
|
+
}
|
|
852
|
+
}
|
|
853
|
+
},
|
|
854
|
+
{
|
|
855
|
+
"method": "POST",
|
|
856
|
+
"path": "/api/v1/agent/loadTests",
|
|
857
|
+
"mode": "write",
|
|
858
|
+
"entity": "loadTest",
|
|
859
|
+
"body": [
|
|
860
|
+
{
|
|
861
|
+
"name": "name",
|
|
862
|
+
"type": "string",
|
|
863
|
+
"required": true,
|
|
864
|
+
"description": "Test name."
|
|
865
|
+
},
|
|
866
|
+
{
|
|
867
|
+
"name": "testType",
|
|
868
|
+
"type": "string",
|
|
869
|
+
"required": true,
|
|
870
|
+
"values": [
|
|
871
|
+
"plu",
|
|
872
|
+
"blu",
|
|
873
|
+
"hybrid"
|
|
874
|
+
]
|
|
875
|
+
},
|
|
876
|
+
{
|
|
877
|
+
"name": "framework",
|
|
878
|
+
"type": "string",
|
|
879
|
+
"required": true,
|
|
880
|
+
"values": [
|
|
881
|
+
"k6",
|
|
882
|
+
"jmeter",
|
|
883
|
+
"gatling",
|
|
884
|
+
"locust"
|
|
885
|
+
]
|
|
886
|
+
},
|
|
887
|
+
{
|
|
888
|
+
"name": "projectId",
|
|
889
|
+
"type": "integer",
|
|
890
|
+
"description": "Target project. Provide this OR projectName, not both."
|
|
891
|
+
},
|
|
892
|
+
{
|
|
893
|
+
"name": "projectName",
|
|
894
|
+
"type": "string",
|
|
895
|
+
"description": "Target project by name; created if it does not exist. Provide this OR projectId."
|
|
896
|
+
},
|
|
897
|
+
{
|
|
898
|
+
"name": "config",
|
|
899
|
+
"type": "object",
|
|
900
|
+
"description": "Test configuration incl. scriptRef {source: s3|s3_upload|existing_zip_id, value|identifier}, vuRamp, durationSec, loadGeneratorLocations, slaThresholds, envVarKeys, tags. To supply a script from a local file or URL, use the pendingScriptUpload flow, then source='s3'."
|
|
901
|
+
},
|
|
902
|
+
{
|
|
903
|
+
"name": "children",
|
|
904
|
+
"type": "array",
|
|
905
|
+
"description": "Child scenarios for hybrid tests."
|
|
906
|
+
},
|
|
907
|
+
{
|
|
908
|
+
"name": "idempotencyKey",
|
|
909
|
+
"type": "string",
|
|
910
|
+
"description": "Dedupe key so a retried create does not duplicate the test."
|
|
911
|
+
},
|
|
912
|
+
{
|
|
913
|
+
"name": "validationToken",
|
|
914
|
+
"type": "string",
|
|
915
|
+
"description": "Token from a prior validate step, when required."
|
|
916
|
+
},
|
|
917
|
+
{
|
|
918
|
+
"name": "pendingScriptUpload",
|
|
919
|
+
"type": "object",
|
|
920
|
+
"description": "Request a presigned upload URL instead of creating; returns uploadUrl + s3Key to PUT the script to, then call create again with config.scriptRef.source='s3_upload'.",
|
|
921
|
+
"fields": [
|
|
922
|
+
{
|
|
923
|
+
"name": "framework",
|
|
924
|
+
"type": "string"
|
|
925
|
+
},
|
|
926
|
+
{
|
|
927
|
+
"name": "expectedContentType",
|
|
928
|
+
"type": "string"
|
|
929
|
+
}
|
|
930
|
+
]
|
|
931
|
+
}
|
|
932
|
+
],
|
|
933
|
+
"intent": "Create a new load test in a project — use this to define a test before running it. JSON body only (no multipart).",
|
|
934
|
+
"guidance": [
|
|
935
|
+
"Provide exactly one of projectId or projectName; projectName creates the project if absent.",
|
|
936
|
+
"Script upload is two-phase: send pendingScriptUpload to get a presigned uploadUrl + s3Key, PUT the file, then call create again with the scriptRef source and s3Key returned in the response's nextStep.",
|
|
937
|
+
"Pass idempotencyKey so a retried create does not duplicate the test."
|
|
938
|
+
],
|
|
939
|
+
"returns": [
|
|
940
|
+
"testId",
|
|
941
|
+
"name",
|
|
942
|
+
"projectId",
|
|
943
|
+
"version",
|
|
944
|
+
"dashboardLink"
|
|
945
|
+
],
|
|
946
|
+
"responses": {
|
|
947
|
+
"200": {
|
|
948
|
+
"$response": "Success"
|
|
949
|
+
},
|
|
950
|
+
"400": {
|
|
951
|
+
"$response": "BadRequest"
|
|
952
|
+
},
|
|
953
|
+
"401": {
|
|
954
|
+
"$response": "Unauthorized"
|
|
955
|
+
},
|
|
956
|
+
"500": {
|
|
957
|
+
"$response": "InternalServerError"
|
|
958
|
+
}
|
|
959
|
+
}
|
|
960
|
+
},
|
|
961
|
+
{
|
|
962
|
+
"method": "POST",
|
|
963
|
+
"path": "/api/v1/agent/loadTests/{testId}/runs",
|
|
964
|
+
"mode": "write",
|
|
965
|
+
"entity": "run",
|
|
966
|
+
"path_params": [
|
|
967
|
+
{
|
|
968
|
+
"name": "testId",
|
|
969
|
+
"type": "integer",
|
|
970
|
+
"required": true
|
|
971
|
+
}
|
|
972
|
+
],
|
|
973
|
+
"body": [
|
|
974
|
+
{
|
|
975
|
+
"name": "overrides",
|
|
976
|
+
"type": "object",
|
|
977
|
+
"description": "Per-run overrides.",
|
|
978
|
+
"fields": [
|
|
979
|
+
{
|
|
980
|
+
"name": "vus",
|
|
981
|
+
"type": "integer"
|
|
982
|
+
},
|
|
983
|
+
{
|
|
984
|
+
"name": "durationSec",
|
|
985
|
+
"type": "integer"
|
|
986
|
+
},
|
|
987
|
+
{
|
|
988
|
+
"name": "loadGeneratorLocations",
|
|
989
|
+
"type": "array"
|
|
990
|
+
},
|
|
991
|
+
{
|
|
992
|
+
"name": "envOverrides",
|
|
993
|
+
"type": "object"
|
|
994
|
+
}
|
|
995
|
+
]
|
|
996
|
+
},
|
|
997
|
+
{
|
|
998
|
+
"name": "dryRun",
|
|
999
|
+
"type": "boolean",
|
|
1000
|
+
"description": "Return the VU-hour estimate and quota fit without starting a run."
|
|
1001
|
+
},
|
|
1002
|
+
{
|
|
1003
|
+
"name": "idempotencyKey",
|
|
1004
|
+
"type": "string",
|
|
1005
|
+
"description": "Dedupe key so a retried start does not launch a duplicate run."
|
|
1006
|
+
},
|
|
1007
|
+
{
|
|
1008
|
+
"name": "validationToken",
|
|
1009
|
+
"type": "string",
|
|
1010
|
+
"description": "Token from a prior validate step, when required."
|
|
1011
|
+
}
|
|
1012
|
+
],
|
|
1013
|
+
"intent": "Start a run of an existing load test — use this to execute a test, optionally overriding VUs, duration or locations.",
|
|
1014
|
+
"guidance": [
|
|
1015
|
+
"testId is the numeric test id, not a run id.",
|
|
1016
|
+
"dryRun:true returns the VU-hour estimate and quota fit without starting anything.",
|
|
1017
|
+
"On success returns runId (UUID) + dashboardLink; poll getLoadTestRunStatus with the runId."
|
|
1018
|
+
],
|
|
1019
|
+
"returns": [
|
|
1020
|
+
"runId",
|
|
1021
|
+
"status",
|
|
1022
|
+
"startedAt",
|
|
1023
|
+
"dashboardLink",
|
|
1024
|
+
"estimatedVuHoursRange"
|
|
1025
|
+
],
|
|
1026
|
+
"responses": {
|
|
1027
|
+
"200": {
|
|
1028
|
+
"$response": "Success"
|
|
1029
|
+
},
|
|
1030
|
+
"400": {
|
|
1031
|
+
"$response": "BadRequest"
|
|
1032
|
+
},
|
|
1033
|
+
"401": {
|
|
1034
|
+
"$response": "Unauthorized"
|
|
1035
|
+
},
|
|
1036
|
+
"404": {
|
|
1037
|
+
"$response": "NotFound"
|
|
1038
|
+
},
|
|
1039
|
+
"500": {
|
|
1040
|
+
"$response": "InternalServerError"
|
|
1041
|
+
}
|
|
1042
|
+
}
|
|
1043
|
+
},
|
|
1044
|
+
{
|
|
1045
|
+
"method": "GET",
|
|
1046
|
+
"path": "/api/v1/agent/loadTests/{testId}/runs",
|
|
1047
|
+
"mode": "read",
|
|
1048
|
+
"entity": "run",
|
|
1049
|
+
"path_params": [
|
|
1050
|
+
{
|
|
1051
|
+
"name": "testId",
|
|
1052
|
+
"type": "integer",
|
|
1053
|
+
"required": true
|
|
1054
|
+
}
|
|
1055
|
+
],
|
|
1056
|
+
"query": [
|
|
1057
|
+
{
|
|
1058
|
+
"name": "limit",
|
|
1059
|
+
"type": "integer",
|
|
1060
|
+
"description": "Max items to return (1-100, default 50)."
|
|
1061
|
+
},
|
|
1062
|
+
{
|
|
1063
|
+
"name": "cursor",
|
|
1064
|
+
"type": "string",
|
|
1065
|
+
"description": "Opaque pagination cursor from a previous response's nextCursor; pass back verbatim."
|
|
1066
|
+
},
|
|
1067
|
+
{
|
|
1068
|
+
"name": "status",
|
|
1069
|
+
"type": "string",
|
|
1070
|
+
"values": [
|
|
1071
|
+
"active",
|
|
1072
|
+
"terminal",
|
|
1073
|
+
"all"
|
|
1074
|
+
],
|
|
1075
|
+
"description": "Lifecycle filter (default all)."
|
|
1076
|
+
},
|
|
1077
|
+
{
|
|
1078
|
+
"name": "sinceIso",
|
|
1079
|
+
"type": "string",
|
|
1080
|
+
"description": "ISO-8601 lower bound."
|
|
1081
|
+
},
|
|
1082
|
+
{
|
|
1083
|
+
"name": "untilIso",
|
|
1084
|
+
"type": "string",
|
|
1085
|
+
"description": "ISO-8601 upper bound."
|
|
1086
|
+
},
|
|
1087
|
+
{
|
|
1088
|
+
"name": "verdict",
|
|
1089
|
+
"type": "string",
|
|
1090
|
+
"description": "Filter by run verdict."
|
|
1091
|
+
},
|
|
1092
|
+
{
|
|
1093
|
+
"name": "startedBy",
|
|
1094
|
+
"type": "integer",
|
|
1095
|
+
"description": "Filter by the user who started the run."
|
|
1096
|
+
},
|
|
1097
|
+
{
|
|
1098
|
+
"name": "hadSlaBreach",
|
|
1099
|
+
"type": "boolean",
|
|
1100
|
+
"description": "Only runs that breached an SLA."
|
|
1101
|
+
}
|
|
1102
|
+
],
|
|
1103
|
+
"intent": "List the execution history of a test — use this to find past runs of a specific test or to get a runId.",
|
|
1104
|
+
"guidance": [
|
|
1105
|
+
"testId is numeric; runId values returned are UUIDs.",
|
|
1106
|
+
"Filter with status / verdict / date range; page with cursor + limit."
|
|
1107
|
+
],
|
|
1108
|
+
"returns": [
|
|
1109
|
+
"runs",
|
|
1110
|
+
"hasMore",
|
|
1111
|
+
"nextCursor"
|
|
1112
|
+
],
|
|
1113
|
+
"responses": {
|
|
1114
|
+
"200": {
|
|
1115
|
+
"$response": "Success"
|
|
1116
|
+
},
|
|
1117
|
+
"400": {
|
|
1118
|
+
"$response": "BadRequest"
|
|
1119
|
+
},
|
|
1120
|
+
"401": {
|
|
1121
|
+
"$response": "Unauthorized"
|
|
1122
|
+
},
|
|
1123
|
+
"404": {
|
|
1124
|
+
"$response": "NotFound"
|
|
1125
|
+
},
|
|
1126
|
+
"500": {
|
|
1127
|
+
"$response": "InternalServerError"
|
|
1128
|
+
}
|
|
1129
|
+
},
|
|
1130
|
+
"paginated": true,
|
|
1131
|
+
"max_page_size": 100
|
|
1132
|
+
},
|
|
1133
|
+
{
|
|
1134
|
+
"method": "GET",
|
|
1135
|
+
"path": "/api/v1/agent/loadTests/{testId}/trends",
|
|
1136
|
+
"mode": "read",
|
|
1137
|
+
"entity": "trend",
|
|
1138
|
+
"path_params": [
|
|
1139
|
+
{
|
|
1140
|
+
"name": "testId",
|
|
1141
|
+
"type": "integer",
|
|
1142
|
+
"required": true
|
|
1143
|
+
}
|
|
1144
|
+
],
|
|
1145
|
+
"query": [
|
|
1146
|
+
{
|
|
1147
|
+
"name": "windowRuns",
|
|
1148
|
+
"type": "integer",
|
|
1149
|
+
"description": "How many recent runs to aggregate (1-100, default 10)."
|
|
1150
|
+
},
|
|
1151
|
+
{
|
|
1152
|
+
"name": "aggregation",
|
|
1153
|
+
"type": "string",
|
|
1154
|
+
"values": [
|
|
1155
|
+
"perRun"
|
|
1156
|
+
],
|
|
1157
|
+
"description": "Aggregation granularity. Only perRun is supported today."
|
|
1158
|
+
},
|
|
1159
|
+
{
|
|
1160
|
+
"name": "verdictFilter",
|
|
1161
|
+
"type": "string",
|
|
1162
|
+
"values": [
|
|
1163
|
+
"passed",
|
|
1164
|
+
"failed",
|
|
1165
|
+
"all"
|
|
1166
|
+
],
|
|
1167
|
+
"description": "Restrict to runs of this verdict."
|
|
1168
|
+
},
|
|
1169
|
+
{
|
|
1170
|
+
"name": "metrics",
|
|
1171
|
+
"type": "string",
|
|
1172
|
+
"description": "Comma-separated dotted metric names or @ aliases (e.g. @vitals, @all). Resolve valid names via getLoadTestMetricsManifest."
|
|
1173
|
+
},
|
|
1174
|
+
{
|
|
1175
|
+
"name": "sinceIso",
|
|
1176
|
+
"type": "string",
|
|
1177
|
+
"description": "ISO-8601 lower bound."
|
|
1178
|
+
},
|
|
1179
|
+
{
|
|
1180
|
+
"name": "untilIso",
|
|
1181
|
+
"type": "string",
|
|
1182
|
+
"description": "ISO-8601 upper bound."
|
|
1183
|
+
}
|
|
1184
|
+
],
|
|
1185
|
+
"intent": "Show how one test's metrics trend across its recent runs — use this for 'is this test getting slower over time?'",
|
|
1186
|
+
"guidance": [
|
|
1187
|
+
"metrics accepts dotted names or @ aliases; @vitals / @all expand to metric sets.",
|
|
1188
|
+
"windowRuns bounds how many recent runs are aggregated."
|
|
1189
|
+
],
|
|
1190
|
+
"returns": [
|
|
1191
|
+
"metrics"
|
|
1192
|
+
],
|
|
1193
|
+
"responses": {
|
|
1194
|
+
"200": {
|
|
1195
|
+
"$response": "Success"
|
|
1196
|
+
},
|
|
1197
|
+
"400": {
|
|
1198
|
+
"$response": "BadRequest"
|
|
1199
|
+
},
|
|
1200
|
+
"401": {
|
|
1201
|
+
"$response": "Unauthorized"
|
|
1202
|
+
},
|
|
1203
|
+
"404": {
|
|
1204
|
+
"$response": "NotFound"
|
|
1205
|
+
},
|
|
1206
|
+
"500": {
|
|
1207
|
+
"$response": "InternalServerError"
|
|
1208
|
+
}
|
|
1209
|
+
}
|
|
1210
|
+
},
|
|
1211
|
+
{
|
|
1212
|
+
"method": "GET",
|
|
1213
|
+
"path": "/api/v1/agent/loadTests/{testId}/metricsManifest",
|
|
1214
|
+
"mode": "read",
|
|
1215
|
+
"entity": "metrics",
|
|
1216
|
+
"path_params": [
|
|
1217
|
+
{
|
|
1218
|
+
"name": "testId",
|
|
1219
|
+
"type": "integer",
|
|
1220
|
+
"required": true
|
|
1221
|
+
}
|
|
1222
|
+
],
|
|
1223
|
+
"intent": "Discover which metrics, @ aliases and groupBy options a test supports — call this before requesting a report, trend or comparison so metric names are valid.",
|
|
1224
|
+
"guidance": [
|
|
1225
|
+
"Depends only on the test's type; cache the result client-side.",
|
|
1226
|
+
"Use the returned names/aliases in the metrics parameter of report, trends and compare."
|
|
1227
|
+
],
|
|
1228
|
+
"returns": [
|
|
1229
|
+
"testType",
|
|
1230
|
+
"metrics",
|
|
1231
|
+
"aliases"
|
|
1232
|
+
],
|
|
1233
|
+
"responses": {
|
|
1234
|
+
"200": {
|
|
1235
|
+
"$response": "Success"
|
|
1236
|
+
},
|
|
1237
|
+
"400": {
|
|
1238
|
+
"$response": "BadRequest"
|
|
1239
|
+
},
|
|
1240
|
+
"401": {
|
|
1241
|
+
"$response": "Unauthorized"
|
|
1242
|
+
},
|
|
1243
|
+
"404": {
|
|
1244
|
+
"$response": "NotFound"
|
|
1245
|
+
},
|
|
1246
|
+
"500": {
|
|
1247
|
+
"$response": "InternalServerError"
|
|
1248
|
+
}
|
|
1249
|
+
}
|
|
1250
|
+
},
|
|
1251
|
+
{
|
|
1252
|
+
"method": "PUT",
|
|
1253
|
+
"path": "/api/v1/agent/loadTests/{testId}",
|
|
1254
|
+
"mode": "write",
|
|
1255
|
+
"entity": "loadTest",
|
|
1256
|
+
"path_params": [
|
|
1257
|
+
{
|
|
1258
|
+
"name": "testId",
|
|
1259
|
+
"type": "integer",
|
|
1260
|
+
"required": true
|
|
1261
|
+
}
|
|
1262
|
+
],
|
|
1263
|
+
"body": [
|
|
1264
|
+
{
|
|
1265
|
+
"name": "name",
|
|
1266
|
+
"type": "string",
|
|
1267
|
+
"description": "New test name."
|
|
1268
|
+
},
|
|
1269
|
+
{
|
|
1270
|
+
"name": "config",
|
|
1271
|
+
"type": "object",
|
|
1272
|
+
"description": "Partial config update (tags, envVarKeys, slaThresholds, scriptRef, integrations)."
|
|
1273
|
+
},
|
|
1274
|
+
{
|
|
1275
|
+
"name": "ifVersion",
|
|
1276
|
+
"type": "string",
|
|
1277
|
+
"description": "Optimistic-concurrency guard (ISO timestamp of the version being edited)."
|
|
1278
|
+
},
|
|
1279
|
+
{
|
|
1280
|
+
"name": "validationToken",
|
|
1281
|
+
"type": "string",
|
|
1282
|
+
"description": "Token from a prior validate step, when required."
|
|
1283
|
+
},
|
|
1284
|
+
{
|
|
1285
|
+
"name": "pendingScriptUpload",
|
|
1286
|
+
"type": "object",
|
|
1287
|
+
"description": "Two-phase script replacement, same flow as createLoadTest.",
|
|
1288
|
+
"fields": [
|
|
1289
|
+
{
|
|
1290
|
+
"name": "framework",
|
|
1291
|
+
"type": "string"
|
|
1292
|
+
},
|
|
1293
|
+
{
|
|
1294
|
+
"name": "expectedContentType",
|
|
1295
|
+
"type": "string"
|
|
1296
|
+
}
|
|
1297
|
+
]
|
|
1298
|
+
}
|
|
1299
|
+
],
|
|
1300
|
+
"intent": "Update an existing load test's name or configuration — use this to change tags, SLA thresholds, script or settings.",
|
|
1301
|
+
"guidance": [
|
|
1302
|
+
"Partial update: send only the fields to change.",
|
|
1303
|
+
"Pass ifVersion for optimistic concurrency; a stale value returns 409 VERSION_CONFLICT.",
|
|
1304
|
+
"Script replacement uses the same two-phase pendingScriptUpload flow as create."
|
|
1305
|
+
],
|
|
1306
|
+
"returns": [
|
|
1307
|
+
"testId",
|
|
1308
|
+
"version"
|
|
1309
|
+
],
|
|
1310
|
+
"responses": {
|
|
1311
|
+
"200": {
|
|
1312
|
+
"$response": "Success"
|
|
1313
|
+
},
|
|
1314
|
+
"400": {
|
|
1315
|
+
"$response": "BadRequest"
|
|
1316
|
+
},
|
|
1317
|
+
"401": {
|
|
1318
|
+
"$response": "Unauthorized"
|
|
1319
|
+
},
|
|
1320
|
+
"404": {
|
|
1321
|
+
"$response": "NotFound"
|
|
1322
|
+
},
|
|
1323
|
+
"409": {
|
|
1324
|
+
"$response": "Conflict"
|
|
1325
|
+
},
|
|
1326
|
+
"500": {
|
|
1327
|
+
"$response": "InternalServerError"
|
|
1328
|
+
}
|
|
1329
|
+
}
|
|
1330
|
+
},
|
|
1331
|
+
{
|
|
1332
|
+
"method": "GET",
|
|
1333
|
+
"path": "/api/v1/agent/loadTests/{testId}",
|
|
1334
|
+
"mode": "read",
|
|
1335
|
+
"entity": "loadTest",
|
|
1336
|
+
"path_params": [
|
|
1337
|
+
{
|
|
1338
|
+
"name": "testId",
|
|
1339
|
+
"type": "integer",
|
|
1340
|
+
"required": true
|
|
1341
|
+
}
|
|
1342
|
+
],
|
|
1343
|
+
"query": [
|
|
1344
|
+
{
|
|
1345
|
+
"name": "include",
|
|
1346
|
+
"type": "string",
|
|
1347
|
+
"values": [
|
|
1348
|
+
"config",
|
|
1349
|
+
"thresholds",
|
|
1350
|
+
"tags",
|
|
1351
|
+
"children"
|
|
1352
|
+
],
|
|
1353
|
+
"description": "Comma-separated sub-resources to expand."
|
|
1354
|
+
},
|
|
1355
|
+
{
|
|
1356
|
+
"name": "fields",
|
|
1357
|
+
"type": "string",
|
|
1358
|
+
"description": "Comma-separated response fields to include."
|
|
1359
|
+
}
|
|
1360
|
+
],
|
|
1361
|
+
"intent": "Get the full configuration of a single load test — use this to inspect a test's settings, script reference, SLA thresholds and children.",
|
|
1362
|
+
"guidance": [
|
|
1363
|
+
"testId is numeric (from listLoadTests).",
|
|
1364
|
+
"Use include to expand config / thresholds / tags / children."
|
|
1365
|
+
],
|
|
1366
|
+
"returns": [
|
|
1367
|
+
"testId",
|
|
1368
|
+
"name",
|
|
1369
|
+
"testType",
|
|
1370
|
+
"framework",
|
|
1371
|
+
"version",
|
|
1372
|
+
"projectId",
|
|
1373
|
+
"ownerUserId",
|
|
1374
|
+
"config"
|
|
1375
|
+
],
|
|
1376
|
+
"responses": {
|
|
1377
|
+
"200": {
|
|
1378
|
+
"$response": "Success"
|
|
1379
|
+
},
|
|
1380
|
+
"400": {
|
|
1381
|
+
"$response": "BadRequest"
|
|
1382
|
+
},
|
|
1383
|
+
"401": {
|
|
1384
|
+
"$response": "Unauthorized"
|
|
1385
|
+
},
|
|
1386
|
+
"404": {
|
|
1387
|
+
"$response": "NotFound"
|
|
1388
|
+
},
|
|
1389
|
+
"500": {
|
|
1390
|
+
"$response": "InternalServerError"
|
|
1391
|
+
}
|
|
1392
|
+
}
|
|
1393
|
+
}
|
|
1394
|
+
],
|
|
1395
|
+
"schemas": {
|
|
1396
|
+
"SuccessEnvelope": {
|
|
1397
|
+
"type": "object",
|
|
1398
|
+
"properties": {
|
|
1399
|
+
"success": {
|
|
1400
|
+
"type": "boolean",
|
|
1401
|
+
"example": true
|
|
1402
|
+
},
|
|
1403
|
+
"data": {
|
|
1404
|
+
"type": "object",
|
|
1405
|
+
"description": "Operation payload; its fields are listed in each capability's `returns`."
|
|
1406
|
+
}
|
|
1407
|
+
},
|
|
1408
|
+
"required": [
|
|
1409
|
+
"success",
|
|
1410
|
+
"data"
|
|
1411
|
+
]
|
|
1412
|
+
},
|
|
1413
|
+
"ErrorResponse": {
|
|
1414
|
+
"type": "object",
|
|
1415
|
+
"properties": {
|
|
1416
|
+
"success": {
|
|
1417
|
+
"type": "boolean",
|
|
1418
|
+
"example": false
|
|
1419
|
+
},
|
|
1420
|
+
"errorCode": {
|
|
1421
|
+
"type": "string",
|
|
1422
|
+
"example": "NOT_FOUND"
|
|
1423
|
+
},
|
|
1424
|
+
"error": {
|
|
1425
|
+
"type": "string",
|
|
1426
|
+
"example": "The requested resource was not found."
|
|
1427
|
+
}
|
|
1428
|
+
},
|
|
1429
|
+
"required": [
|
|
1430
|
+
"success",
|
|
1431
|
+
"error"
|
|
1432
|
+
]
|
|
1433
|
+
}
|
|
1434
|
+
},
|
|
1435
|
+
"responses": {
|
|
1436
|
+
"Success": {
|
|
1437
|
+
"description": "Standard success envelope; operation data under `data`.",
|
|
1438
|
+
"schema": {
|
|
1439
|
+
"$schema": "SuccessEnvelope"
|
|
1440
|
+
}
|
|
1441
|
+
},
|
|
1442
|
+
"BadRequest": {
|
|
1443
|
+
"description": "Invalid parameters or body.",
|
|
1444
|
+
"schema": {
|
|
1445
|
+
"$schema": "ErrorResponse"
|
|
1446
|
+
}
|
|
1447
|
+
},
|
|
1448
|
+
"Unauthorized": {
|
|
1449
|
+
"description": "Missing or invalid credentials.",
|
|
1450
|
+
"schema": {
|
|
1451
|
+
"$schema": "ErrorResponse"
|
|
1452
|
+
}
|
|
1453
|
+
},
|
|
1454
|
+
"NotFound": {
|
|
1455
|
+
"description": "The referenced project, test or run was not found or not visible to the caller.",
|
|
1456
|
+
"schema": {
|
|
1457
|
+
"$schema": "ErrorResponse"
|
|
1458
|
+
}
|
|
1459
|
+
},
|
|
1460
|
+
"Conflict": {
|
|
1461
|
+
"description": "Optimistic-concurrency version conflict (ifVersion mismatch).",
|
|
1462
|
+
"schema": {
|
|
1463
|
+
"$schema": "ErrorResponse"
|
|
1464
|
+
}
|
|
1465
|
+
},
|
|
1466
|
+
"ServiceUnavailable": {
|
|
1467
|
+
"description": "A dependency (e.g. the AI insight backend) is temporarily unavailable.",
|
|
1468
|
+
"schema": {
|
|
1469
|
+
"$schema": "ErrorResponse"
|
|
1470
|
+
}
|
|
1471
|
+
},
|
|
1472
|
+
"InternalServerError": {
|
|
1473
|
+
"description": "Unexpected server error.",
|
|
1474
|
+
"schema": {
|
|
1475
|
+
"$schema": "ErrorResponse"
|
|
1476
|
+
}
|
|
1477
|
+
}
|
|
1478
|
+
},
|
|
1479
|
+
"paging": {
|
|
1480
|
+
"GET /api/v1/agent/projects": {
|
|
1481
|
+
"page": "cursor",
|
|
1482
|
+
"size": "limit"
|
|
1483
|
+
},
|
|
1484
|
+
"GET /api/v1/agent/projects/{projectId}/loadTests": {
|
|
1485
|
+
"page": "cursor",
|
|
1486
|
+
"size": "limit"
|
|
1487
|
+
},
|
|
1488
|
+
"GET /api/v1/agent/loadTests/{testId}/runs": {
|
|
1489
|
+
"page": "cursor",
|
|
1490
|
+
"size": "limit"
|
|
1491
|
+
}
|
|
1492
|
+
},
|
|
1493
|
+
"entities": {
|
|
1494
|
+
"loadTest": {
|
|
1495
|
+
"entity": "loadTest",
|
|
1496
|
+
"title": "Load Test",
|
|
1497
|
+
"aliases": [
|
|
1498
|
+
"test",
|
|
1499
|
+
"load test",
|
|
1500
|
+
"test configuration",
|
|
1501
|
+
"test config",
|
|
1502
|
+
"scenario",
|
|
1503
|
+
"k6 test",
|
|
1504
|
+
"jmeter test",
|
|
1505
|
+
"gatling test"
|
|
1506
|
+
],
|
|
1507
|
+
"id_convention": "testId is a numeric JobConfiguration id (integer). It is NOT the run id. Always discover it via listLoadTests for a project — never assume a value. A test also carries a version — an opaque ISO-8601 token that advances on each edit; pass it back verbatim as ifVersion for optimistic concurrency.",
|
|
1508
|
+
"parents": [
|
|
1509
|
+
"project"
|
|
1510
|
+
],
|
|
1511
|
+
"relations": [
|
|
1512
|
+
{
|
|
1513
|
+
"entity": "project",
|
|
1514
|
+
"via": "belongs to"
|
|
1515
|
+
},
|
|
1516
|
+
{
|
|
1517
|
+
"entity": "run",
|
|
1518
|
+
"via": "is executed as"
|
|
1519
|
+
},
|
|
1520
|
+
{
|
|
1521
|
+
"entity": "metrics",
|
|
1522
|
+
"via": "declares"
|
|
1523
|
+
}
|
|
1524
|
+
],
|
|
1525
|
+
"capabilities": [
|
|
1526
|
+
"listLoadTests",
|
|
1527
|
+
"getLoadTest",
|
|
1528
|
+
"createLoadTest",
|
|
1529
|
+
"updateLoadTest"
|
|
1530
|
+
]
|
|
1531
|
+
},
|
|
1532
|
+
"run": {
|
|
1533
|
+
"entity": "run",
|
|
1534
|
+
"title": "Run",
|
|
1535
|
+
"aliases": [
|
|
1536
|
+
"execution",
|
|
1537
|
+
"job",
|
|
1538
|
+
"test run",
|
|
1539
|
+
"load test run",
|
|
1540
|
+
"run",
|
|
1541
|
+
"job execution"
|
|
1542
|
+
],
|
|
1543
|
+
"id_convention": "A run is addressed by runId (also called jobId), a UUID hashedId string — NOT the numeric testId. Discover run ids via listLoadTestRuns or listActiveLoadTestRuns; never assume or fabricate one.",
|
|
1544
|
+
"parents": [
|
|
1545
|
+
"loadTest"
|
|
1546
|
+
],
|
|
1547
|
+
"relations": [
|
|
1548
|
+
{
|
|
1549
|
+
"entity": "loadTest",
|
|
1550
|
+
"via": "executes"
|
|
1551
|
+
},
|
|
1552
|
+
{
|
|
1553
|
+
"entity": "report",
|
|
1554
|
+
"via": "produces"
|
|
1555
|
+
},
|
|
1556
|
+
{
|
|
1557
|
+
"entity": "insight",
|
|
1558
|
+
"via": "produces"
|
|
1559
|
+
}
|
|
1560
|
+
],
|
|
1561
|
+
"capabilities": [
|
|
1562
|
+
"startLoadTestRun",
|
|
1563
|
+
"stopLoadTestRun",
|
|
1564
|
+
"getLoadTestRunStatus",
|
|
1565
|
+
"listLoadTestRuns",
|
|
1566
|
+
"listActiveLoadTestRuns"
|
|
1567
|
+
]
|
|
1568
|
+
},
|
|
1569
|
+
"project": {
|
|
1570
|
+
"entity": "project",
|
|
1571
|
+
"title": "Project",
|
|
1572
|
+
"aliases": [
|
|
1573
|
+
"project",
|
|
1574
|
+
"workspace",
|
|
1575
|
+
"folder",
|
|
1576
|
+
"test group"
|
|
1577
|
+
],
|
|
1578
|
+
"id_convention": "projectId is a numeric Project id (integer). Discover it via listLoadTestProjects; a project can also be created implicitly by createLoadTest via projectName.",
|
|
1579
|
+
"parents": [],
|
|
1580
|
+
"relations": [
|
|
1581
|
+
{
|
|
1582
|
+
"entity": "loadTest",
|
|
1583
|
+
"via": "contains"
|
|
1584
|
+
},
|
|
1585
|
+
{
|
|
1586
|
+
"entity": "trend",
|
|
1587
|
+
"via": "aggregates"
|
|
1588
|
+
}
|
|
1589
|
+
],
|
|
1590
|
+
"capabilities": [
|
|
1591
|
+
"listLoadTestProjects"
|
|
1592
|
+
]
|
|
1593
|
+
},
|
|
1594
|
+
"report": {
|
|
1595
|
+
"entity": "report",
|
|
1596
|
+
"title": "Run Report",
|
|
1597
|
+
"aliases": [
|
|
1598
|
+
"report",
|
|
1599
|
+
"result",
|
|
1600
|
+
"results",
|
|
1601
|
+
"metrics report",
|
|
1602
|
+
"run report",
|
|
1603
|
+
"summary",
|
|
1604
|
+
"kpis"
|
|
1605
|
+
],
|
|
1606
|
+
"id_convention": "A report is not independently identified — it is addressed by the run's runId (jobId). Fetch it only after a run reaches a terminal state.",
|
|
1607
|
+
"parents": [
|
|
1608
|
+
"run"
|
|
1609
|
+
],
|
|
1610
|
+
"relations": [
|
|
1611
|
+
{
|
|
1612
|
+
"entity": "run",
|
|
1613
|
+
"via": "belongs to"
|
|
1614
|
+
}
|
|
1615
|
+
],
|
|
1616
|
+
"capabilities": [
|
|
1617
|
+
"getLoadTestRunReport",
|
|
1618
|
+
"compareLoadTestRuns"
|
|
1619
|
+
]
|
|
1620
|
+
},
|
|
1621
|
+
"insight": {
|
|
1622
|
+
"entity": "insight",
|
|
1623
|
+
"title": "AI Insight",
|
|
1624
|
+
"aliases": [
|
|
1625
|
+
"insight",
|
|
1626
|
+
"ai insight",
|
|
1627
|
+
"root cause",
|
|
1628
|
+
"rca",
|
|
1629
|
+
"analysis",
|
|
1630
|
+
"recommendation",
|
|
1631
|
+
"summary"
|
|
1632
|
+
],
|
|
1633
|
+
"id_convention": "Addressed by the run's runId (jobId). Insights are AI-generated after a run completes; a non-terminal run returns an in_progress state rather than a report.",
|
|
1634
|
+
"parents": [
|
|
1635
|
+
"run"
|
|
1636
|
+
],
|
|
1637
|
+
"relations": [
|
|
1638
|
+
{
|
|
1639
|
+
"entity": "run",
|
|
1640
|
+
"via": "belongs to"
|
|
1641
|
+
}
|
|
1642
|
+
],
|
|
1643
|
+
"capabilities": [
|
|
1644
|
+
"getLoadTestInsightSummary"
|
|
1645
|
+
]
|
|
1646
|
+
},
|
|
1647
|
+
"trend": {
|
|
1648
|
+
"entity": "trend",
|
|
1649
|
+
"title": "Historical Trend",
|
|
1650
|
+
"aliases": [
|
|
1651
|
+
"trend",
|
|
1652
|
+
"trends",
|
|
1653
|
+
"history",
|
|
1654
|
+
"time series",
|
|
1655
|
+
"over time",
|
|
1656
|
+
"historical trends",
|
|
1657
|
+
"regression trend"
|
|
1658
|
+
],
|
|
1659
|
+
"id_convention": "Not independently identified — scoped by either a testId (per-test trend) or a projectId (project rollup). Resolve those ids first.",
|
|
1660
|
+
"parents": [
|
|
1661
|
+
"loadTest",
|
|
1662
|
+
"project"
|
|
1663
|
+
],
|
|
1664
|
+
"relations": [
|
|
1665
|
+
{
|
|
1666
|
+
"entity": "loadTest",
|
|
1667
|
+
"via": "aggregates"
|
|
1668
|
+
},
|
|
1669
|
+
{
|
|
1670
|
+
"entity": "project",
|
|
1671
|
+
"via": "aggregates"
|
|
1672
|
+
}
|
|
1673
|
+
],
|
|
1674
|
+
"capabilities": [
|
|
1675
|
+
"getLoadTestHistoricalTrends"
|
|
1676
|
+
]
|
|
1677
|
+
},
|
|
1678
|
+
"quota": {
|
|
1679
|
+
"entity": "quota",
|
|
1680
|
+
"title": "Quota & Cost",
|
|
1681
|
+
"aliases": [
|
|
1682
|
+
"quota",
|
|
1683
|
+
"vu hours",
|
|
1684
|
+
"vuh",
|
|
1685
|
+
"vu-hours",
|
|
1686
|
+
"credits",
|
|
1687
|
+
"entitlement",
|
|
1688
|
+
"plan limits",
|
|
1689
|
+
"concurrency",
|
|
1690
|
+
"cost",
|
|
1691
|
+
"estimate",
|
|
1692
|
+
"budget"
|
|
1693
|
+
],
|
|
1694
|
+
"id_convention": "Account/group-scoped — there is no id. Resolved from the authenticated caller's credentials; never pass a tenant or group id as a parameter.",
|
|
1695
|
+
"parents": [],
|
|
1696
|
+
"relations": [
|
|
1697
|
+
{
|
|
1698
|
+
"entity": "run",
|
|
1699
|
+
"via": "is consumed by"
|
|
1700
|
+
}
|
|
1701
|
+
],
|
|
1702
|
+
"capabilities": [
|
|
1703
|
+
"getLoadTestQuota",
|
|
1704
|
+
"estimateLoadTestRunCost"
|
|
1705
|
+
]
|
|
1706
|
+
},
|
|
1707
|
+
"metrics": {
|
|
1708
|
+
"entity": "metrics",
|
|
1709
|
+
"title": "Metrics Manifest",
|
|
1710
|
+
"aliases": [
|
|
1711
|
+
"metric",
|
|
1712
|
+
"metrics",
|
|
1713
|
+
"kpi",
|
|
1714
|
+
"measurement",
|
|
1715
|
+
"manifest",
|
|
1716
|
+
"available metrics",
|
|
1717
|
+
"metric names",
|
|
1718
|
+
"aliases"
|
|
1719
|
+
],
|
|
1720
|
+
"id_convention": "Not an instance — a per-testType catalogue of the metric names, @ aliases and groupBy options a test supports. Scoped by testId; fetch once and cache client-side.",
|
|
1721
|
+
"parents": [
|
|
1722
|
+
"loadTest"
|
|
1723
|
+
],
|
|
1724
|
+
"relations": [
|
|
1725
|
+
{
|
|
1726
|
+
"entity": "loadTest",
|
|
1727
|
+
"via": "describes"
|
|
1728
|
+
}
|
|
1729
|
+
],
|
|
1730
|
+
"capabilities": [
|
|
1731
|
+
"getLoadTestMetricsManifest"
|
|
1732
|
+
]
|
|
1733
|
+
},
|
|
1734
|
+
"platform": {
|
|
1735
|
+
"entity": "platform",
|
|
1736
|
+
"title": "Platform Status",
|
|
1737
|
+
"aliases": [
|
|
1738
|
+
"platform",
|
|
1739
|
+
"status",
|
|
1740
|
+
"health",
|
|
1741
|
+
"service status",
|
|
1742
|
+
"availability",
|
|
1743
|
+
"uptime"
|
|
1744
|
+
],
|
|
1745
|
+
"id_convention": "Singleton — no id. A shallow health probe of the Load Testing service dependencies.",
|
|
1746
|
+
"parents": [],
|
|
1747
|
+
"relations": [],
|
|
1748
|
+
"capabilities": [
|
|
1749
|
+
"getLoadTestPlatformStatus"
|
|
1750
|
+
]
|
|
1751
|
+
}
|
|
1752
|
+
}
|
|
1753
|
+
}
|
|
1754
|
+
}
|