k6-perf-reporter 1.7.4 → 1.8.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/.claude/settings.local.json +63 -1
- package/.config.example.json +11 -0
- package/README.md +40 -7
- package/dist/config.d.ts +7 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +12 -2
- package/dist/config.js.map +1 -1
- package/dist/data-collector.d.ts.map +1 -1
- package/dist/data-collector.js +13 -23
- package/dist/data-collector.js.map +1 -1
- package/dist/datasources/datasource.d.ts +9 -3
- package/dist/datasources/datasource.d.ts.map +1 -1
- package/dist/datasources/factory.d.ts.map +1 -1
- package/dist/datasources/factory.js +5 -0
- package/dist/datasources/factory.js.map +1 -1
- package/dist/datasources/influx/influx-datasource.d.ts +11 -3
- package/dist/datasources/influx/influx-datasource.d.ts.map +1 -1
- package/dist/datasources/influx/influx-datasource.js +49 -10
- package/dist/datasources/influx/influx-datasource.js.map +1 -1
- package/dist/datasources/victoriametrics/index.d.ts +3 -0
- package/dist/datasources/victoriametrics/index.d.ts.map +1 -0
- package/dist/datasources/victoriametrics/index.js +8 -0
- package/dist/datasources/victoriametrics/index.js.map +1 -0
- package/dist/datasources/victoriametrics/vm-client.d.ts +17 -0
- package/dist/datasources/victoriametrics/vm-client.d.ts.map +1 -0
- package/dist/datasources/victoriametrics/vm-client.js +58 -0
- package/dist/datasources/victoriametrics/vm-client.js.map +1 -0
- package/dist/datasources/victoriametrics/vm-datasource.d.ts +34 -0
- package/dist/datasources/victoriametrics/vm-datasource.d.ts.map +1 -0
- package/dist/datasources/victoriametrics/vm-datasource.js +411 -0
- package/dist/datasources/victoriametrics/vm-datasource.js.map +1 -0
- package/dist/reporters/cli-reporter.d.ts.map +1 -1
- package/dist/reporters/cli-reporter.js +3 -0
- package/dist/reporters/cli-reporter.js.map +1 -1
- package/dist/reporters/markdown-reporter.d.ts.map +1 -1
- package/dist/reporters/markdown-reporter.js +7 -3
- package/dist/reporters/markdown-reporter.js.map +1 -1
- package/dist/reporters/slack-reporter.d.ts.map +1 -1
- package/dist/reporters/slack-reporter.js +7 -3
- package/dist/reporters/slack-reporter.js.map +1 -1
- package/dist/types/metrics.d.ts +1 -0
- package/dist/types/metrics.d.ts.map +1 -1
- package/package.json +3 -2
- package/src/config.ts +29 -3
- package/src/data-collector.ts +22 -38
- package/src/datasources/datasource.ts +16 -4
- package/src/datasources/factory.ts +5 -0
- package/src/datasources/influx/influx-datasource.ts +85 -59
- package/src/datasources/victoriametrics/index.ts +2 -0
- package/src/datasources/victoriametrics/vm-client.ts +92 -0
- package/src/datasources/victoriametrics/vm-datasource.ts +547 -0
- package/src/reporters/cli-reporter.ts +3 -0
- package/src/reporters/markdown-reporter.ts +7 -3
- package/src/reporters/slack-reporter.ts +8 -3
- package/src/types/metrics.ts +1 -0
|
@@ -12,7 +12,69 @@
|
|
|
12
12
|
"Bash(git commit *)",
|
|
13
13
|
"Bash(git pull *)",
|
|
14
14
|
"Bash(git stash *)",
|
|
15
|
-
"Bash(wc *)"
|
|
15
|
+
"Bash(wc *)",
|
|
16
|
+
"mcp__ide__executeCode",
|
|
17
|
+
"Bash(curl -s 'https://victoria.cmn.monoecom.tech/api/v1/label/__name__/values')",
|
|
18
|
+
"Bash(python3 -m json.tool)",
|
|
19
|
+
"Bash(curl -sv 'https://victoria.cmn.monoecom.tech/api/v1/label/__name__/values')",
|
|
20
|
+
"Bash(curl -s -o /dev/null -w \"%{http_code}\" 'https://victoria.cmn.monoecom.tech/')",
|
|
21
|
+
"Bash(curl -s -o /dev/null -w \"%{http_code}\" 'https://victoria.cmn.monoecom.tech/select/0/prometheus/api/v1/label/__name__/values')",
|
|
22
|
+
"Bash(curl -s -o /dev/null -w \"%{http_code}\" 'https://victoria.cmn.monoecom.tech/vmselect/prometheus/api/v1/label/__name__/values')",
|
|
23
|
+
"Bash(curl -s 'https://victoria.cmn.monoecom.tech/select/0/prometheus/api/v1/label/__name__/values')",
|
|
24
|
+
"Bash(python3 -c \"import sys,json; data=json.load\\(sys.stdin\\); [print\\(v\\) for v in data['data'] if 'k6' in v.lower\\(\\)]\")",
|
|
25
|
+
"Bash(python3 -c \"import sys,json; data=json.load\\(sys.stdin\\); print\\(data['status']\\); vals=data.get\\('data',[]\\); print\\(f'{len\\(vals\\)} metrics total'\\); [print\\(v\\) for v in vals[:20]]\")",
|
|
26
|
+
"Bash(python3 -c ' *)",
|
|
27
|
+
"Bash(curl -s 'https://victoria.cmn.monoecom.tech/select/0/prometheus/api/v1/label/runId/values')",
|
|
28
|
+
"Bash(curl -s 'https://victoria.cmn.monoecom.tech/select/0/prometheus/api/v1/series?match[]=k6_http_reqs_total')",
|
|
29
|
+
"Bash(curl -s 'https://victoria.cmn.monoecom.tech/select/0/prometheus/api/v1/query?query=k6_http_req_duration_p95')",
|
|
30
|
+
"Bash(curl -s 'https://victoria.cmn.monoecom.tech/select/0/prometheus/api/v1/query?query=k6_http_req_duration_p95%7BrunId%3D%22vmtest%22%7D&time=now')",
|
|
31
|
+
"Bash(curl -s 'https://victoria.cmn.monoecom.tech/select/0/prometheus/api/v1/series?match[]=k6_error_responses_total')",
|
|
32
|
+
"Bash(curl -s 'https://victoria.cmn.monoecom.tech/select/0/prometheus/api/v1/query?query=k6_http_req_duration_p95%7BrunId%3D%22vmtest%22%7D&time=2026-07-01T00:00:00Z')",
|
|
33
|
+
"Bash(curl -s 'https://victoria.cmn.monoecom.tech/select/0/prometheus/api/v1/query_range?query=sum\\(k6_http_reqs_total%7BrunId%3D%22vmtest%22%7D\\)&start=2026-01-01T00:00:00Z&end=2026-07-10T00:00:00Z&step=86400')",
|
|
34
|
+
"Bash(curl -s 'https://victoria.cmn.monoecom.tech/select/0/prometheus/api/v1/query?query=k6_http_reqs_total%7BrunId%3D%22vmtest%22%7D')",
|
|
35
|
+
"Bash(curl -s 'https://victoria.cmn.monoecom.tech/select/0/prometheus/api/v1/query?query=k6_http_reqs_total')",
|
|
36
|
+
"Bash(curl -s 'https://victoria.cmn.monoecom.tech/select/0/prometheus/api/v1/query_range?query=sum\\(k6_http_reqs_total%7BrunId%3D%221147507%22%7D\\)&start=2026-06-01T00:00:00Z&end=2026-07-10T00:00:00Z&step=3600')",
|
|
37
|
+
"Bash(curl -s 'https://victoria.cmn.monoecom.tech/select/0/prometheus/api/v1/query_range?query=sum\\(k6_http_reqs_total%7BrunId%3D%221147507%22%7D\\)&start=2026-07-01T00:00:00Z&end=2026-07-10T23:59:59Z&step=60')",
|
|
38
|
+
"Bash(curl -s 'https://victoria.cmn.monoecom.tech/select/0/prometheus/api/v1/query?query=k6_http_req_duration_p95%7BrunId%3D%221147507%22%7D&time=2026-07-09T19:00:00Z')",
|
|
39
|
+
"Bash(curl -s 'https://victoria.cmn.monoecom.tech/select/0/prometheus/api/v1/query?query=k6_iteration_duration_p95%7BrunId%3D%221147507%22%7D&time=2026-07-09T19:00:00Z')",
|
|
40
|
+
"Bash(curl -s 'https://victoria.cmn.monoecom.tech/select/0/prometheus/api/v1/query?query=k6_http_req_duration_min%7BrunId%3D%221147507%22%7D&time=2026-07-09T19:00:00Z')",
|
|
41
|
+
"Bash(curl -s 'https://victoria.cmn.monoecom.tech/select/0/prometheus/api/v1/query?query=k6_iteration_duration_min%7BrunId%3D%221147507%22%7D&time=2026-07-09T19:00:00Z')",
|
|
42
|
+
"Bash(curl -s 'https://victoria.cmn.monoecom.tech/select/0/prometheus/api/v1/query?query=k6_checks_rate%7BrunId%3D%221147507%22%7D&time=2026-07-09T19:00:00Z')",
|
|
43
|
+
"Bash(curl -s 'https://victoria.cmn.monoecom.tech/select/0/prometheus/api/v1/query?query=k6_vus%7BrunId%3D%221147507%22%7D&time=2026-07-09T19:00:00Z')",
|
|
44
|
+
"Bash(npx tsx *)",
|
|
45
|
+
"Bash(python3 *)",
|
|
46
|
+
"Bash(curl -s https://victoria.cmn.monoecom.tech/select/0/prometheus/api/v1/query --data-urlencode 'query=avg by\\(name,method,status\\)\\(k6_http_req_duration_p95{runId=\"1147507\"}\\)' --data-urlencode time=2026-07-09T19:00:00Z)",
|
|
47
|
+
"Bash(curl -s https://victoria.cmn.monoecom.tech/select/0/prometheus/api/v1/query --data-urlencode 'query=increase\\(k6_error_responses_total{runId=\"vmtest\"}[7200s]\\)' --data-urlencode time=2026-07-09T20:00:00Z)",
|
|
48
|
+
"Bash(curl -s https://victoria.cmn.monoecom.tech/select/0/prometheus/api/v1/query --data-urlencode 'query=increase\\(k6_error_responses_total{runId=\"vmtest\"}[7200s]\\)' --data-urlencode time=2026-07-09T19:10:00Z)",
|
|
49
|
+
"Bash(curl -s https://victoria.cmn.monoecom.tech/select/0/prometheus/api/v1/query --data-urlencode 'query=increase\\(k6_error_responses_total{runId=\"1147507\"}[7200s]\\)' --data-urlencode time=2026-07-09T20:00:00Z)",
|
|
50
|
+
"Bash(curl -s https://victoria.cmn.monoecom.tech/select/0/prometheus/api/v1/query_range --data-urlencode 'query=sum\\(k6_error_responses_total\\)' --data-urlencode start=2026-07-01T00:00:00Z --data-urlencode end=2026-07-10T00:00:00Z --data-urlencode step=3600)",
|
|
51
|
+
"Bash(node *)",
|
|
52
|
+
"Bash(LOG_LEVEL=debug tsx src/cli.ts generate --run-id '1011202689' -d victoriametrics -st '-5h' --format cli)",
|
|
53
|
+
"Bash(LOG_LEVEL=debug npx tsx src/cli.ts generate --run-id '1011202689' -d victoriametrics -st '-5h' --format cli)",
|
|
54
|
+
"Bash(curl -s \"https://victoria.cmn.monoecom.tech/select/0/prometheus/api/v1/label/__name__/values\")",
|
|
55
|
+
"Bash(curl -s https://victoria.cmn.monoecom.tech/select/0/prometheus/api/v1/query --data-urlencode 'query=k6_http_req_duration_p95{runId=\"1011202689\"}' --data-urlencode time=__CMDSUB_OUTPUT__)",
|
|
56
|
+
"Bash(date -jf \"%Y-%m-%dT%H:%M:%S\" \"2026-07-10T08:21:22\" \"+%s\")",
|
|
57
|
+
"Bash(curl -s https://victoria.cmn.monoecom.tech/select/0/prometheus/api/v1/query --data-urlencode 'query=last_over_time\\(k6_http_req_duration_p95{runId=\"1011202689\"}[24h]\\)' --data-urlencode time=1783660882)",
|
|
58
|
+
"Bash(curl -s https://victoria.cmn.monoecom.tech/select/0/prometheus/api/v1/query --data-urlencode 'query=k6_http_reqs_total{runId=\"1011202689\"}' --data-urlencode time=1783660882)",
|
|
59
|
+
"Bash(VM_TREND_AS_NATIVE_HISTOGRAM=true npm run report:example:vm)",
|
|
60
|
+
"Bash(LOG_LEVEL=debug VM_TREND_AS_NATIVE_HISTOGRAM=true npx tsx src/cli.ts generate --run-id '1011202689' -d victoriametrics -st '-5h' --format cli)",
|
|
61
|
+
"Bash(curl -s https://victoria.cmn.monoecom.tech/select/0/prometheus/api/v1/query --data-urlencode 'query=sum\\(increase\\(k6_http_req_duration_bucket{runId=\"1011202689\"}[18000s]\\)\\) by \\(le\\)' --data-urlencode time=1783660882)",
|
|
62
|
+
"Bash(LOG_LEVEL=debug VM_TREND_AS_NATIVE_HISTOGRAM=true VM_TREND_UNIT_SUFFIX=_seconds npx tsx src/cli.ts generate --run-id '1011202689' -d victoriametrics -st '-5h' --format cli)",
|
|
63
|
+
"Bash(VM_TREND_AS_NATIVE_HISTOGRAM=true VM_TREND_UNIT_SUFFIX=_seconds npm run report:example:vm)",
|
|
64
|
+
"Bash(curl -s https://victoria.cmn.monoecom.tech/select/0/prometheus/api/v1/query --data-urlencode 'query=k6_http_req_duration_seconds_bucket{runId=\"1011202689\"}' --data-urlencode time=1783660882)",
|
|
65
|
+
"Bash(curl -s https://victoria.cmn.monoecom.tech/select/0/prometheus/api/v1/query --data-urlencode 'query=sum\\(increase\\(k6_http_req_duration_seconds_bucket{runId=\"1011202689\"}[18000s]\\)\\) by \\(le\\)' --data-urlencode time=__CMDSUB_OUTPUT__)",
|
|
66
|
+
"Bash(curl -s https://victoria.cmn.monoecom.tech/select/0/prometheus/api/v1/query --data-urlencode 'query=k6_http_req_duration_seconds_bucket{runId=\"1011202689\"}' --data-urlencode time=__CMDSUB_OUTPUT__)",
|
|
67
|
+
"Bash(curl -s https://victoria.cmn.monoecom.tech/select/0/prometheus/api/v1/query_range --data-urlencode 'query=k6_http_req_duration_seconds_bucket{runId=\"1011202689\"}' --data-urlencode start=1783658000 --data-urlencode end=1783661000 --data-urlencode step=60)",
|
|
68
|
+
"Bash(curl -s https://victoria.cmn.monoecom.tech/select/0/prometheus/api/v1/query --data-urlencode 'query=last_over_time\\(k6_http_req_duration_seconds_bucket{runId=\"1011202689\"}[18000s]\\)' --data-urlencode time=__CMDSUB_OUTPUT__)",
|
|
69
|
+
"Bash(curl -s https://victoria.cmn.monoecom.tech/select/0/prometheus/api/v1/query --data-urlencode 'query=sum\\(increase\\(k6_http_req_duration_seconds_sum{runId=\"1011202689\"}[18000s]\\)\\)' --data-urlencode time=__CMDSUB_OUTPUT__)",
|
|
70
|
+
"Bash(LOG_LEVEL=debug npm run report:example:vm)",
|
|
71
|
+
"Bash(curl -s \"http://localhost:8428/api/v1/label/__name__/values\")",
|
|
72
|
+
"WebSearch",
|
|
73
|
+
"WebFetch(domain:grafana.com)",
|
|
74
|
+
"Bash(curl -s \"https://victoria.cmn.monoecom.tech/select/0/prometheus/api/v1/query?query=k6_http_req_duration_avg%7BrunId%3D%2210112026891267%22%7D&time=now\")",
|
|
75
|
+
"Bash(curl -s \"https://victoria.cmn.monoecom.tech/select/0/prometheus/api/v1/query?query=k6_http_req_duration_avg\")",
|
|
76
|
+
"Bash(curl -s \"https://victoria.cmn.monoecom.tech/select/0/prometheus/api/v1/label/runId/values\")",
|
|
77
|
+
"Bash(DATASOURCE=victoriametrics VM_URL=https://victoria.cmn.monoecom.tech/select/0/prometheus LOG_LEVEL=info npx tsx src/cli.ts generate --run-id '10112026891267' -st '-30d' --report cli --no-cache)"
|
|
16
78
|
]
|
|
17
79
|
}
|
|
18
80
|
}
|
package/.config.example.json
CHANGED
|
@@ -1,10 +1,21 @@
|
|
|
1
1
|
{
|
|
2
|
+
"_comment_datasource": "Supported values: influxdb (default), victoriametrics, prometheus",
|
|
3
|
+
"dataSource": "influxdb",
|
|
4
|
+
|
|
5
|
+
"_comment_influx": "Used when dataSource = influxdb",
|
|
2
6
|
"influx": {
|
|
3
7
|
"url": "http://localhost:8086",
|
|
4
8
|
"token": "${INFLUX_TOKEN}",
|
|
5
9
|
"org": "my-org",
|
|
6
10
|
"bucket": "k6"
|
|
7
11
|
},
|
|
12
|
+
|
|
13
|
+
"_comment_vm": "Used when dataSource = victoriametrics",
|
|
14
|
+
"victoriametrics": {
|
|
15
|
+
"url": "http://localhost:8428",
|
|
16
|
+
"token": "${VM_TOKEN}"
|
|
17
|
+
},
|
|
18
|
+
|
|
8
19
|
"slack": {
|
|
9
20
|
"token": "${SLACK_TOKEN}",
|
|
10
21
|
"channel": "#k6-reports"
|
package/README.md
CHANGED
|
@@ -52,7 +52,8 @@ Configuration can be provided via config file (`.config.json`) or environment va
|
|
|
52
52
|
"slack": {
|
|
53
53
|
"token": "${SLACK_TOKEN}",
|
|
54
54
|
"channel": "#k6-reports"
|
|
55
|
-
}
|
|
55
|
+
},
|
|
56
|
+
"ignoredStatusCodes": [404, 401]
|
|
56
57
|
}
|
|
57
58
|
```
|
|
58
59
|
|
|
@@ -68,6 +69,9 @@ export INFLUX_BUCKET=k6
|
|
|
68
69
|
# Slack Configuration (optional)
|
|
69
70
|
export SLACK_TOKEN=xoxb-your-slack-token
|
|
70
71
|
export SLACK_CHANNEL=#k6-reports
|
|
72
|
+
|
|
73
|
+
# Ignored status codes (optional)
|
|
74
|
+
export IGNORE_STATUS_CODES=404,401
|
|
71
75
|
```
|
|
72
76
|
|
|
73
77
|
**Note:** Environment variables support `${ENV_VAR}` references in config file (e.g., `"token": "${INFLUX_TOKEN}"`).
|
|
@@ -166,12 +170,17 @@ See [example markdown report](examples/report.example.md) for output format.
|
|
|
166
170
|
### Command Options
|
|
167
171
|
|
|
168
172
|
```
|
|
169
|
-
--run-id <id>
|
|
170
|
-
-st, --start-time <time>
|
|
171
|
-
-et, --end-time <time>
|
|
172
|
-
-c, --config <path>
|
|
173
|
-
-
|
|
174
|
-
-
|
|
173
|
+
--run-id <id> k6 test run ID (required)
|
|
174
|
+
-st, --start-time <time> Start time (relative: -1h, -30m, or ISO 8601)
|
|
175
|
+
-et, --end-time <time> End time (ISO 8601 format, defaults to now)
|
|
176
|
+
-c, --config <path> Path to config file (default: .config.json)
|
|
177
|
+
-d, --datasource <type> Data source: 'influxdb' or 'prometheus' (default: influxdb)
|
|
178
|
+
-f, --format <format> Output format: 'json', 'cli', 'markdown', or 'slack' (default: cli)
|
|
179
|
+
-r, --report <reporters> Run multiple reporters (comma-separated): cli, json, markdown, slack
|
|
180
|
+
-o, --output <path> Output file path (for json and markdown formats)
|
|
181
|
+
--no-cache Disable cache, always fetch fresh data
|
|
182
|
+
-p, --params <params...> Execution parameters as key=value pairs (e.g. --params env=prod)
|
|
183
|
+
--ignore-status-codes <codes> Comma-separated HTTP status codes to exclude from error metrics
|
|
175
184
|
```
|
|
176
185
|
|
|
177
186
|
### Time Format Examples
|
|
@@ -215,6 +224,29 @@ See [example markdown report](examples/report.example.md) for output format.
|
|
|
215
224
|
- Iteration duration (min, max, avg, p90, p95)
|
|
216
225
|
- Virtual users (current, min, max)
|
|
217
226
|
|
|
227
|
+
## Ignoring Status Codes
|
|
228
|
+
|
|
229
|
+
Some status codes (e.g. `404`, `401`) may be expected in your test and shouldn't count as errors. Use `ignoredStatusCodes` to exclude them from failed request counts, error response counts, and error breakdowns.
|
|
230
|
+
|
|
231
|
+
**CLI flag:**
|
|
232
|
+
```bash
|
|
233
|
+
k6-reporter generate --run-id 123 --ignore-status-codes 404,401
|
|
234
|
+
```
|
|
235
|
+
|
|
236
|
+
**Environment variable:**
|
|
237
|
+
```bash
|
|
238
|
+
IGNORE_STATUS_CODES=404,401 k6-reporter generate --run-id 123
|
|
239
|
+
```
|
|
240
|
+
|
|
241
|
+
**Config file:**
|
|
242
|
+
```json
|
|
243
|
+
{
|
|
244
|
+
"ignoredStatusCodes": [404, 401]
|
|
245
|
+
}
|
|
246
|
+
```
|
|
247
|
+
|
|
248
|
+
CLI flag takes precedence over config file. Config file takes precedence over the environment variable only when the env var is absent.
|
|
249
|
+
|
|
218
250
|
## Configuration Loading Priority
|
|
219
251
|
|
|
220
252
|
For each configuration value, the system checks in this order:
|
|
@@ -222,6 +254,7 @@ For each configuration value, the system checks in this order:
|
|
|
222
254
|
1. **Environment variables** (highest priority)
|
|
223
255
|
- `INFLUX_URL`, `INFLUX_TOKEN`, `INFLUX_ORG`, `INFLUX_BUCKET`
|
|
224
256
|
- `SLACK_TOKEN`, `SLACK_CHANNEL`
|
|
257
|
+
- `IGNORE_STATUS_CODES` (comma-separated, e.g. `404,401`)
|
|
225
258
|
|
|
226
259
|
2. **Config file values**
|
|
227
260
|
- `.config.json` or custom path via `-c` option
|
package/dist/config.d.ts
CHANGED
|
@@ -1,10 +1,14 @@
|
|
|
1
|
-
export type DataSourceType = "influxdb" | "prometheus";
|
|
1
|
+
export type DataSourceType = "influxdb" | "prometheus" | "victoriametrics";
|
|
2
2
|
export interface InfluxConfig {
|
|
3
3
|
url: string;
|
|
4
4
|
token: string;
|
|
5
5
|
org: string;
|
|
6
6
|
bucket: string;
|
|
7
7
|
}
|
|
8
|
+
export interface VictoriaMetricsConfig {
|
|
9
|
+
url: string;
|
|
10
|
+
token?: string;
|
|
11
|
+
}
|
|
8
12
|
export interface SlackConfig {
|
|
9
13
|
token: string;
|
|
10
14
|
channel: string;
|
|
@@ -16,6 +20,7 @@ export declare class Config {
|
|
|
16
20
|
private static instance;
|
|
17
21
|
private dataSourceType;
|
|
18
22
|
private rawInflux;
|
|
23
|
+
private rawVictoriaMetrics;
|
|
19
24
|
private slackConfig;
|
|
20
25
|
private cacheConfig;
|
|
21
26
|
private configPath;
|
|
@@ -24,6 +29,7 @@ export declare class Config {
|
|
|
24
29
|
private loadRawConfig;
|
|
25
30
|
private parseDataSourceType;
|
|
26
31
|
getInfluxConfig(): InfluxConfig;
|
|
32
|
+
getVictoriaMetricsConfig(): VictoriaMetricsConfig;
|
|
27
33
|
private parseSlackConfig;
|
|
28
34
|
private parseCacheConfig;
|
|
29
35
|
private parseIgnoredStatusCodes;
|
package/dist/config.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,cAAc,GAAG,UAAU,GAAG,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,cAAc,GAAG,UAAU,GAAG,YAAY,GAAG,iBAAiB,CAAC;AAE3E,MAAM,WAAW,YAAY;IAC3B,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,qBAAqB;IACpC,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,MAAM,CAAC;CACb;AAWD,qBAAa,MAAM;IACjB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAS;IAChC,OAAO,CAAC,cAAc,CAAiB;IACvC,OAAO,CAAC,SAAS,CAAsC;IACvD,OAAO,CAAC,kBAAkB,CAAsC;IAChE,OAAO,CAAC,WAAW,CAA4B;IAC/C,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,kBAAkB,CAAW;IAErC,OAAO;IAWP,OAAO,CAAC,aAAa;IAerB,OAAO,CAAC,mBAAmB;IAS3B,eAAe,IAAI,YAAY;IAgB/B,wBAAwB,IAAI,qBAAqB;IAkBjD,OAAO,CAAC,gBAAgB;IAiBxB,OAAO,CAAC,gBAAgB;IAaxB,OAAO,CAAC,uBAAuB;IAW/B,OAAO,CAAC,YAAY;IAWpB,qBAAqB,IAAI,MAAM,EAAE;IAIjC,MAAM,CAAC,WAAW,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM;IAO/C,iBAAiB,IAAI,cAAc;IAInC,cAAc,IAAI,WAAW,GAAG,IAAI;IAIpC,cAAc,IAAI,WAAW;CAG9B"}
|
package/dist/config.js
CHANGED
|
@@ -13,6 +13,7 @@ class Config {
|
|
|
13
13
|
const rawConfig = this.loadRawConfig();
|
|
14
14
|
this.dataSourceType = this.parseDataSourceType(rawConfig.dataSource);
|
|
15
15
|
this.rawInflux = rawConfig.influx;
|
|
16
|
+
this.rawVictoriaMetrics = rawConfig.victoriametrics;
|
|
16
17
|
this.slackConfig = this.parseSlackConfig(rawConfig.slack);
|
|
17
18
|
this.cacheConfig = this.parseCacheConfig(rawConfig.cache);
|
|
18
19
|
this.ignoredStatusCodes = this.parseIgnoredStatusCodes(rawConfig.ignoredStatusCodes);
|
|
@@ -33,8 +34,8 @@ class Config {
|
|
|
33
34
|
parseDataSourceType(raw) {
|
|
34
35
|
const envValue = process.env["DATASOURCE"];
|
|
35
36
|
const value = envValue || raw || "influxdb";
|
|
36
|
-
if (value !== "influxdb" && value !== "prometheus") {
|
|
37
|
-
throw new Error(`Unknown datasource type: '${value}'. Supported: influxdb, prometheus`);
|
|
37
|
+
if (value !== "influxdb" && value !== "prometheus" && value !== "victoriametrics") {
|
|
38
|
+
throw new Error(`Unknown datasource type: '${value}'. Supported: influxdb, prometheus, victoriametrics`);
|
|
38
39
|
}
|
|
39
40
|
return value;
|
|
40
41
|
}
|
|
@@ -49,6 +50,15 @@ class Config {
|
|
|
49
50
|
}
|
|
50
51
|
return { url, token, org, bucket };
|
|
51
52
|
}
|
|
53
|
+
getVictoriaMetricsConfig() {
|
|
54
|
+
const url = this.resolveValue(this.rawVictoriaMetrics?.url, "VM_URL");
|
|
55
|
+
if (!url) {
|
|
56
|
+
throw new Error("VictoriaMetrics configuration is incomplete. " +
|
|
57
|
+
"Set VM_URL via environment variable or config file.");
|
|
58
|
+
}
|
|
59
|
+
const token = this.resolveValue(this.rawVictoriaMetrics?.token, "VM_TOKEN");
|
|
60
|
+
return { url, token: token ?? undefined };
|
|
61
|
+
}
|
|
52
62
|
parseSlackConfig(rawConfig) {
|
|
53
63
|
const token = this.resolveValue(rawConfig?.token, "SLACK_TOKEN");
|
|
54
64
|
if (!token) {
|
package/dist/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":";;;;;;AAAA,4CAAoB;AACpB,gDAAwB;
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"data-collector.d.ts","sourceRoot":"","sources":["../src/data-collector.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"data-collector.d.ts","sourceRoot":"","sources":["../src/data-collector.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAK3C,OAAO,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAE3C,qBAAa,aAAa;IACxB,OAAO,CAAC,UAAU,CAAa;IAC/B,OAAO,CAAC,MAAM,CAAgB;IAC9B,OAAO,CAAC,KAAK,CAAe;gBAEhB,UAAU,EAAE,UAAU,EAAE,QAAQ,CAAC,EAAE,MAAM;IAKrD,OAAO,CAAC,aAAa;IAQf,OAAO,CACX,KAAK,EAAE,MAAM,EACb,SAAS,GAAE,MAAc,EACzB,OAAO,GAAE,MAAgB,EACzB,IAAI,GAAE,OAAY,EAClB,kBAAkB,GAAE,MAAM,EAAO,GAChC,OAAO,CAAC,gBAAgB,CAAC;CA+F7B"}
|
package/dist/data-collector.js
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.DataCollector = void 0;
|
|
4
|
-
const metrics_1 = require("./metrics");
|
|
5
4
|
const loader_1 = require("./loader");
|
|
6
5
|
const cache_1 = require("./cache");
|
|
7
6
|
const logger_1 = require("./logger");
|
|
@@ -30,13 +29,10 @@ class DataCollector {
|
|
|
30
29
|
}
|
|
31
30
|
logger_1.logger.debug("DataCollector.collect: cache miss, fetching from datasource");
|
|
32
31
|
}
|
|
33
|
-
// Phase 1: Parallel bulk fetch — all independent queries at once
|
|
34
32
|
this.loader.start("Fetching all data in parallel...");
|
|
35
33
|
const fetchStart = Date.now();
|
|
36
|
-
logger_1.logger.info("DataCollector.collect: starting parallel data fetch
|
|
37
|
-
const [
|
|
38
|
-
this.dataSource.fetchHttpReqsData(runId, startTime, endTime),
|
|
39
|
-
this.dataSource.fetchHttpReqDurationData(runId, startTime, endTime),
|
|
34
|
+
logger_1.logger.info("DataCollector.collect: starting parallel data fetch");
|
|
35
|
+
const [duration, vus, vusMax, iterations, checks, iterationDuration, errorResponsesText, httpReqs, httpReqFailed, httpReqDuration, httpReqDurationSuccess, errorResponses, errorRequests, requests, rpsAggregated,] = await Promise.all([
|
|
40
36
|
this.dataSource.calculateTestDuration(runId, startTime, endTime),
|
|
41
37
|
this.dataSource.extractVus(runId, startTime, endTime),
|
|
42
38
|
this.dataSource.extractVusMax(runId, startTime, endTime),
|
|
@@ -44,29 +40,22 @@ class DataCollector {
|
|
|
44
40
|
this.dataSource.extractChecks(runId, startTime, endTime),
|
|
45
41
|
this.dataSource.extractIterationDuration(runId, startTime, endTime),
|
|
46
42
|
this.dataSource.extractErrorResponsesText(runId, startTime, endTime),
|
|
43
|
+
this.dataSource.extractHttpReqs(runId, startTime, endTime, ignoredStatusCodes),
|
|
44
|
+
this.dataSource.extractHttpReqFailed(runId, startTime, endTime, ignoredStatusCodes),
|
|
45
|
+
this.dataSource.extractHttpReqDuration(runId, startTime, endTime),
|
|
46
|
+
this.dataSource.extractHttpReqDurationSuccess(runId, startTime, endTime),
|
|
47
|
+
this.dataSource.extractErrorResponses(runId, startTime, endTime, ignoredStatusCodes),
|
|
48
|
+
this.dataSource.extractErrorRequests(runId, startTime, endTime, ignoredStatusCodes),
|
|
49
|
+
this.dataSource.extractRequests(runId, startTime, endTime),
|
|
50
|
+
this.dataSource.extractRpsAggregated(runId, startTime, endTime),
|
|
47
51
|
]);
|
|
48
52
|
const fetchElapsed = Date.now() - fetchStart;
|
|
49
53
|
logger_1.logger.info(`DataCollector.collect: parallel fetch completed in ${fetchElapsed}ms`);
|
|
50
|
-
logger_1.logger.debug(`DataCollector.collect: fetched rows — httpReqs=${httpReqsData.length}, httpReqDuration=${httpReqDurationData.length}, ` +
|
|
51
|
-
`errorResponsesText=${errorResponsesText.responses.length}`);
|
|
52
54
|
this.loader.success(`Data fetching finished in ${this.formatElapsed(fetchElapsed)}`);
|
|
53
|
-
//
|
|
54
|
-
|
|
55
|
-
logger_1.logger.info("DataCollector.collect: computing derived metrics");
|
|
56
|
-
// Update iterations with duration info
|
|
57
|
-
if (iterations.total > 0 && duration.durationSeconds > 0) {
|
|
55
|
+
// Update iterations rate using authoritative duration if not already set
|
|
56
|
+
if (iterations.total > 0 && duration.durationSeconds > 0 && iterations.rate === 0) {
|
|
58
57
|
iterations.rate = iterations.total / duration.durationSeconds;
|
|
59
58
|
}
|
|
60
|
-
const httpReqs = (0, metrics_1.extractHttpReqsFromData)(httpReqsData, duration);
|
|
61
|
-
const httpReqFailed = (0, metrics_1.extractHttpReqFailedFromData)(httpReqsData, ignoredStatusCodes);
|
|
62
|
-
const httpReqDuration = (0, metrics_1.extractHttpReqDurationFromData)(httpReqDurationData);
|
|
63
|
-
const httpReqDurationSuccess = (0, metrics_1.extractHttpReqDurationSuccessFromData)(httpReqDurationData);
|
|
64
|
-
const errorResponses = (0, metrics_1.extractErrorResponsesFromData)(httpReqsData, duration, ignoredStatusCodes);
|
|
65
|
-
const errorRequests = (0, metrics_1.extractErrorRequestsFromData)(httpReqsData, httpReqDurationData, ignoredStatusCodes);
|
|
66
|
-
const requests = (0, metrics_1.extractRequestsFromData)(httpReqsData, httpReqDurationData);
|
|
67
|
-
const rpsAggregated = (0, metrics_1.extractRpsAggregatedFromData)(httpReqsData);
|
|
68
|
-
logger_1.logger.info("DataCollector.collect: all metrics computed");
|
|
69
|
-
this.loader.success("Computed all metrics");
|
|
70
59
|
const reportData = {
|
|
71
60
|
...(typeof data === "object" && data !== null ? data : {}),
|
|
72
61
|
httpReqs,
|
|
@@ -91,6 +80,7 @@ class DataCollector {
|
|
|
91
80
|
endTime: duration.endTime || endTime,
|
|
92
81
|
timestamp: new Date().toISOString(),
|
|
93
82
|
data: reportData,
|
|
83
|
+
...(ignoredStatusCodes.length > 0 ? { ignoredStatusCodes } : {}),
|
|
94
84
|
};
|
|
95
85
|
if (this.cache) {
|
|
96
86
|
this.cache.set(runId, startTime, endTime, result);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"data-collector.js","sourceRoot":"","sources":["../src/data-collector.ts"],"names":[],"mappings":";;;AAEA,
|
|
1
|
+
{"version":3,"file":"data-collector.js","sourceRoot":"","sources":["../src/data-collector.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,5 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { DurationMetric, VusMetric, VusMaxMetric, IterationsMetric, ChecksMetric, IterationDurationMetric, ErrorResponsesTextMetric, HttpReqsMetric, HttpReqFailedMetric, HttpReqDurationMetric, HttpReqDurationSuccessMetric, ErrorResponsesMetric, ErrorRequestsMetric, RequestsMetric, RpsAggregatedMetric } from "../types";
|
|
2
2
|
export interface DataSource {
|
|
3
|
-
fetchHttpReqsData(runId: string, startTime: string, endTime: string): Promise<HttpReqsRow[]>;
|
|
4
|
-
fetchHttpReqDurationData(runId: string, startTime: string, endTime: string): Promise<HttpReqDurationRow[]>;
|
|
5
3
|
calculateTestDuration(runId: string, startTime: string, endTime: string): Promise<DurationMetric>;
|
|
6
4
|
extractVus(runId: string, startTime: string, endTime: string): Promise<VusMetric>;
|
|
7
5
|
extractVusMax(runId: string, startTime: string, endTime: string): Promise<VusMaxMetric>;
|
|
@@ -9,5 +7,13 @@ export interface DataSource {
|
|
|
9
7
|
extractChecks(runId: string, startTime: string, endTime: string): Promise<ChecksMetric>;
|
|
10
8
|
extractIterationDuration(runId: string, startTime: string, endTime: string): Promise<IterationDurationMetric>;
|
|
11
9
|
extractErrorResponsesText(runId: string, startTime: string, endTime: string): Promise<ErrorResponsesTextMetric>;
|
|
10
|
+
extractHttpReqs(runId: string, startTime: string, endTime: string, ignoredStatusCodes: number[]): Promise<HttpReqsMetric>;
|
|
11
|
+
extractHttpReqFailed(runId: string, startTime: string, endTime: string, ignoredStatusCodes: number[]): Promise<HttpReqFailedMetric>;
|
|
12
|
+
extractHttpReqDuration(runId: string, startTime: string, endTime: string): Promise<HttpReqDurationMetric>;
|
|
13
|
+
extractHttpReqDurationSuccess(runId: string, startTime: string, endTime: string): Promise<HttpReqDurationSuccessMetric>;
|
|
14
|
+
extractErrorResponses(runId: string, startTime: string, endTime: string, ignoredStatusCodes: number[]): Promise<ErrorResponsesMetric>;
|
|
15
|
+
extractErrorRequests(runId: string, startTime: string, endTime: string, ignoredStatusCodes: number[]): Promise<ErrorRequestsMetric>;
|
|
16
|
+
extractRequests(runId: string, startTime: string, endTime: string): Promise<RequestsMetric>;
|
|
17
|
+
extractRpsAggregated(runId: string, startTime: string, endTime: string): Promise<RpsAggregatedMetric>;
|
|
12
18
|
}
|
|
13
19
|
//# sourceMappingURL=datasource.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"datasource.d.ts","sourceRoot":"","sources":["../../src/datasources/datasource.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,
|
|
1
|
+
{"version":3,"file":"datasource.d.ts","sourceRoot":"","sources":["../../src/datasources/datasource.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,EACd,SAAS,EACT,YAAY,EACZ,gBAAgB,EAChB,YAAY,EACZ,uBAAuB,EACvB,wBAAwB,EACxB,cAAc,EACd,mBAAmB,EACnB,qBAAqB,EACrB,4BAA4B,EAC5B,oBAAoB,EACpB,mBAAmB,EACnB,cAAc,EACd,mBAAmB,EACpB,MAAM,UAAU,CAAC;AAElB,MAAM,WAAW,UAAU;IACzB,qBAAqB,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC;IAClG,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;IAClF,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;IACxF,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC;IAChG,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;IACxF,wBAAwB,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,uBAAuB,CAAC,CAAC;IAC9G,yBAAyB,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,wBAAwB,CAAC,CAAC;IAChH,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,kBAAkB,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC;IAC1H,oBAAoB,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,kBAAkB,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAAC;IACpI,sBAAsB,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,qBAAqB,CAAC,CAAC;IAC1G,6BAA6B,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,4BAA4B,CAAC,CAAC;IACxH,qBAAqB,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,kBAAkB,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAAC;IACtI,oBAAoB,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,kBAAkB,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAAC;IACpI,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC;IAC5F,oBAAoB,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAAC;CACvG"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"factory.d.ts","sourceRoot":"","sources":["../../src/datasources/factory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"factory.d.ts","sourceRoot":"","sources":["../../src/datasources/factory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAG1C,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAGnD,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,GAAG,UAAU,CAgBjF"}
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.createDataSource = createDataSource;
|
|
4
4
|
const influx_1 = require("./influx");
|
|
5
|
+
const victoriametrics_1 = require("./victoriametrics");
|
|
5
6
|
const logger_1 = require("../logger");
|
|
6
7
|
function createDataSource(type, config) {
|
|
7
8
|
logger_1.logger.info(`createDataSource: type=${type}`);
|
|
@@ -10,6 +11,10 @@ function createDataSource(type, config) {
|
|
|
10
11
|
const influxConfig = config.getInfluxConfig();
|
|
11
12
|
return new influx_1.InfluxDataSource(influxConfig);
|
|
12
13
|
}
|
|
14
|
+
case "victoriametrics": {
|
|
15
|
+
const vmConfig = config.getVictoriaMetricsConfig();
|
|
16
|
+
return new victoriametrics_1.VictoriaMetricsDataSource(vmConfig);
|
|
17
|
+
}
|
|
13
18
|
case "prometheus":
|
|
14
19
|
throw new Error("Prometheus datasource is not yet implemented");
|
|
15
20
|
default:
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"factory.js","sourceRoot":"","sources":["../../src/datasources/factory.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"factory.js","sourceRoot":"","sources":["../../src/datasources/factory.ts"],"names":[],"mappings":";;AAMA,4CAgBC;AArBD,qCAA4C;AAC5C,uDAA8D;AAE9D,sCAAmC;AAEnC,SAAgB,gBAAgB,CAAC,IAAoB,EAAE,MAAc;IACnE,eAAM,CAAC,IAAI,CAAC,0BAA0B,IAAI,EAAE,CAAC,CAAC;IAC9C,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,UAAU,CAAC,CAAC,CAAC;YAChB,MAAM,YAAY,GAAG,MAAM,CAAC,eAAe,EAAE,CAAC;YAC9C,OAAO,IAAI,yBAAgB,CAAC,YAAY,CAAC,CAAC;QAC5C,CAAC;QACD,KAAK,iBAAiB,CAAC,CAAC,CAAC;YACvB,MAAM,QAAQ,GAAG,MAAM,CAAC,wBAAwB,EAAE,CAAC;YACnD,OAAO,IAAI,2CAAyB,CAAC,QAAQ,CAAC,CAAC;QACjD,CAAC;QACD,KAAK,YAAY;YACf,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAC;QAClE;YACE,MAAM,IAAI,KAAK,CAAC,4BAA4B,IAAI,EAAE,CAAC,CAAC;IACxD,CAAC;AACH,CAAC"}
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import { InfluxConfig } from "../../config";
|
|
2
2
|
import { DataSource } from "../datasource";
|
|
3
|
-
import {
|
|
3
|
+
import { DurationMetric, VusMetric, VusMaxMetric, IterationsMetric, ChecksMetric, IterationDurationMetric, ErrorResponsesTextMetric, HttpReqsMetric, HttpReqFailedMetric, HttpReqDurationMetric, HttpReqDurationSuccessMetric, ErrorResponsesMetric, ErrorRequestsMetric, RequestsMetric, RpsAggregatedMetric } from "../../types";
|
|
4
4
|
export declare class InfluxDataSource implements DataSource {
|
|
5
5
|
private client;
|
|
6
6
|
private config;
|
|
7
7
|
constructor(config: InfluxConfig);
|
|
8
|
-
fetchHttpReqsData
|
|
9
|
-
fetchHttpReqDurationData
|
|
8
|
+
private fetchHttpReqsData;
|
|
9
|
+
private fetchHttpReqDurationData;
|
|
10
10
|
calculateTestDuration(runId: string, startTime: string, endTime: string): Promise<DurationMetric>;
|
|
11
11
|
extractVus(runId: string, startTime: string, endTime: string): Promise<VusMetric>;
|
|
12
12
|
extractVusMax(runId: string, startTime: string, endTime: string): Promise<VusMaxMetric>;
|
|
@@ -14,5 +14,13 @@ export declare class InfluxDataSource implements DataSource {
|
|
|
14
14
|
extractChecks(runId: string, startTime: string, endTime: string): Promise<ChecksMetric>;
|
|
15
15
|
extractIterationDuration(runId: string, startTime: string, endTime: string): Promise<IterationDurationMetric>;
|
|
16
16
|
extractErrorResponsesText(runId: string, startTime: string, endTime: string): Promise<ErrorResponsesTextMetric>;
|
|
17
|
+
extractHttpReqs(runId: string, startTime: string, endTime: string, ignoredStatusCodes: number[]): Promise<HttpReqsMetric>;
|
|
18
|
+
extractHttpReqFailed(runId: string, startTime: string, endTime: string, ignoredStatusCodes: number[]): Promise<HttpReqFailedMetric>;
|
|
19
|
+
extractHttpReqDuration(runId: string, startTime: string, endTime: string): Promise<HttpReqDurationMetric>;
|
|
20
|
+
extractHttpReqDurationSuccess(runId: string, startTime: string, endTime: string): Promise<HttpReqDurationSuccessMetric>;
|
|
21
|
+
extractErrorResponses(runId: string, startTime: string, endTime: string, ignoredStatusCodes: number[]): Promise<ErrorResponsesMetric>;
|
|
22
|
+
extractErrorRequests(runId: string, startTime: string, endTime: string, ignoredStatusCodes: number[]): Promise<ErrorRequestsMetric>;
|
|
23
|
+
extractRequests(runId: string, startTime: string, endTime: string): Promise<RequestsMetric>;
|
|
24
|
+
extractRpsAggregated(runId: string, startTime: string, endTime: string): Promise<RpsAggregatedMetric>;
|
|
17
25
|
}
|
|
18
26
|
//# sourceMappingURL=influx-datasource.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"influx-datasource.d.ts","sourceRoot":"","sources":["../../../src/datasources/influx/influx-datasource.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"influx-datasource.d.ts","sourceRoot":"","sources":["../../../src/datasources/influx/influx-datasource.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAa5C,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,EAGL,cAAc,EACd,SAAS,EACT,YAAY,EACZ,gBAAgB,EAChB,YAAY,EACZ,uBAAuB,EACvB,wBAAwB,EAExB,cAAc,EACd,mBAAmB,EACnB,qBAAqB,EACrB,4BAA4B,EAC5B,oBAAoB,EACpB,mBAAmB,EACnB,cAAc,EACd,mBAAmB,EACpB,MAAM,aAAa,CAAC;AAErB,qBAAa,gBAAiB,YAAW,UAAU;IACjD,OAAO,CAAC,MAAM,CAAe;IAC7B,OAAO,CAAC,MAAM,CAAe;gBAEjB,MAAM,EAAE,YAAY;YAKlB,iBAAiB;YAwBjB,wBAAwB;IAuBhC,qBAAqB,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IAgDjG,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC;IA0BjF,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IAyBvF,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAqC/F,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IA2BvF,wBAAwB,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,uBAAuB,CAAC;IAmC7G,yBAAyB,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,wBAAwB,CAAC;IAuC/G,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,kBAAkB,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,cAAc,CAAC;IAQzH,oBAAoB,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,kBAAkB,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAKnI,sBAAsB,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,qBAAqB,CAAC;IAKzG,6BAA6B,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,4BAA4B,CAAC;IAKvH,qBAAqB,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,kBAAkB,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,oBAAoB,CAAC;IAQrI,oBAAoB,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,kBAAkB,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAQnI,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IAQ3F,oBAAoB,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,CAAC;CAI5G"}
|
|
@@ -85,11 +85,7 @@ class InfluxDataSource {
|
|
|
85
85
|
const endTimeMs = new Date(lastTime).getTime();
|
|
86
86
|
const durationSeconds = (endTimeMs - startTimeMs) / 1000;
|
|
87
87
|
logger_1.logger.info(`calculateTestDuration: ${durationSeconds.toFixed(1)}s (${firstTime} -> ${lastTime})`);
|
|
88
|
-
return {
|
|
89
|
-
startTime: firstTime,
|
|
90
|
-
endTime: lastTime,
|
|
91
|
-
durationSeconds,
|
|
92
|
-
};
|
|
88
|
+
return { startTime: firstTime, endTime: lastTime, durationSeconds };
|
|
93
89
|
}
|
|
94
90
|
async extractVus(runId, startTime, endTime) {
|
|
95
91
|
logger_1.logger.debug(`extractVus: runId=${runId}, range=[${startTime}, ${endTime}]`);
|
|
@@ -152,9 +148,9 @@ class InfluxDataSource {
|
|
|
152
148
|
return { total, rate: 0 };
|
|
153
149
|
}
|
|
154
150
|
timeValues.sort();
|
|
155
|
-
const
|
|
156
|
-
const
|
|
157
|
-
const durationSeconds = (
|
|
151
|
+
const startMs = new Date(timeValues[0]).getTime();
|
|
152
|
+
const endMs = new Date(timeValues[timeValues.length - 1]).getTime();
|
|
153
|
+
const durationSeconds = (endMs - startMs) / 1000;
|
|
158
154
|
const rate = durationSeconds > 0 ? total / durationSeconds : 0;
|
|
159
155
|
logger_1.logger.info(`extractIterations: total=${total}, rate=${rate.toFixed(2)} iter/s`);
|
|
160
156
|
return { total, rate };
|
|
@@ -237,11 +233,54 @@ class InfluxDataSource {
|
|
|
237
233
|
groupedErrors.set(key, { url, method, status, error, count: 1 });
|
|
238
234
|
}
|
|
239
235
|
});
|
|
240
|
-
const responses = Array.from(groupedErrors.values())
|
|
241
|
-
.sort((a, b) => b.count - a.count);
|
|
236
|
+
const responses = Array.from(groupedErrors.values()).sort((a, b) => b.count - a.count);
|
|
242
237
|
logger_1.logger.info(`extractErrorResponsesText: ${results.length} rows grouped into ${responses.length} unique errors`);
|
|
243
238
|
return { responses };
|
|
244
239
|
}
|
|
240
|
+
async extractHttpReqs(runId, startTime, endTime, ignoredStatusCodes) {
|
|
241
|
+
const [data, duration] = await Promise.all([
|
|
242
|
+
this.fetchHttpReqsData(runId, startTime, endTime),
|
|
243
|
+
this.calculateTestDuration(runId, startTime, endTime),
|
|
244
|
+
]);
|
|
245
|
+
return (0, metrics_1.extractHttpReqsFromData)(data, duration);
|
|
246
|
+
}
|
|
247
|
+
async extractHttpReqFailed(runId, startTime, endTime, ignoredStatusCodes) {
|
|
248
|
+
const data = await this.fetchHttpReqsData(runId, startTime, endTime);
|
|
249
|
+
return (0, metrics_1.extractHttpReqFailedFromData)(data, ignoredStatusCodes);
|
|
250
|
+
}
|
|
251
|
+
async extractHttpReqDuration(runId, startTime, endTime) {
|
|
252
|
+
const data = await this.fetchHttpReqDurationData(runId, startTime, endTime);
|
|
253
|
+
return (0, metrics_1.extractHttpReqDurationFromData)(data);
|
|
254
|
+
}
|
|
255
|
+
async extractHttpReqDurationSuccess(runId, startTime, endTime) {
|
|
256
|
+
const data = await this.fetchHttpReqDurationData(runId, startTime, endTime);
|
|
257
|
+
return (0, metrics_1.extractHttpReqDurationSuccessFromData)(data);
|
|
258
|
+
}
|
|
259
|
+
async extractErrorResponses(runId, startTime, endTime, ignoredStatusCodes) {
|
|
260
|
+
const [data, duration] = await Promise.all([
|
|
261
|
+
this.fetchHttpReqsData(runId, startTime, endTime),
|
|
262
|
+
this.calculateTestDuration(runId, startTime, endTime),
|
|
263
|
+
]);
|
|
264
|
+
return (0, metrics_1.extractErrorResponsesFromData)(data, duration, ignoredStatusCodes);
|
|
265
|
+
}
|
|
266
|
+
async extractErrorRequests(runId, startTime, endTime, ignoredStatusCodes) {
|
|
267
|
+
const [httpReqsData, httpReqDurationData] = await Promise.all([
|
|
268
|
+
this.fetchHttpReqsData(runId, startTime, endTime),
|
|
269
|
+
this.fetchHttpReqDurationData(runId, startTime, endTime),
|
|
270
|
+
]);
|
|
271
|
+
return (0, metrics_1.extractErrorRequestsFromData)(httpReqsData, httpReqDurationData, ignoredStatusCodes);
|
|
272
|
+
}
|
|
273
|
+
async extractRequests(runId, startTime, endTime) {
|
|
274
|
+
const [httpReqsData, httpReqDurationData] = await Promise.all([
|
|
275
|
+
this.fetchHttpReqsData(runId, startTime, endTime),
|
|
276
|
+
this.fetchHttpReqDurationData(runId, startTime, endTime),
|
|
277
|
+
]);
|
|
278
|
+
return (0, metrics_1.extractRequestsFromData)(httpReqsData, httpReqDurationData);
|
|
279
|
+
}
|
|
280
|
+
async extractRpsAggregated(runId, startTime, endTime) {
|
|
281
|
+
const data = await this.fetchHttpReqsData(runId, startTime, endTime);
|
|
282
|
+
return (0, metrics_1.extractRpsAggregatedFromData)(data);
|
|
283
|
+
}
|
|
245
284
|
}
|
|
246
285
|
exports.InfluxDataSource = InfluxDataSource;
|
|
247
286
|
//# sourceMappingURL=influx-datasource.js.map
|