k6-perf-reporter 1.0.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.
Files changed (113) hide show
  1. package/.claude/settings.local.json +54 -0
  2. package/.config.example.json +8 -0
  3. package/.config.json +8 -0
  4. package/.eslintrc.json +18 -0
  5. package/.github/workflows/build.yml +30 -0
  6. package/.github/workflows/release.yml +44 -0
  7. package/README.md +449 -0
  8. package/dist/cli-reporter.d.ts +5 -0
  9. package/dist/cli-reporter.d.ts.map +1 -0
  10. package/dist/cli-reporter.js +71 -0
  11. package/dist/cli-reporter.js.map +1 -0
  12. package/dist/cli.d.ts +2 -0
  13. package/dist/cli.d.ts.map +1 -0
  14. package/dist/cli.js +43 -0
  15. package/dist/cli.js.map +1 -0
  16. package/dist/config.d.ts +14 -0
  17. package/dist/config.d.ts.map +1 -0
  18. package/dist/config.js +26 -0
  19. package/dist/config.js.map +1 -0
  20. package/dist/data-collector.d.ts +14 -0
  21. package/dist/data-collector.d.ts.map +1 -0
  22. package/dist/data-collector.js +51 -0
  23. package/dist/data-collector.js.map +1 -0
  24. package/dist/data-extractor.d.ts +31 -0
  25. package/dist/data-extractor.d.ts.map +1 -0
  26. package/dist/data-extractor.js +250 -0
  27. package/dist/data-extractor.js.map +1 -0
  28. package/dist/explore.d.ts +2 -0
  29. package/dist/explore.d.ts.map +1 -0
  30. package/dist/explore.js +27 -0
  31. package/dist/explore.js.map +1 -0
  32. package/dist/index.d.ts +7 -0
  33. package/dist/index.d.ts.map +1 -0
  34. package/dist/index.js +43 -0
  35. package/dist/index.js.map +1 -0
  36. package/dist/influx-client.d.ts +16 -0
  37. package/dist/influx-client.d.ts.map +1 -0
  38. package/dist/influx-client.interface.d.ts +21 -0
  39. package/dist/influx-client.interface.d.ts.map +1 -0
  40. package/dist/influx-client.interface.js +3 -0
  41. package/dist/influx-client.interface.js.map +1 -0
  42. package/dist/influx-client.js +35 -0
  43. package/dist/influx-client.js.map +1 -0
  44. package/dist/influx-data-extractor.d.ts +112 -0
  45. package/dist/influx-data-extractor.d.ts.map +1 -0
  46. package/dist/influx-data-extractor.interface.d.ts +21 -0
  47. package/dist/influx-data-extractor.interface.d.ts.map +1 -0
  48. package/dist/influx-data-extractor.interface.js +3 -0
  49. package/dist/influx-data-extractor.interface.js.map +1 -0
  50. package/dist/influx-data-extractor.js +445 -0
  51. package/dist/influx-data-extractor.js.map +1 -0
  52. package/dist/influx.d.ts +122 -0
  53. package/dist/influx.d.ts.map +1 -0
  54. package/dist/influx.js +899 -0
  55. package/dist/influx.js.map +1 -0
  56. package/dist/logger.d.ts +7 -0
  57. package/dist/logger.d.ts.map +1 -0
  58. package/dist/logger.js +12 -0
  59. package/dist/logger.js.map +1 -0
  60. package/dist/metrics-collector.d.ts +10 -0
  61. package/dist/metrics-collector.d.ts.map +1 -0
  62. package/dist/metrics-collector.js +99 -0
  63. package/dist/metrics-collector.js.map +1 -0
  64. package/dist/metrics-collector.test.d.ts +2 -0
  65. package/dist/metrics-collector.test.d.ts.map +1 -0
  66. package/dist/metrics-collector.test.js +235 -0
  67. package/dist/metrics-collector.test.js.map +1 -0
  68. package/dist/reporters/cli-reporter.d.ts +9 -0
  69. package/dist/reporters/cli-reporter.d.ts.map +1 -0
  70. package/dist/reporters/cli-reporter.js +141 -0
  71. package/dist/reporters/cli-reporter.js.map +1 -0
  72. package/dist/reporters/cli.d.ts +5 -0
  73. package/dist/reporters/cli.d.ts.map +1 -0
  74. package/dist/reporters/cli.js +150 -0
  75. package/dist/reporters/cli.js.map +1 -0
  76. package/dist/reporters/index.d.ts +3 -0
  77. package/dist/reporters/index.d.ts.map +1 -0
  78. package/dist/reporters/index.js +8 -0
  79. package/dist/reporters/index.js.map +1 -0
  80. package/dist/reporters/json-reporter.d.ts +5 -0
  81. package/dist/reporters/json-reporter.d.ts.map +1 -0
  82. package/dist/reporters/json-reporter.js +18 -0
  83. package/dist/reporters/json-reporter.js.map +1 -0
  84. package/dist/reporters/json.d.ts +5 -0
  85. package/dist/reporters/json.d.ts.map +1 -0
  86. package/dist/reporters/json.js +70 -0
  87. package/dist/reporters/json.js.map +1 -0
  88. package/dist/reporters/markdown.d.ts +5 -0
  89. package/dist/reporters/markdown.d.ts.map +1 -0
  90. package/dist/reporters/markdown.js +87 -0
  91. package/dist/reporters/markdown.js.map +1 -0
  92. package/dist/reports.d.ts +11 -0
  93. package/dist/reports.d.ts.map +1 -0
  94. package/dist/reports.js +325 -0
  95. package/dist/reports.js.map +1 -0
  96. package/dist/types.d.ts +113 -0
  97. package/dist/types.d.ts.map +1 -0
  98. package/dist/types.js +4 -0
  99. package/dist/types.js.map +1 -0
  100. package/dist/utils.d.ts +2 -0
  101. package/dist/utils.d.ts.map +1 -0
  102. package/dist/utils.js +19 -0
  103. package/dist/utils.js.map +1 -0
  104. package/package.json +33 -0
  105. package/src/cli.ts +47 -0
  106. package/src/config.ts +31 -0
  107. package/src/data-collector.ts +66 -0
  108. package/src/influx-client.ts +48 -0
  109. package/src/influx-data-extractor.ts +722 -0
  110. package/src/reporters/cli-reporter.ts +169 -0
  111. package/src/reporters/index.ts +2 -0
  112. package/src/reporters/json-reporter.ts +15 -0
  113. package/tsconfig.json +20 -0
@@ -0,0 +1,141 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.CliReporter = void 0;
7
+ const chalk_1 = __importDefault(require("chalk"));
8
+ const table_1 = require("table");
9
+ class CliReporter {
10
+ report(data) {
11
+ this.printHeader(data);
12
+ this.printReport(data);
13
+ }
14
+ printHeader(data) {
15
+ console.log("\n---");
16
+ console.log(`Run ID: ${data.runId}`);
17
+ console.log(`Start: ${data.startTime}`);
18
+ console.log(`End: ${data.endTime}\n`);
19
+ }
20
+ printReport(data) {
21
+ const reportData = data.data;
22
+ if (reportData.checks) {
23
+ const checks = reportData.checks;
24
+ const passRate = typeof checks.passRate === "number" ? checks.passRate : 0;
25
+ const checkmark = passRate === 100 ? "✓" : "✗";
26
+ console.log(`checks${this.padRight("checks", 30)}: ${chalk_1.default.cyan(passRate.toFixed(2) + "%")} ${checkmark} ${chalk_1.default.cyan(String(checks.passes))} ${checkmark === "✗" ? "✗ " + chalk_1.default.cyan(String(checks.fails || 0)) : ""}`);
27
+ }
28
+ if (reportData.httpReqs) {
29
+ const httpReqs = reportData.httpReqs;
30
+ console.log(`http_reqs${this.padRight("http_reqs", 30)}: ${chalk_1.default.cyan(String(httpReqs.total))} ${chalk_1.default.gray(httpReqs.rate.toFixed(6) + "/s")}`);
31
+ }
32
+ if (reportData.httpReqFailed) {
33
+ const failed = reportData.httpReqFailed;
34
+ const failureRate = typeof failed.failureRate === "number" ? failed.failureRate : 0;
35
+ const checkmark = failureRate === 0 ? "✓" : "✗";
36
+ console.log(`http_req_failed${this.padRight("http_req_failed", 30)}: ${chalk_1.default.cyan(failureRate.toFixed(2) + "%")} ${checkmark} ${chalk_1.default.cyan(String(failed.failed || 0))} ✗ ${chalk_1.default.cyan(String(failed.total || 0))}`);
37
+ }
38
+ if (reportData.errorResponses) {
39
+ const errorResponses = reportData.errorResponses;
40
+ console.log(`error_responses${this.padRight("error_responses", 30)}: ${chalk_1.default.cyan(String(errorResponses.count))} ${chalk_1.default.gray(errorResponses.rate.toFixed(6) + "/s")}`);
41
+ }
42
+ if (reportData.httpReqDuration) {
43
+ const duration = reportData.httpReqDuration;
44
+ console.log(`http_req_duration${this.padRight("http_req_duration", 30)}: avg=${chalk_1.default.cyan(this.formatDuration(duration.avg || 0))} min=${chalk_1.default.cyan(this.formatDuration(duration.min || 0))} med=${chalk_1.default.cyan(this.formatDuration((duration.min || 0) + (duration.max || 0) / 2))} max=${chalk_1.default.cyan(this.formatDuration(duration.max || 0))} p(90)=${chalk_1.default.cyan(this.formatDuration(duration.p90 || 0))} p(95)=${chalk_1.default.cyan(this.formatDuration(duration.p95 || 0))}`);
45
+ }
46
+ if (reportData.iterations) {
47
+ const iterations = reportData.iterations;
48
+ console.log(`iterations${this.padRight("iterations", 30)}: ${chalk_1.default.cyan(String(iterations.total))} ${chalk_1.default.gray(iterations.rate.toFixed(6) + "/s")}`);
49
+ }
50
+ if (reportData.iterationDuration) {
51
+ const itDuration = reportData.iterationDuration;
52
+ console.log(`iteration_duration${this.padRight("iteration_duration", 30)}: avg=${chalk_1.default.cyan(this.formatDuration(itDuration.avg || 0))} min=${chalk_1.default.cyan(this.formatDuration(itDuration.min || 0))} med=${chalk_1.default.cyan(this.formatDuration((itDuration.min || 0) + (itDuration.max || 0) / 2))} max=${chalk_1.default.cyan(this.formatDuration(itDuration.max || 0))} p(90)=${chalk_1.default.cyan(this.formatDuration(itDuration.p90 || 0))} p(95)=${chalk_1.default.cyan(this.formatDuration(itDuration.p95 || 0))}`);
53
+ }
54
+ if (reportData.vus) {
55
+ const vus = reportData.vus;
56
+ console.log(`vus${this.padRight("vus", 30)}: ${chalk_1.default.cyan(String(vus.current))} min=${chalk_1.default.cyan(String(vus.min))} max=${chalk_1.default.cyan(String(vus.max))}`);
57
+ }
58
+ if (reportData.vusMax) {
59
+ const vusMax = reportData.vusMax;
60
+ console.log(`vus_max${this.padRight("vus_max", 30)}: ${chalk_1.default.cyan(String(vusMax.max))} min=${chalk_1.default.cyan(String(vusMax.min))} max=${chalk_1.default.cyan(String(vusMax.max))}`);
61
+ }
62
+ if (reportData.topSlowUrls) {
63
+ const topSlowUrls = reportData.topSlowUrls;
64
+ const urls = topSlowUrls.urls;
65
+ if (urls && urls.length > 0) {
66
+ console.log("\nTop 10 Slowest URLs:");
67
+ console.log("");
68
+ const tableData = [
69
+ ["Method", "URL", "p(95) ms"],
70
+ ...urls.map((u) => [u.method, u.url, this.formatDuration(u.p95Duration)]),
71
+ ];
72
+ console.log((0, table_1.table)(tableData, { border: { topBody: "─", topJoin: "", topLeft: "", topRight: "", bottomBody: "", bottomJoin: "", bottomLeft: "", bottomRight: "", bodyLeft: "", bodyRight: "", bodyJoin: "", joinBody: "─", joinLeft: "", joinRight: "", joinJoin: "" }, drawHorizontalLine: (index) => index === 1, columns: { 0: { alignment: "left" }, 1: { alignment: "left" }, 2: { alignment: "left" } } }));
73
+ }
74
+ }
75
+ if (reportData.errorRequests) {
76
+ const errorRequests = reportData.errorRequests;
77
+ const errors = errorRequests.errors;
78
+ if (errors && errors.length > 0) {
79
+ console.log("\nTop Error Requests:");
80
+ console.log("");
81
+ const tableData = [
82
+ ["Method", "URL", "Code", "Count"],
83
+ ...errors.map((e) => [e.method, e.url, String(e.status), String(e.count)]),
84
+ ];
85
+ console.log((0, table_1.table)(tableData, { border: { topBody: "─", topJoin: "", topLeft: "", topRight: "", bottomBody: "", bottomJoin: "", bottomLeft: "", bottomRight: "", bodyLeft: "", bodyRight: "", bodyJoin: "", joinBody: "─", joinLeft: "", joinRight: "", joinJoin: "" }, drawHorizontalLine: (index) => index === 1, columns: { 0: { alignment: "left" }, 1: { alignment: "left" }, 2: { alignment: "left" }, 3: { alignment: "left" } } }));
86
+ }
87
+ }
88
+ if (reportData.successRequests) {
89
+ const successRequests = reportData.successRequests;
90
+ const requests = successRequests.requests;
91
+ if (requests && requests.length > 0) {
92
+ console.log("\nTop Successful Requests:");
93
+ console.log("");
94
+ const tableData = [
95
+ ["Method", "URL", "Status", "Count", "Min", "Avg", "p(95)"],
96
+ ...requests.map((r) => [r.method, r.url, String(r.status), String(r.count), this.formatDuration(r.min), this.formatDuration(r.avg), this.formatDuration(r.p95)]),
97
+ ];
98
+ console.log((0, table_1.table)(tableData, { border: { topBody: "─", topJoin: "", topLeft: "", topRight: "", bottomBody: "", bottomJoin: "", bottomLeft: "", bottomRight: "", bodyLeft: "", bodyRight: "", bodyJoin: "", joinBody: "─", joinLeft: "", joinRight: "", joinJoin: "" }, drawHorizontalLine: (index) => index === 1, columns: { 0: { alignment: "left" }, 1: { alignment: "left" }, 2: { alignment: "left" }, 3: { alignment: "left" }, 4: { alignment: "left" }, 5: { alignment: "left" }, 6: { alignment: "left" } } }));
99
+ }
100
+ }
101
+ if (reportData.errorResponsesText) {
102
+ const errorResponsesText = reportData.errorResponsesText;
103
+ const responses = errorResponsesText.responses;
104
+ if (responses && responses.length > 0) {
105
+ console.log("\nError Responses:");
106
+ console.log("");
107
+ const tableData = [
108
+ ["Method", "URL", "Status", "Error"],
109
+ ...responses.map((r) => {
110
+ const error = r.error || "";
111
+ // Extract path only from URL
112
+ let url = r.url;
113
+ try {
114
+ const urlObj = new URL(url);
115
+ url = urlObj.pathname;
116
+ }
117
+ catch {
118
+ // If not a full URL, use as-is
119
+ }
120
+ return [r.method, url, String(r.status), error];
121
+ }),
122
+ ];
123
+ console.log((0, table_1.table)(tableData, { border: { topBody: "─", topJoin: "", topLeft: "", topRight: "", bottomBody: "", bottomJoin: "", bottomLeft: "", bottomRight: "", bodyLeft: "", bodyRight: "", bodyJoin: "", joinBody: "─", joinLeft: "", joinRight: "", joinJoin: "" }, drawHorizontalLine: (index) => index === 1, columns: { 0: { alignment: "left" }, 1: { alignment: "left" }, 2: { alignment: "left" }, 3: { alignment: "left" } } }));
124
+ }
125
+ }
126
+ }
127
+ padRight(label, width) {
128
+ return ".".repeat(Math.max(0, width - label.length));
129
+ }
130
+ formatDuration(ms) {
131
+ if (ms < 1) {
132
+ return `${(ms * 1000).toFixed(2)}µs`;
133
+ }
134
+ if (ms < 1000) {
135
+ return `${ms.toFixed(2)}ms`;
136
+ }
137
+ return `${(ms / 1000).toFixed(2)}s`;
138
+ }
139
+ }
140
+ exports.CliReporter = CliReporter;
141
+ //# sourceMappingURL=cli-reporter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli-reporter.js","sourceRoot":"","sources":["../../src/reporters/cli-reporter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import { TestMetrics } from "../types";
2
+ export declare class CLIReporter {
3
+ generate(metrics: TestMetrics, testName: string): void;
4
+ }
5
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../src/reporters/cli.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAEvC,qBAAa,WAAW;IACtB,QAAQ,CAAC,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI;CAmJvD"}
@@ -0,0 +1,150 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.CLIReporter = void 0;
7
+ const chalk_1 = __importDefault(require("chalk"));
8
+ const table_1 = require("table");
9
+ class CLIReporter {
10
+ generate(metrics, testName) {
11
+ console.log("\n" + chalk_1.default.bold.cyan("━━━ k6 Performance Test Report ━━━\n"));
12
+ console.log(chalk_1.default.bold(`Test: ${testName}`));
13
+ console.log(chalk_1.default.gray(`Generated: ${new Date().toLocaleString()}\n`));
14
+ // Summary section
15
+ console.log(chalk_1.default.bold.yellow("📋 Summary"));
16
+ const summaryData = [
17
+ [chalk_1.default.bold("Pods"), metrics.podCount.toString()],
18
+ [chalk_1.default.bold("VUs"), `${metrics.vusMax} / ${metrics.vusConfiguredMax}`],
19
+ [
20
+ chalk_1.default.bold("Total Requests"),
21
+ chalk_1.default.cyan(metrics.totalRequests.toLocaleString()),
22
+ ],
23
+ [
24
+ chalk_1.default.bold("Successful"),
25
+ chalk_1.default.green(metrics.successfulRequests.toLocaleString()),
26
+ ],
27
+ [
28
+ chalk_1.default.bold("Failed"),
29
+ metrics.failedRequests > 0
30
+ ? chalk_1.default.red(metrics.failedRequests.toLocaleString())
31
+ : chalk_1.default.gray(metrics.failedRequests.toString()),
32
+ ],
33
+ [
34
+ chalk_1.default.bold("Error Rate"),
35
+ metrics.errorRate > 0
36
+ ? metrics.errorRate < 1
37
+ ? chalk_1.default.yellow(`${metrics.errorRate.toFixed(4)}%`)
38
+ : chalk_1.default.red(`${metrics.errorRate.toFixed(2)}%`)
39
+ : chalk_1.default.green(`${metrics.errorRate.toFixed(2)}%`),
40
+ ],
41
+ [
42
+ chalk_1.default.bold("Dropped Iterations"),
43
+ metrics.droppedIterations > 0
44
+ ? chalk_1.default.yellow(metrics.droppedIterations.toLocaleString())
45
+ : chalk_1.default.gray(metrics.droppedIterations.toString()),
46
+ ],
47
+ ];
48
+ console.log((0, table_1.table)(summaryData) + "\n");
49
+ // Response Times
50
+ console.log(chalk_1.default.bold.yellow("📊 Response Times"));
51
+ const responseTimes = [
52
+ ["Metric", "Value"],
53
+ ["P50", `${metrics.responseTimeP50.toFixed(2)} ms`],
54
+ ["P95", `${metrics.responseTimeP95.toFixed(2)} ms`],
55
+ ["P99", `${metrics.responseTimeP99.toFixed(2)} ms`],
56
+ ];
57
+ console.log((0, table_1.table)(responseTimes) + "\n");
58
+ // Iteration Duration
59
+ console.log(chalk_1.default.bold.yellow("⏱️ Iteration Duration"));
60
+ const iterationDuration = [
61
+ ["Metric", "Value"],
62
+ ["P50", `${metrics.iterationDurationP50.toFixed(2)} ms`],
63
+ ["P95", `${metrics.iterationDurationP95.toFixed(2)} ms`],
64
+ ["P99", `${metrics.iterationDurationP99.toFixed(2)} ms`],
65
+ ];
66
+ console.log((0, table_1.table)(iterationDuration) + "\n");
67
+ // Checks
68
+ console.log(chalk_1.default.bold.yellow("✓ Checks"));
69
+ const checksData = [
70
+ ["Metric", "Value"],
71
+ ["Total", metrics.checksTotal.toString()],
72
+ ["Succeeded", metrics.checksSucceeded.toString()],
73
+ ["Failed", metrics.checksFailed.toString()],
74
+ [
75
+ "Success Rate",
76
+ metrics.checksSuccessRate > 0
77
+ ? chalk_1.default.green(`${metrics.checksSuccessRate.toFixed(2)}%`)
78
+ : metrics.checksSuccessRate.toString(),
79
+ ],
80
+ ];
81
+ console.log((0, table_1.table)(checksData) + "\n");
82
+ // RPS by Endpoint (top 10)
83
+ if (Object.keys(metrics.rpsPerEndpoint).length > 0) {
84
+ console.log(chalk_1.default.bold.yellow("📈 RPS by Endpoint (Top 10)"));
85
+ const rpsData = [["Endpoint", "Avg (req/s)", "P95 (req/s)", "Max (req/s)"]];
86
+ Object.entries(metrics.rpsPerEndpoint)
87
+ .sort((a, b) => b[1].p95 - a[1].p95) // Sort by p95 descending
88
+ .slice(0, 10)
89
+ .forEach(([endpoint, stats]) => {
90
+ rpsData.push([
91
+ endpoint,
92
+ `${stats.avg.toFixed(2)}`,
93
+ `${stats.p95.toFixed(2)}`,
94
+ `${stats.max.toFixed(2)}`,
95
+ ]);
96
+ });
97
+ console.log((0, table_1.table)(rpsData) + "\n");
98
+ }
99
+ // Requests Summary (top 10)
100
+ if (Object.keys(metrics.requestsSummary).length > 0) {
101
+ console.log(chalk_1.default.bold.yellow("📋 Requests Summary"));
102
+ const summaryData = [["Endpoint", "Method", "Count", "Successful", "Failed", "Min (ms)", "Avg (ms)", "P95 (ms)", "P99 (ms)", "Max (ms)"]];
103
+ Object.entries(metrics.requestsSummary)
104
+ .sort((a, b) => b[1].p95ResponseTime - a[1].p95ResponseTime) // Sort by p95 descending
105
+ .forEach(([, summary]) => {
106
+ summaryData.push([
107
+ summary.url,
108
+ summary.method,
109
+ summary.count.toString(),
110
+ chalk_1.default.green(summary.successful.toString()),
111
+ summary.failed > 0 ? chalk_1.default.red(summary.failed.toString()) : chalk_1.default.gray(summary.failed.toString()),
112
+ `${summary.minResponseTime.toFixed(2)}`,
113
+ `${summary.avgResponseTime.toFixed(2)}`,
114
+ `${summary.p95ResponseTime.toFixed(2)}`,
115
+ `${summary.p99ResponseTime.toFixed(2)}`,
116
+ `${summary.maxResponseTime.toFixed(2)}`,
117
+ ]);
118
+ });
119
+ console.log((0, table_1.table)(summaryData) + "\n");
120
+ }
121
+ // Error Requests Summary
122
+ if (Object.keys(metrics.errorRequestsSummary).length > 0) {
123
+ console.log(chalk_1.default.bold.yellow("❌ Error Requests Summary"));
124
+ const summaryData = [["Endpoint", "Method", "Status", "Count", "Min (ms)", "Avg (ms)", "P95 (ms)", "P99 (ms)", "Max (ms)"]];
125
+ metrics.errorRequestsDetailedSummary.forEach((error) => {
126
+ summaryData.push([
127
+ error.url,
128
+ error.method,
129
+ String(error.status),
130
+ error.count.toString(),
131
+ `${error.minResponseTime.toFixed(2)}`,
132
+ `${error.avgResponseTime.toFixed(2)}`,
133
+ `${error.p95ResponseTime.toFixed(2)}`,
134
+ `${error.p99ResponseTime.toFixed(2)}`,
135
+ `${error.maxResponseTime.toFixed(2)}`,
136
+ ]);
137
+ });
138
+ console.log((0, table_1.table)(summaryData) + "\n");
139
+ }
140
+ // Status
141
+ const status = metrics.errorRate < 1
142
+ ? chalk_1.default.green.bold("✓ PASS")
143
+ : chalk_1.default.red.bold("✗ FAIL");
144
+ console.log(chalk_1.default.bold(`Overall Status: ${status}`));
145
+ console.log(chalk_1.default.gray(`Error Rate: ${metrics.errorRate.toFixed(4)}% (threshold: < 1%)`));
146
+ console.log(chalk_1.default.gray("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n"));
147
+ }
148
+ }
149
+ exports.CLIReporter = CLIReporter;
150
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/reporters/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export { JsonReporter } from "./json-reporter";
2
+ export { CliReporter } from "./cli-reporter";
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/reporters/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC"}
@@ -0,0 +1,8 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CliReporter = exports.JsonReporter = void 0;
4
+ var json_reporter_1 = require("./json-reporter");
5
+ Object.defineProperty(exports, "JsonReporter", { enumerable: true, get: function () { return json_reporter_1.JsonReporter; } });
6
+ var cli_reporter_1 = require("./cli-reporter");
7
+ Object.defineProperty(exports, "CliReporter", { enumerable: true, get: function () { return cli_reporter_1.CliReporter; } });
8
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/reporters/index.ts"],"names":[],"mappings":";;;AAAA,iDAA+C;AAAtC,6GAAA,YAAY,OAAA;AACrB,+CAA6C;AAApC,2GAAA,WAAW,OAAA"}
@@ -0,0 +1,5 @@
1
+ import { ReporterResponse } from "../data-collector";
2
+ export declare class JsonReporter {
3
+ report(data: ReporterResponse, outputPath?: string): void;
4
+ }
5
+ //# sourceMappingURL=json-reporter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json-reporter.d.ts","sourceRoot":"","sources":["../../src/reporters/json-reporter.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAErD,qBAAa,YAAY;IACvB,MAAM,CAAC,IAAI,EAAE,gBAAgB,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI;CAU1D"}
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.JsonReporter = void 0;
4
+ const fs_1 = require("fs");
5
+ class JsonReporter {
6
+ report(data, outputPath) {
7
+ const json = JSON.stringify(data, null, 2);
8
+ if (outputPath) {
9
+ (0, fs_1.writeFileSync)(outputPath, json);
10
+ console.log(`Report saved to ${outputPath}`);
11
+ }
12
+ else {
13
+ console.log(json);
14
+ }
15
+ }
16
+ }
17
+ exports.JsonReporter = JsonReporter;
18
+ //# sourceMappingURL=json-reporter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json-reporter.js","sourceRoot":"","sources":["../../src/reporters/json-reporter.ts"],"names":[],"mappings":";;;AAAA,2BAAmC;AAGnC,MAAa,YAAY;IACvB,MAAM,CAAC,IAAsB,EAAE,UAAmB;QAChD,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;QAE3C,IAAI,UAAU,EAAE,CAAC;YACf,IAAA,kBAAa,EAAC,UAAU,EAAE,IAAI,CAAC,CAAC;YAChC,OAAO,CAAC,GAAG,CAAC,mBAAmB,UAAU,EAAE,CAAC,CAAC;QAC/C,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACpB,CAAC;IACH,CAAC;CACF;AAXD,oCAWC"}
@@ -0,0 +1,5 @@
1
+ import { TestMetrics } from "../types";
2
+ export declare class JSONReporter {
3
+ generate(metrics: TestMetrics, testName: string): string;
4
+ }
5
+ //# sourceMappingURL=json.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json.d.ts","sourceRoot":"","sources":["../../src/reporters/json.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAEvC,qBAAa,YAAY;IACvB,QAAQ,CAAC,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM;CAiEzD"}
@@ -0,0 +1,70 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.JSONReporter = void 0;
4
+ class JSONReporter {
5
+ generate(metrics, testName) {
6
+ const status = metrics.errorRate < 1 ? "PASS" : "FAIL";
7
+ const report = {
8
+ testName,
9
+ generatedAt: new Date().toISOString(),
10
+ status,
11
+ summary: {
12
+ result: status,
13
+ errorRate: metrics.errorRate,
14
+ errorRateThreshold: 1,
15
+ passed: metrics.errorRate < 1,
16
+ totalRequests: metrics.totalRequests,
17
+ successfulRequests: metrics.successfulRequests,
18
+ failedRequests: metrics.failedRequests,
19
+ },
20
+ metrics: {
21
+ responseTime: {
22
+ p50: metrics.responseTimeP50,
23
+ p95: metrics.responseTimeP95,
24
+ p99: metrics.responseTimeP99,
25
+ },
26
+ iterationDuration: {
27
+ p50: metrics.iterationDurationP50,
28
+ p95: metrics.iterationDurationP95,
29
+ p99: metrics.iterationDurationP99,
30
+ },
31
+ requests: {
32
+ total: metrics.totalRequests,
33
+ successful: metrics.successfulRequests,
34
+ failed: metrics.failedRequests,
35
+ errorRate: metrics.errorRate,
36
+ },
37
+ concurrency: {
38
+ vusMax: metrics.vusMax,
39
+ vusConfiguredMax: metrics.vusConfiguredMax,
40
+ podCount: metrics.podCount,
41
+ droppedIterations: metrics.droppedIterations,
42
+ },
43
+ slowestRequests: metrics.slowestRequests.slice(0, 10),
44
+ errors: metrics.errors,
45
+ errorDetails: metrics.errorDetails,
46
+ errorRequestsSummary: metrics.errorRequestsSummary,
47
+ errorRequestsDetailedSummary: metrics.errorRequestsDetailedSummary,
48
+ checks: {
49
+ total: metrics.checksTotal,
50
+ succeeded: metrics.checksSucceeded,
51
+ failed: metrics.checksFailed,
52
+ successRate: metrics.checksSuccessRate,
53
+ },
54
+ httpPhases: metrics.httpPhases,
55
+ dataTransfer: {
56
+ receivedBytes: metrics.dataReceivedBytes,
57
+ sentBytes: metrics.dataSentBytes,
58
+ receivedRate: metrics.dataReceivedRate,
59
+ sentRate: metrics.dataSentRate,
60
+ },
61
+ requestsByEndpoint: metrics.requestsByEndpoint,
62
+ rpsPerEndpoint: metrics.rpsPerEndpoint,
63
+ requestsSummary: metrics.requestsSummary,
64
+ },
65
+ };
66
+ return JSON.stringify(report, null, 2);
67
+ }
68
+ }
69
+ exports.JSONReporter = JSONReporter;
70
+ //# sourceMappingURL=json.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json.js","sourceRoot":"","sources":["../../src/reporters/json.ts"],"names":[],"mappings":";;;AAEA,MAAa,YAAY;IACvB,QAAQ,CAAC,OAAoB,EAAE,QAAgB;QAC7C,MAAM,MAAM,GAAG,OAAO,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC;QAEvD,MAAM,MAAM,GAAG;YACb,QAAQ;YACR,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACrC,MAAM;YACN,OAAO,EAAE;gBACP,MAAM,EAAE,MAAM;gBACd,SAAS,EAAE,OAAO,CAAC,SAAS;gBAC5B,kBAAkB,EAAE,CAAC;gBACrB,MAAM,EAAE,OAAO,CAAC,SAAS,GAAG,CAAC;gBAC7B,aAAa,EAAE,OAAO,CAAC,aAAa;gBACpC,kBAAkB,EAAE,OAAO,CAAC,kBAAkB;gBAC9C,cAAc,EAAE,OAAO,CAAC,cAAc;aACvC;YACD,OAAO,EAAE;gBACP,YAAY,EAAE;oBACZ,GAAG,EAAE,OAAO,CAAC,eAAe;oBAC5B,GAAG,EAAE,OAAO,CAAC,eAAe;oBAC5B,GAAG,EAAE,OAAO,CAAC,eAAe;iBAC7B;gBACD,iBAAiB,EAAE;oBACjB,GAAG,EAAE,OAAO,CAAC,oBAAoB;oBACjC,GAAG,EAAE,OAAO,CAAC,oBAAoB;oBACjC,GAAG,EAAE,OAAO,CAAC,oBAAoB;iBAClC;gBACD,QAAQ,EAAE;oBACR,KAAK,EAAE,OAAO,CAAC,aAAa;oBAC5B,UAAU,EAAE,OAAO,CAAC,kBAAkB;oBACtC,MAAM,EAAE,OAAO,CAAC,cAAc;oBAC9B,SAAS,EAAE,OAAO,CAAC,SAAS;iBAC7B;gBACD,WAAW,EAAE;oBACX,MAAM,EAAE,OAAO,CAAC,MAAM;oBACtB,gBAAgB,EAAE,OAAO,CAAC,gBAAgB;oBAC1C,QAAQ,EAAE,OAAO,CAAC,QAAQ;oBAC1B,iBAAiB,EAAE,OAAO,CAAC,iBAAiB;iBAC7C;gBACD,eAAe,EAAE,OAAO,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC;gBACrD,MAAM,EAAE,OAAO,CAAC,MAAM;gBACtB,YAAY,EAAE,OAAO,CAAC,YAAY;gBAClC,oBAAoB,EAAE,OAAO,CAAC,oBAAoB;gBAClD,4BAA4B,EAAE,OAAO,CAAC,4BAA4B;gBAClE,MAAM,EAAE;oBACN,KAAK,EAAE,OAAO,CAAC,WAAW;oBAC1B,SAAS,EAAE,OAAO,CAAC,eAAe;oBAClC,MAAM,EAAE,OAAO,CAAC,YAAY;oBAC5B,WAAW,EAAE,OAAO,CAAC,iBAAiB;iBACvC;gBACD,UAAU,EAAE,OAAO,CAAC,UAAU;gBAC9B,YAAY,EAAE;oBACZ,aAAa,EAAE,OAAO,CAAC,iBAAiB;oBACxC,SAAS,EAAE,OAAO,CAAC,aAAa;oBAChC,YAAY,EAAE,OAAO,CAAC,gBAAgB;oBACtC,QAAQ,EAAE,OAAO,CAAC,YAAY;iBAC/B;gBACD,kBAAkB,EAAE,OAAO,CAAC,kBAAkB;gBAC9C,cAAc,EAAE,OAAO,CAAC,cAAc;gBACtC,eAAe,EAAE,OAAO,CAAC,eAAe;aACzC;SACF,CAAC;QAEF,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IACzC,CAAC;CACF;AAlED,oCAkEC"}
@@ -0,0 +1,5 @@
1
+ import { TestMetrics } from "../types";
2
+ export declare class MarkdownReporter {
3
+ generate(metrics: TestMetrics, testName: string): string;
4
+ }
5
+ //# sourceMappingURL=markdown.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"markdown.d.ts","sourceRoot":"","sources":["../../src/reporters/markdown.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAEvC,qBAAa,gBAAgB;IAC3B,QAAQ,CAAC,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM;CA0FzD"}
@@ -0,0 +1,87 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.MarkdownReporter = void 0;
4
+ class MarkdownReporter {
5
+ generate(metrics, testName) {
6
+ let md = "";
7
+ md += "# k6 Performance Test Report\n\n";
8
+ md += `**Test:** ${testName}\n`;
9
+ md += `**Generated:** ${new Date().toLocaleString()}\n\n`;
10
+ // Summary section
11
+ md += "## 📋 Summary\n\n";
12
+ md += "| Metric | Value |\n";
13
+ md += "| --- | --- |\n";
14
+ md += `| Pods | ${metrics.podCount} |\n`;
15
+ md += `| VUs | ${metrics.vusMax} / ${metrics.vusConfiguredMax} |\n`;
16
+ md += `| Total Requests | ${metrics.totalRequests.toLocaleString()} |\n`;
17
+ md += `| Successful | ${metrics.successfulRequests.toLocaleString()} |\n`;
18
+ md += `| Failed | ${metrics.failedRequests.toLocaleString()} |\n`;
19
+ md += `| Error Rate | ${metrics.errorRate.toFixed(4)}% |\n`;
20
+ md += `| Dropped Iterations | ${metrics.droppedIterations} |\n\n`;
21
+ // Response Times
22
+ md += "## 📊 Response Times\n\n";
23
+ md += "| Metric | Value |\n";
24
+ md += "| --- | --- |\n";
25
+ md += `| P50 | ${metrics.responseTimeP50.toFixed(2)} ms |\n`;
26
+ md += `| P95 | ${metrics.responseTimeP95.toFixed(2)} ms |\n`;
27
+ md += `| P99 | ${metrics.responseTimeP99.toFixed(2)} ms |\n\n`;
28
+ // Iteration Duration
29
+ md += "## ⏱️ Iteration Duration\n\n";
30
+ md += "| Metric | Value |\n";
31
+ md += "| --- | --- |\n";
32
+ md += `| P50 | ${metrics.iterationDurationP50.toFixed(2)} ms |\n`;
33
+ md += `| P95 | ${metrics.iterationDurationP95.toFixed(2)} ms |\n`;
34
+ md += `| P99 | ${metrics.iterationDurationP99.toFixed(2)} ms |\n\n`;
35
+ // Checks
36
+ md += "## ✓ Checks\n\n";
37
+ md += "| Metric | Value |\n";
38
+ md += "| --- | --- |\n";
39
+ md += `| Total | ${metrics.checksTotal} |\n`;
40
+ md += `| Succeeded | ${metrics.checksSucceeded} |\n`;
41
+ md += `| Failed | ${metrics.checksFailed} |\n`;
42
+ md += `| Success Rate | ${metrics.checksSuccessRate.toFixed(2)}% |\n\n`;
43
+ // RPS by Endpoint (top 10)
44
+ if (Object.keys(metrics.rpsPerEndpoint).length > 0) {
45
+ md += "## 📈 RPS by Endpoint (Top 10)\n\n";
46
+ md += "| Endpoint | Avg (req/s) | P95 (req/s) | Max (req/s) |\n";
47
+ md += "| --- | --- | --- | --- |\n";
48
+ Object.entries(metrics.rpsPerEndpoint)
49
+ .sort((a, b) => b[1].p95 - a[1].p95)
50
+ .slice(0, 10)
51
+ .forEach(([endpoint, stats]) => {
52
+ md += `| ${endpoint} | ${stats.avg.toFixed(2)} | ${stats.p95.toFixed(2)} | ${stats.max.toFixed(2)} |\n`;
53
+ });
54
+ md += "\n";
55
+ }
56
+ // Requests Summary
57
+ if (Object.keys(metrics.requestsSummary).length > 0) {
58
+ md += "## 📋 Requests Summary\n\n";
59
+ md += "| Endpoint | Method | Count | Successful | Failed | Min (ms) | Avg (ms) | P95 (ms) | P99 (ms) | Max (ms) |\n";
60
+ md += "| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |\n";
61
+ Object.entries(metrics.requestsSummary)
62
+ .sort((a, b) => b[1].p95ResponseTime - a[1].p95ResponseTime)
63
+ .forEach(([, summary]) => {
64
+ md += `| ${summary.url} | ${summary.method} | ${summary.count} | ${summary.successful} | ${summary.failed} | ${summary.minResponseTime.toFixed(2)} | ${summary.avgResponseTime.toFixed(2)} | ${summary.p95ResponseTime.toFixed(2)} | ${summary.p99ResponseTime.toFixed(2)} | ${summary.maxResponseTime.toFixed(2)} |\n`;
65
+ });
66
+ md += "\n";
67
+ }
68
+ // Error Requests Summary
69
+ if (Object.keys(metrics.errorRequestsSummary).length > 0) {
70
+ md += "## ❌ Error Requests Summary\n\n";
71
+ md += "| Endpoint | Method | Status | Count | Min (ms) | Avg (ms) | P95 (ms) | P99 (ms) | Max (ms) |\n";
72
+ md += "| --- | --- | --- | --- | --- | --- | --- | --- | --- |\n";
73
+ metrics.errorRequestsDetailedSummary.forEach((error) => {
74
+ md += `| ${error.url} | ${error.method} | ${error.status} | ${error.count} | ${error.minResponseTime.toFixed(2)} | ${error.avgResponseTime.toFixed(2)} | ${error.p95ResponseTime.toFixed(2)} | ${error.p99ResponseTime.toFixed(2)} | ${error.maxResponseTime.toFixed(2)} |\n`;
75
+ });
76
+ md += "\n";
77
+ }
78
+ // Overall Status
79
+ md += "## Overall Status\n\n";
80
+ const status = metrics.errorRate < 1 ? "✓ PASS" : "✗ FAIL";
81
+ md += `**Status:** ${status}\n`;
82
+ md += `**Error Rate:** ${metrics.errorRate.toFixed(4)}% (threshold: < 1%)\n`;
83
+ return md;
84
+ }
85
+ }
86
+ exports.MarkdownReporter = MarkdownReporter;
87
+ //# sourceMappingURL=markdown.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"markdown.js","sourceRoot":"","sources":["../../src/reporters/markdown.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import { TestMetrics } from "./influx";
2
+ import { InfluxQueryClient } from "./influx";
3
+ export declare class ReportGenerator {
4
+ private influxClient;
5
+ constructor(influxClient: InfluxQueryClient);
6
+ generateMetrics(scenario: string, startTime: string, endTime: string): Promise<TestMetrics>;
7
+ generateHTMLReport(metrics: TestMetrics, testName: string): string;
8
+ generateCSVReport(metrics: TestMetrics, testName: string): string;
9
+ generateJSONReport(metrics: TestMetrics, testName: string): string;
10
+ }
11
+ //# sourceMappingURL=reports.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reports.d.ts","sourceRoot":"","sources":["../src/reports.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AACvC,OAAO,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAE7C,qBAAa,eAAe;IACd,OAAO,CAAC,YAAY;gBAAZ,YAAY,EAAE,iBAAiB;IAE7C,eAAe,CACnB,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,WAAW,CAAC;IA2FvB,kBAAkB,CAAC,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM;IA0NlE,iBAAiB,CAAC,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM;IAgCjE,kBAAkB,CAAC,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM;CA2BnE"}