k6-perf-reporter 1.6.4 → 1.6.5
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 +5 -1
- package/dist/reporters/slack-reporter.d.ts +6 -5
- package/dist/reporters/slack-reporter.d.ts.map +1 -1
- package/dist/reporters/slack-reporter.js +105 -78
- package/dist/reporters/slack-reporter.js.map +1 -1
- package/package.json +2 -2
- package/src/reporters/slack-reporter.ts +106 -86
|
@@ -2,16 +2,17 @@ import { ReporterResponse } from "../data-collector";
|
|
|
2
2
|
export declare class SlackReporter {
|
|
3
3
|
private client;
|
|
4
4
|
private channel;
|
|
5
|
+
private readonly MAX_BLOCKS_PER_MESSAGE;
|
|
5
6
|
constructor(token: string, channel: string);
|
|
6
7
|
report(data: ReporterResponse): Promise<void>;
|
|
7
|
-
private
|
|
8
|
-
private
|
|
9
|
-
private
|
|
10
|
-
private
|
|
8
|
+
private generateBlocks;
|
|
9
|
+
private generateHeaderBlocks;
|
|
10
|
+
private generateSummaryBlocks;
|
|
11
|
+
private generateMetricsBlocks;
|
|
12
|
+
private generateTableBlocks;
|
|
11
13
|
private formatTable;
|
|
12
14
|
private formatDuration;
|
|
13
15
|
private sendMessages;
|
|
14
|
-
private splitIntoMessages;
|
|
15
16
|
private sendMessage;
|
|
16
17
|
}
|
|
17
18
|
//# sourceMappingURL=slack-reporter.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"slack-reporter.d.ts","sourceRoot":"","sources":["../../src/reporters/slack-reporter.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"slack-reporter.d.ts","sourceRoot":"","sources":["../../src/reporters/slack-reporter.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAGrD,qBAAa,aAAa;IACxB,OAAO,CAAC,MAAM,CAAY;IAC1B,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,QAAQ,CAAC,sBAAsB,CAAM;gBAEjC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;IAQpC,MAAM,CAAC,IAAI,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC;IAKnD,OAAO,CAAC,cAAc;IAYtB,OAAO,CAAC,oBAAoB;IAwB5B,OAAO,CAAC,qBAAqB;IAgC7B,OAAO,CAAC,qBAAqB;IAgD7B,OAAO,CAAC,mBAAmB;IA2H3B,OAAO,CAAC,WAAW;IAkCnB,OAAO,CAAC,cAAc;YAUR,YAAY;YAOZ,WAAW;CAW1B"}
|
|
@@ -5,6 +5,7 @@ const web_api_1 = require("@slack/web-api");
|
|
|
5
5
|
const table_1 = require("table");
|
|
6
6
|
class SlackReporter {
|
|
7
7
|
constructor(token, channel) {
|
|
8
|
+
this.MAX_BLOCKS_PER_MESSAGE = 50;
|
|
8
9
|
this.client = new web_api_1.WebClient(token);
|
|
9
10
|
if (!channel || channel.trim() === "") {
|
|
10
11
|
throw new Error("Slack channel is required and cannot be empty");
|
|
@@ -12,27 +13,42 @@ class SlackReporter {
|
|
|
12
13
|
this.channel = channel;
|
|
13
14
|
}
|
|
14
15
|
async report(data) {
|
|
15
|
-
const
|
|
16
|
-
await this.sendMessages(
|
|
16
|
+
const blocks = this.generateBlocks(data);
|
|
17
|
+
await this.sendMessages(blocks);
|
|
17
18
|
}
|
|
18
|
-
|
|
19
|
+
generateBlocks(data) {
|
|
19
20
|
const reportData = data.data;
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
// Summary section
|
|
27
|
-
markdown += this.generateSummary(reportData);
|
|
28
|
-
// Main metrics
|
|
29
|
-
markdown += this.generateMetrics(reportData);
|
|
30
|
-
// Tables
|
|
31
|
-
markdown += this.generateTables(reportData);
|
|
32
|
-
return markdown;
|
|
21
|
+
const blocks = [];
|
|
22
|
+
blocks.push(...this.generateHeaderBlocks(data));
|
|
23
|
+
blocks.push(...this.generateMetricsBlocks(reportData));
|
|
24
|
+
blocks.push(...this.generateSummaryBlocks(reportData));
|
|
25
|
+
blocks.push(...this.generateTableBlocks(reportData));
|
|
26
|
+
return blocks;
|
|
33
27
|
}
|
|
34
|
-
|
|
35
|
-
|
|
28
|
+
generateHeaderBlocks(data) {
|
|
29
|
+
return [
|
|
30
|
+
{
|
|
31
|
+
type: "header",
|
|
32
|
+
text: {
|
|
33
|
+
type: "plain_text",
|
|
34
|
+
text: "k6 Performance Test Report",
|
|
35
|
+
},
|
|
36
|
+
},
|
|
37
|
+
{
|
|
38
|
+
type: "context",
|
|
39
|
+
elements: [
|
|
40
|
+
{
|
|
41
|
+
type: "mrkdwn",
|
|
42
|
+
text: `*Run ID:* ${data.runId} | *Start:* ${data.startTime} | *End:* ${data.endTime}`,
|
|
43
|
+
},
|
|
44
|
+
],
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
type: "divider",
|
|
48
|
+
},
|
|
49
|
+
];
|
|
50
|
+
}
|
|
51
|
+
generateSummaryBlocks(reportData) {
|
|
36
52
|
let errorPercent = 0;
|
|
37
53
|
let failedChecks = 0;
|
|
38
54
|
if (reportData.httpReqFailed) {
|
|
@@ -46,13 +62,21 @@ class SlackReporter {
|
|
|
46
62
|
const isSuccess = errorPercent < 1 && failedChecks === 0;
|
|
47
63
|
const status = isSuccess ? "✓ PASS" : "✗ FAIL";
|
|
48
64
|
const statusEmoji = isSuccess ? "✅" : "❌";
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
65
|
+
return [
|
|
66
|
+
{
|
|
67
|
+
type: "section",
|
|
68
|
+
text: {
|
|
69
|
+
type: "mrkdwn",
|
|
70
|
+
text: `${statusEmoji} *${status}* • Error Rate: ${errorPercent.toFixed(2)}%`,
|
|
71
|
+
},
|
|
72
|
+
},
|
|
73
|
+
{
|
|
74
|
+
type: "divider",
|
|
75
|
+
},
|
|
76
|
+
];
|
|
53
77
|
}
|
|
54
|
-
|
|
55
|
-
let metrics = "
|
|
78
|
+
generateMetricsBlocks(reportData) {
|
|
79
|
+
let metrics = "";
|
|
56
80
|
if (reportData.checks) {
|
|
57
81
|
const checks = reportData.checks;
|
|
58
82
|
const passRate = typeof checks.passRate === "number" ? checks.passRate : 0;
|
|
@@ -63,75 +87,102 @@ class SlackReporter {
|
|
|
63
87
|
const avg = typeof rpsAgg.avg === "number" ? rpsAgg.avg : 0;
|
|
64
88
|
const p95 = typeof rpsAgg.p95 === "number" ? rpsAgg.p95 : 0;
|
|
65
89
|
const max = typeof rpsAgg.max === "number" ? rpsAgg.max : 0;
|
|
66
|
-
metrics += `• RPS: avg=${avg.toFixed(2)}
|
|
90
|
+
metrics += `• RPS: avg=${avg.toFixed(2)} · p95=${p95.toFixed(2)} · max=${max.toFixed(2)}\n`;
|
|
67
91
|
}
|
|
68
92
|
if (reportData.httpReqs) {
|
|
69
93
|
const httpReqs = reportData.httpReqs;
|
|
70
|
-
metrics += `• HTTP Requests: ${httpReqs.total} (${httpReqs.rate.toFixed(
|
|
94
|
+
metrics += `• HTTP Requests: ${httpReqs.total} (${httpReqs.rate.toFixed(2)}/s)\n`;
|
|
71
95
|
}
|
|
72
96
|
if (reportData.iterations) {
|
|
73
97
|
const iterations = reportData.iterations;
|
|
74
|
-
metrics += `• Iterations: ${iterations.total} (${iterations.rate.toFixed(
|
|
98
|
+
metrics += `• Iterations: ${iterations.total} (${iterations.rate.toFixed(2)}/s)\n`;
|
|
75
99
|
}
|
|
76
100
|
if (reportData.httpReqDuration) {
|
|
77
101
|
const duration = reportData.httpReqDuration;
|
|
78
|
-
metrics += `• HTTP Duration: avg=${this.formatDuration(duration.avg || 0)}
|
|
102
|
+
metrics += `• HTTP Duration: avg=${this.formatDuration(duration.avg || 0)} · p95=${this.formatDuration(duration.p95 || 0)}\n`;
|
|
79
103
|
}
|
|
80
104
|
if (reportData.vus) {
|
|
81
105
|
const vus = reportData.vus;
|
|
82
106
|
metrics += `• VUs: ${vus.current} (min=${vus.min}, max=${vus.max})\n`;
|
|
83
107
|
}
|
|
84
|
-
|
|
85
|
-
|
|
108
|
+
return [
|
|
109
|
+
{
|
|
110
|
+
type: "section",
|
|
111
|
+
text: {
|
|
112
|
+
type: "mrkdwn",
|
|
113
|
+
text: `*Metrics*\n${metrics}`,
|
|
114
|
+
},
|
|
115
|
+
},
|
|
116
|
+
];
|
|
86
117
|
}
|
|
87
|
-
|
|
88
|
-
|
|
118
|
+
generateTableBlocks(reportData) {
|
|
119
|
+
const blocks = [];
|
|
89
120
|
if (reportData.topSlowUrls) {
|
|
90
121
|
const topSlowUrls = reportData.topSlowUrls;
|
|
91
122
|
const urls = topSlowUrls.urls;
|
|
92
123
|
if (urls && urls.length > 0) {
|
|
93
|
-
tables += "*Top 10 Slowest URLs*\n";
|
|
94
124
|
const tableData = [
|
|
95
125
|
["#", "Method", "URL", "p(95)"],
|
|
96
126
|
...urls.map((u, i) => [String(i + 1), u.method, u.url, this.formatDuration(u.p95Duration)]),
|
|
97
127
|
];
|
|
98
|
-
|
|
128
|
+
blocks.push({
|
|
129
|
+
type: "section",
|
|
130
|
+
text: {
|
|
131
|
+
type: "mrkdwn",
|
|
132
|
+
text: `*Top 10 Slowest URLs*\n\`\`\`\n${this.formatTable(tableData)}\`\`\``,
|
|
133
|
+
},
|
|
134
|
+
});
|
|
99
135
|
}
|
|
100
136
|
}
|
|
101
137
|
if (reportData.rpsPerUrl) {
|
|
102
138
|
const rpsPerUrl = reportData.rpsPerUrl;
|
|
103
139
|
const urls = rpsPerUrl.urls;
|
|
104
140
|
if (urls && urls.length > 0) {
|
|
105
|
-
tables += "*RPS per URL*\n";
|
|
106
141
|
const tableData = [
|
|
107
142
|
["#", "Method", "URL", "Count", "avg", "p(95)", "max"],
|
|
108
143
|
...urls.map((u, i) => [String(i + 1), u.method, u.url, String(u.count), u.rps.avg.toFixed(2), u.rps.p95.toFixed(2), u.rps.max.toFixed(2)]),
|
|
109
144
|
];
|
|
110
|
-
|
|
145
|
+
blocks.push({
|
|
146
|
+
type: "section",
|
|
147
|
+
text: {
|
|
148
|
+
type: "mrkdwn",
|
|
149
|
+
text: `*RPS per URL*\n\`\`\`\n${this.formatTable(tableData)}\`\`\``,
|
|
150
|
+
},
|
|
151
|
+
});
|
|
111
152
|
}
|
|
112
153
|
}
|
|
113
154
|
if (reportData.successRequests) {
|
|
114
155
|
const successRequests = reportData.successRequests;
|
|
115
156
|
const requests = successRequests.requests;
|
|
116
157
|
if (requests && requests.length > 0) {
|
|
117
|
-
tables += "*Top Successful Requests*\n";
|
|
118
158
|
const tableData = [
|
|
119
159
|
["#", "Method", "URL", "Status", "Count", "Min", "Avg", "p(95)"],
|
|
120
160
|
...requests.map((r, i) => [String(i + 1), r.method, r.url, String(r.status), String(r.count), this.formatDuration(r.min), this.formatDuration(r.avg), this.formatDuration(r.p95)]),
|
|
121
161
|
];
|
|
122
|
-
|
|
162
|
+
blocks.push({
|
|
163
|
+
type: "section",
|
|
164
|
+
text: {
|
|
165
|
+
type: "mrkdwn",
|
|
166
|
+
text: `*Top Successful Requests*\n\`\`\`\n${this.formatTable(tableData)}\`\`\``,
|
|
167
|
+
},
|
|
168
|
+
});
|
|
123
169
|
}
|
|
124
170
|
}
|
|
125
171
|
if (reportData.errorRequests) {
|
|
126
172
|
const errorRequests = reportData.errorRequests;
|
|
127
173
|
const errors = errorRequests.errors;
|
|
128
174
|
if (errors && errors.length > 0) {
|
|
129
|
-
tables += "*Top Error Requests*\n";
|
|
130
175
|
const tableData = [
|
|
131
176
|
["#", "Method", "URL", "Code", "Count"],
|
|
132
177
|
...errors.map((e, i) => [String(i + 1), e.method, e.url, String(e.status), String(e.count)]),
|
|
133
178
|
];
|
|
134
|
-
|
|
179
|
+
blocks.push({
|
|
180
|
+
type: "section",
|
|
181
|
+
text: {
|
|
182
|
+
type: "mrkdwn",
|
|
183
|
+
text: `*Top Error Requests*\n\`\`\`\n${this.formatTable(tableData)}\`\`\``,
|
|
184
|
+
},
|
|
185
|
+
});
|
|
135
186
|
}
|
|
136
187
|
}
|
|
137
188
|
if (reportData.errorResponsesText) {
|
|
@@ -155,7 +206,6 @@ class SlackReporter {
|
|
|
155
206
|
});
|
|
156
207
|
}
|
|
157
208
|
});
|
|
158
|
-
tables += "*Error Responses*\n";
|
|
159
209
|
const tableData = [
|
|
160
210
|
["#", "Method", "URL", "Status", "Error", "Count"],
|
|
161
211
|
...Array.from(groupedErrors.values()).map((r, i) => {
|
|
@@ -170,10 +220,16 @@ class SlackReporter {
|
|
|
170
220
|
return [String(i + 1), r.method, url, String(r.status), r.error, String(r.count)];
|
|
171
221
|
}),
|
|
172
222
|
];
|
|
173
|
-
|
|
223
|
+
blocks.push({
|
|
224
|
+
type: "section",
|
|
225
|
+
text: {
|
|
226
|
+
type: "mrkdwn",
|
|
227
|
+
text: `*Error Responses*\n\`\`\`\n${this.formatTable(tableData)}\`\`\``,
|
|
228
|
+
},
|
|
229
|
+
});
|
|
174
230
|
}
|
|
175
231
|
}
|
|
176
|
-
return
|
|
232
|
+
return blocks;
|
|
177
233
|
}
|
|
178
234
|
formatTable(tableData) {
|
|
179
235
|
if (tableData.length === 0) {
|
|
@@ -215,47 +271,18 @@ class SlackReporter {
|
|
|
215
271
|
}
|
|
216
272
|
return `${(ms / 1000).toFixed(2)}s`;
|
|
217
273
|
}
|
|
218
|
-
async sendMessages(
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
await this.sendMessage(message);
|
|
223
|
-
}
|
|
224
|
-
}
|
|
225
|
-
splitIntoMessages(text, maxLength) {
|
|
226
|
-
const messages = [];
|
|
227
|
-
const sections = text.split(/(\n\n)/);
|
|
228
|
-
let currentMessage = "";
|
|
229
|
-
for (const section of sections) {
|
|
230
|
-
if ((currentMessage + section).length <= maxLength) {
|
|
231
|
-
currentMessage += section;
|
|
232
|
-
}
|
|
233
|
-
else {
|
|
234
|
-
if (currentMessage) {
|
|
235
|
-
messages.push(currentMessage);
|
|
236
|
-
}
|
|
237
|
-
currentMessage = section;
|
|
238
|
-
}
|
|
239
|
-
}
|
|
240
|
-
if (currentMessage) {
|
|
241
|
-
messages.push(currentMessage);
|
|
274
|
+
async sendMessages(blocks) {
|
|
275
|
+
for (let i = 0; i < blocks.length; i += this.MAX_BLOCKS_PER_MESSAGE) {
|
|
276
|
+
const messageBatch = blocks.slice(i, i + this.MAX_BLOCKS_PER_MESSAGE);
|
|
277
|
+
await this.sendMessage(messageBatch);
|
|
242
278
|
}
|
|
243
|
-
return messages;
|
|
244
279
|
}
|
|
245
|
-
async sendMessage(
|
|
280
|
+
async sendMessage(blocks) {
|
|
246
281
|
try {
|
|
247
282
|
await this.client.chat.postMessage({
|
|
248
283
|
channel: this.channel,
|
|
249
284
|
text: "k6 Performance Test Report",
|
|
250
|
-
blocks
|
|
251
|
-
{
|
|
252
|
-
type: "section",
|
|
253
|
-
text: {
|
|
254
|
-
type: "mrkdwn",
|
|
255
|
-
text: markdown,
|
|
256
|
-
},
|
|
257
|
-
},
|
|
258
|
-
],
|
|
285
|
+
blocks,
|
|
259
286
|
});
|
|
260
287
|
}
|
|
261
288
|
catch (error) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"slack-reporter.js","sourceRoot":"","sources":["../../src/reporters/slack-reporter.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"slack-reporter.js","sourceRoot":"","sources":["../../src/reporters/slack-reporter.ts"],"names":[],"mappings":";;;AAAA,4CAA2C;AAG3C,iCAA8B;AAE9B,MAAa,aAAa;IAKxB,YAAY,KAAa,EAAE,OAAe;QAFzB,2BAAsB,GAAG,EAAE,CAAC;QAG3C,IAAI,CAAC,MAAM,GAAG,IAAI,mBAAS,CAAC,KAAK,CAAC,CAAC;QACnC,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;YACtC,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;QACnE,CAAC;QACD,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,IAAsB;QACjC,MAAM,MAAM,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;QACzC,MAAM,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;IAClC,CAAC;IAEO,cAAc,CAAC,IAAsB;QAC3C,MAAM,UAAU,GAAG,IAAI,CAAC,IAA+B,CAAC;QACxD,MAAM,MAAM,GAAiB,EAAE,CAAC;QAEhC,MAAM,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAC,CAAC;QAChD,MAAM,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,qBAAqB,CAAC,UAAU,CAAC,CAAC,CAAC;QACvD,MAAM,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,qBAAqB,CAAC,UAAU,CAAC,CAAC,CAAC;QACvD,MAAM,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,mBAAmB,CAAC,UAAU,CAAC,CAAC,CAAC;QAErD,OAAO,MAAM,CAAC;IAChB,CAAC;IAEO,oBAAoB,CAAC,IAAsB;QACjD,OAAO;YACL;gBACE,IAAI,EAAE,QAAQ;gBACd,IAAI,EAAE;oBACJ,IAAI,EAAE,YAAY;oBAClB,IAAI,EAAE,4BAA4B;iBACnC;aACF;YACD;gBACE,IAAI,EAAE,SAAS;gBACf,QAAQ,EAAE;oBACR;wBACE,IAAI,EAAE,QAAQ;wBACd,IAAI,EAAE,aAAa,IAAI,CAAC,KAAK,eAAe,IAAI,CAAC,SAAS,aAAa,IAAI,CAAC,OAAO,EAAE;qBACtF;iBACF;aACF;YACD;gBACE,IAAI,EAAE,SAAS;aAChB;SACF,CAAC;IACJ,CAAC;IAEO,qBAAqB,CAAC,UAAmC;QAC/D,IAAI,YAAY,GAAG,CAAC,CAAC;QACrB,IAAI,YAAY,GAAG,CAAC,CAAC;QAErB,IAAI,UAAU,CAAC,aAAa,EAAE,CAAC;YAC7B,MAAM,MAAM,GAAG,UAAU,CAAC,aAAuC,CAAC;YAClE,YAAY,GAAG,OAAO,MAAM,CAAC,WAAW,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;QACjF,CAAC;QAED,IAAI,UAAU,CAAC,MAAM,EAAE,CAAC;YACtB,MAAM,MAAM,GAAG,UAAU,CAAC,MAAgC,CAAC;YAC3D,YAAY,GAAG,OAAO,MAAM,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QACrE,CAAC;QAED,MAAM,SAAS,GAAG,YAAY,GAAG,CAAC,IAAI,YAAY,KAAK,CAAC,CAAC;QACzD,MAAM,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC;QAC/C,MAAM,WAAW,GAAG,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;QAE1C,OAAO;YACL;gBACE,IAAI,EAAE,SAAS;gBACf,IAAI,EAAE;oBACJ,IAAI,EAAE,QAAQ;oBACd,IAAI,EAAE,GAAG,WAAW,KAAK,MAAM,mBAAmB,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG;iBAC7E;aACF;YACD;gBACE,IAAI,EAAE,SAAS;aAChB;SACF,CAAC;IACJ,CAAC;IAEO,qBAAqB,CAAC,UAAmC;QAC/D,IAAI,OAAO,GAAG,EAAE,CAAC;QAEjB,IAAI,UAAU,CAAC,MAAM,EAAE,CAAC;YACtB,MAAM,MAAM,GAAG,UAAU,CAAC,MAAgC,CAAC;YAC3D,MAAM,QAAQ,GAAG,OAAO,MAAM,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;YAC3E,OAAO,IAAI,aAAa,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,MAAM,CAAC,MAAM,KAAK,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC;QACpH,CAAC;QAED,IAAI,UAAU,CAAC,aAAa,EAAE,CAAC;YAC7B,MAAM,MAAM,GAAG,UAAU,CAAC,aAAwC,CAAC;YACnE,MAAM,GAAG,GAAG,OAAO,MAAM,CAAC,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;YAC5D,MAAM,GAAG,GAAG,OAAO,MAAM,CAAC,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;YAC5D,MAAM,GAAG,GAAG,OAAO,MAAM,CAAC,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;YAC5D,OAAO,IAAI,cAAc,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,UAAU,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,UAAU,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC;QAC9F,CAAC;QAED,IAAI,UAAU,CAAC,QAAQ,EAAE,CAAC;YACxB,MAAM,QAAQ,GAAG,UAAU,CAAC,QAAkC,CAAC;YAC/D,OAAO,IAAI,oBAAoB,QAAQ,CAAC,KAAK,KAAK,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC;QACpF,CAAC;QAED,IAAI,UAAU,CAAC,UAAU,EAAE,CAAC;YAC1B,MAAM,UAAU,GAAG,UAAU,CAAC,UAAoC,CAAC;YACnE,OAAO,IAAI,iBAAiB,UAAU,CAAC,KAAK,KAAK,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC;QACrF,CAAC;QAED,IAAI,UAAU,CAAC,eAAe,EAAE,CAAC;YAC/B,MAAM,QAAQ,GAAG,UAAU,CAAC,eAAyC,CAAC;YACtE,OAAO,IAAI,wBAAwB,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC,CAAC,UAAU,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC,CAAC,IAAI,CAAC;QAChI,CAAC;QAED,IAAI,UAAU,CAAC,GAAG,EAAE,CAAC;YACnB,MAAM,GAAG,GAAG,UAAU,CAAC,GAA6B,CAAC;YACrD,OAAO,IAAI,UAAU,GAAG,CAAC,OAAO,SAAS,GAAG,CAAC,GAAG,SAAS,GAAG,CAAC,GAAG,KAAK,CAAC;QACxE,CAAC;QAED,OAAO;YACL;gBACE,IAAI,EAAE,SAAS;gBACf,IAAI,EAAE;oBACJ,IAAI,EAAE,QAAQ;oBACd,IAAI,EAAE,cAAc,OAAO,EAAE;iBAC9B;aACF;SACF,CAAC;IACJ,CAAC;IAEO,mBAAmB,CAAC,UAAmC;QAC7D,MAAM,MAAM,GAAiB,EAAE,CAAC;QAEhC,IAAI,UAAU,CAAC,WAAW,EAAE,CAAC;YAC3B,MAAM,WAAW,GAAG,UAAU,CAAC,WAAsC,CAAC;YACtE,MAAM,IAAI,GAAG,WAAW,CAAC,IAAmE,CAAC;YAC7F,IAAI,IAAI,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC5B,MAAM,SAAS,GAAG;oBAChB,CAAC,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,CAAC;oBAC/B,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC;iBAC5F,CAAC;gBACF,MAAM,CAAC,IAAI,CAAC;oBACV,IAAI,EAAE,SAAS;oBACf,IAAI,EAAE;wBACJ,IAAI,EAAE,QAAQ;wBACd,IAAI,EAAE,kCAAkC,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,QAAQ;qBAC5E;iBACF,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,IAAI,UAAU,CAAC,SAAS,EAAE,CAAC;YACzB,MAAM,SAAS,GAAG,UAAU,CAAC,SAAoC,CAAC;YAClE,MAAM,IAAI,GAAG,SAAS,CAAC,IAA6G,CAAC;YACrI,IAAI,IAAI,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC5B,MAAM,SAAS,GAAG;oBAChB,CAAC,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,CAAC;oBACtD,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;iBAC3I,CAAC;gBACF,MAAM,CAAC,IAAI,CAAC;oBACV,IAAI,EAAE,SAAS;oBACf,IAAI,EAAE;wBACJ,IAAI,EAAE,QAAQ;wBACd,IAAI,EAAE,0BAA0B,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,QAAQ;qBACpE;iBACF,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,IAAI,UAAU,CAAC,eAAe,EAAE,CAAC;YAC/B,MAAM,eAAe,GAAG,UAAU,CAAC,eAA0C,CAAC;YAC9E,MAAM,QAAQ,GAAG,eAAe,CAAC,QAAwH,CAAC;YAC1J,IAAI,QAAQ,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACpC,MAAM,SAAS,GAAG;oBAChB,CAAC,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,CAAC;oBAChE,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;iBACnL,CAAC;gBACF,MAAM,CAAC,IAAI,CAAC;oBACV,IAAI,EAAE,SAAS;oBACf,IAAI,EAAE;wBACJ,IAAI,EAAE,QAAQ;wBACd,IAAI,EAAE,sCAAsC,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,QAAQ;qBAChF;iBACF,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,IAAI,UAAU,CAAC,aAAa,EAAE,CAAC;YAC7B,MAAM,aAAa,GAAG,UAAU,CAAC,aAAwC,CAAC;YAC1E,MAAM,MAAM,GAAG,aAAa,CAAC,MAA+E,CAAC;YAC7G,IAAI,MAAM,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAChC,MAAM,SAAS,GAAG;oBAChB,CAAC,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC;oBACvC,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;iBAC7F,CAAC;gBACF,MAAM,CAAC,IAAI,CAAC;oBACV,IAAI,EAAE,SAAS;oBACf,IAAI,EAAE;wBACJ,IAAI,EAAE,QAAQ;wBACd,IAAI,EAAE,iCAAiC,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,QAAQ;qBAC3E;iBACF,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,IAAI,UAAU,CAAC,kBAAkB,EAAE,CAAC;YAClC,MAAM,kBAAkB,GAAG,UAAU,CAAC,kBAA6C,CAAC;YACpF,MAAM,SAAS,GAAG,kBAAkB,CAAC,SAAkF,CAAC;YACxH,IAAI,SAAS,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACtC,MAAM,aAAa,GAAG,IAAI,GAAG,EAAyF,CAAC;gBAEvH,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE;oBACtB,MAAM,GAAG,GAAG,GAAG,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,KAAK,EAAE,CAAC;oBAC1D,IAAI,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;wBAC3B,MAAM,KAAK,GAAG,aAAa,CAAC,GAAG,CAAC,GAAG,CAAE,CAAC;wBACtC,KAAK,CAAC,KAAK,EAAE,CAAC;oBAChB,CAAC;yBAAM,CAAC;wBACN,aAAa,CAAC,GAAG,CAAC,GAAG,EAAE;4BACrB,MAAM,EAAE,CAAC,CAAC,MAAM;4BAChB,GAAG,EAAE,CAAC,CAAC,GAAG;4BACV,MAAM,EAAE,CAAC,CAAC,MAAM;4BAChB,KAAK,EAAE,CAAC,CAAC,KAAK,IAAI,EAAE;4BACpB,KAAK,EAAE,CAAC;yBACT,CAAC,CAAC;oBACL,CAAC;gBACH,CAAC,CAAC,CAAC;gBAEH,MAAM,SAAS,GAAG;oBAChB,CAAC,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC;oBAClD,GAAG,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;wBACjD,IAAI,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC;wBAChB,IAAI,CAAC;4BACH,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;4BAC5B,GAAG,GAAG,MAAM,CAAC,QAAQ,CAAC;wBACxB,CAAC;wBAAC,MAAM,CAAC;4BACP,+BAA+B;wBACjC,CAAC;wBACD,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;oBACpF,CAAC,CAAC;iBACH,CAAC;gBACF,MAAM,CAAC,IAAI,CAAC;oBACV,IAAI,EAAE,SAAS;oBACf,IAAI,EAAE;wBACJ,IAAI,EAAE,QAAQ;wBACd,IAAI,EAAE,8BAA8B,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,QAAQ;qBACxE;iBACF,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;IAEO,WAAW,CAAC,SAAqB;QACvC,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC3B,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,MAAM,WAAW,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;QACxC,MAAM,YAAY,GAA+D,EAAE,CAAC;QACpF,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,WAAW,EAAE,CAAC,EAAE,EAAE,CAAC;YACrC,YAAY,CAAC,CAAC,CAAC,GAAG,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC;QAC1C,CAAC;QAED,OAAO,IAAA,aAAK,EAAC,SAAS,EAAE;YACtB,MAAM,EAAE;gBACN,OAAO,EAAE,GAAG;gBACZ,OAAO,EAAE,GAAG;gBACZ,OAAO,EAAE,GAAG;gBACZ,QAAQ,EAAE,GAAG;gBACb,UAAU,EAAE,GAAG;gBACf,UAAU,EAAE,GAAG;gBACf,UAAU,EAAE,GAAG;gBACf,WAAW,EAAE,GAAG;gBAChB,QAAQ,EAAE,GAAG;gBACb,SAAS,EAAE,GAAG;gBACd,QAAQ,EAAE,GAAG;gBACb,QAAQ,EAAE,GAAG;gBACb,QAAQ,EAAE,GAAG;gBACb,SAAS,EAAE,GAAG;gBACd,QAAQ,EAAE,GAAG;aACd;YACD,kBAAkB,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,KAAK,CAAC;YAC1C,OAAO,EAAE,YAAY;SACtB,CAAC,CAAC;IACL,CAAC;IAEO,cAAc,CAAC,EAAU;QAC/B,IAAI,EAAE,GAAG,CAAC,EAAE,CAAC;YACX,OAAO,GAAG,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC;QACvC,CAAC;QACD,IAAI,EAAE,GAAG,IAAI,EAAE,CAAC;YACd,OAAO,GAAG,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC;QAC9B,CAAC;QACD,OAAO,GAAG,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC;IACtC,CAAC;IAEO,KAAK,CAAC,YAAY,CAAC,MAAoB;QAC7C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,IAAI,IAAI,CAAC,sBAAsB,EAAE,CAAC;YACpE,MAAM,YAAY,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,sBAAsB,CAAC,CAAC;YACtE,MAAM,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC;QACvC,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,WAAW,CAAC,MAAoB;QAC5C,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC;gBACjC,OAAO,EAAE,IAAI,CAAC,OAAO;gBACrB,IAAI,EAAE,4BAA4B;gBAClC,MAAM;aACP,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CAAC,iCAAiC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAC7G,CAAC;IACH,CAAC;CACF;AA/TD,sCA+TC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "k6-perf-reporter",
|
|
3
|
-
"version": "1.6.
|
|
3
|
+
"version": "1.6.5",
|
|
4
4
|
"description": "Reporting tool for k6 performance tests with InfluxDB 2 integration",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
"start": "node dist/index.js",
|
|
14
14
|
"report": "tsx src/cli.ts",
|
|
15
15
|
"report:example": "tsx src/cli.ts generate --run-id '965375' -st '-24h'",
|
|
16
|
-
"report:example:json": "tsx src/cli.ts generate --run-id '
|
|
16
|
+
"report:example:json": "tsx src/cli.ts generate --run-id '966579' -st '-4h' --format slack",
|
|
17
17
|
"lint": "eslint src",
|
|
18
18
|
"type-check": "tsc --noEmit"
|
|
19
19
|
},
|
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
import { WebClient } from "@slack/web-api";
|
|
2
|
+
import { KnownBlock } from "@slack/types";
|
|
2
3
|
import { ReporterResponse } from "../data-collector";
|
|
3
4
|
import { table } from "table";
|
|
4
5
|
|
|
5
6
|
export class SlackReporter {
|
|
6
7
|
private client: WebClient;
|
|
7
8
|
private channel: string;
|
|
9
|
+
private readonly MAX_BLOCKS_PER_MESSAGE = 50;
|
|
8
10
|
|
|
9
11
|
constructor(token: string, channel: string) {
|
|
10
12
|
this.client = new WebClient(token);
|
|
@@ -15,35 +17,47 @@ export class SlackReporter {
|
|
|
15
17
|
}
|
|
16
18
|
|
|
17
19
|
async report(data: ReporterResponse): Promise<void> {
|
|
18
|
-
const
|
|
19
|
-
await this.sendMessages(
|
|
20
|
+
const blocks = this.generateBlocks(data);
|
|
21
|
+
await this.sendMessages(blocks);
|
|
20
22
|
}
|
|
21
23
|
|
|
22
|
-
private
|
|
24
|
+
private generateBlocks(data: ReporterResponse): KnownBlock[] {
|
|
23
25
|
const reportData = data.data as Record<string, unknown>;
|
|
24
|
-
|
|
26
|
+
const blocks: KnownBlock[] = [];
|
|
25
27
|
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
markdown += `• *End:* ${data.endTime}\n\n`;
|
|
28
|
+
blocks.push(...this.generateHeaderBlocks(data));
|
|
29
|
+
blocks.push(...this.generateMetricsBlocks(reportData));
|
|
30
|
+
blocks.push(...this.generateSummaryBlocks(reportData));
|
|
31
|
+
blocks.push(...this.generateTableBlocks(reportData));
|
|
31
32
|
|
|
32
|
-
|
|
33
|
-
markdown += this.generateSummary(reportData);
|
|
34
|
-
|
|
35
|
-
// Main metrics
|
|
36
|
-
markdown += this.generateMetrics(reportData);
|
|
37
|
-
|
|
38
|
-
// Tables
|
|
39
|
-
markdown += this.generateTables(reportData);
|
|
40
|
-
|
|
41
|
-
return markdown;
|
|
33
|
+
return blocks;
|
|
42
34
|
}
|
|
43
35
|
|
|
44
|
-
private
|
|
45
|
-
|
|
36
|
+
private generateHeaderBlocks(data: ReporterResponse): KnownBlock[] {
|
|
37
|
+
return [
|
|
38
|
+
{
|
|
39
|
+
type: "header",
|
|
40
|
+
text: {
|
|
41
|
+
type: "plain_text",
|
|
42
|
+
text: "k6 Performance Test Report",
|
|
43
|
+
},
|
|
44
|
+
},
|
|
45
|
+
{
|
|
46
|
+
type: "context",
|
|
47
|
+
elements: [
|
|
48
|
+
{
|
|
49
|
+
type: "mrkdwn",
|
|
50
|
+
text: `*Run ID:* ${data.runId} | *Start:* ${data.startTime} | *End:* ${data.endTime}`,
|
|
51
|
+
},
|
|
52
|
+
],
|
|
53
|
+
},
|
|
54
|
+
{
|
|
55
|
+
type: "divider",
|
|
56
|
+
},
|
|
57
|
+
];
|
|
58
|
+
}
|
|
46
59
|
|
|
60
|
+
private generateSummaryBlocks(reportData: Record<string, unknown>): KnownBlock[] {
|
|
47
61
|
let errorPercent = 0;
|
|
48
62
|
let failedChecks = 0;
|
|
49
63
|
|
|
@@ -61,15 +75,22 @@ export class SlackReporter {
|
|
|
61
75
|
const status = isSuccess ? "✓ PASS" : "✗ FAIL";
|
|
62
76
|
const statusEmoji = isSuccess ? "✅" : "❌";
|
|
63
77
|
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
78
|
+
return [
|
|
79
|
+
{
|
|
80
|
+
type: "section",
|
|
81
|
+
text: {
|
|
82
|
+
type: "mrkdwn",
|
|
83
|
+
text: `${statusEmoji} *${status}* • Error Rate: ${errorPercent.toFixed(2)}%`,
|
|
84
|
+
},
|
|
85
|
+
},
|
|
86
|
+
{
|
|
87
|
+
type: "divider",
|
|
88
|
+
},
|
|
89
|
+
];
|
|
69
90
|
}
|
|
70
91
|
|
|
71
|
-
private
|
|
72
|
-
let metrics = "
|
|
92
|
+
private generateMetricsBlocks(reportData: Record<string, unknown>): KnownBlock[] {
|
|
93
|
+
let metrics = "";
|
|
73
94
|
|
|
74
95
|
if (reportData.checks) {
|
|
75
96
|
const checks = reportData.checks as Record<string, number>;
|
|
@@ -82,22 +103,22 @@ export class SlackReporter {
|
|
|
82
103
|
const avg = typeof rpsAgg.avg === "number" ? rpsAgg.avg : 0;
|
|
83
104
|
const p95 = typeof rpsAgg.p95 === "number" ? rpsAgg.p95 : 0;
|
|
84
105
|
const max = typeof rpsAgg.max === "number" ? rpsAgg.max : 0;
|
|
85
|
-
metrics += `• RPS: avg=${avg.toFixed(2)}
|
|
106
|
+
metrics += `• RPS: avg=${avg.toFixed(2)} · p95=${p95.toFixed(2)} · max=${max.toFixed(2)}\n`;
|
|
86
107
|
}
|
|
87
108
|
|
|
88
109
|
if (reportData.httpReqs) {
|
|
89
110
|
const httpReqs = reportData.httpReqs as Record<string, number>;
|
|
90
|
-
metrics += `• HTTP Requests: ${httpReqs.total} (${httpReqs.rate.toFixed(
|
|
111
|
+
metrics += `• HTTP Requests: ${httpReqs.total} (${httpReqs.rate.toFixed(2)}/s)\n`;
|
|
91
112
|
}
|
|
92
113
|
|
|
93
114
|
if (reportData.iterations) {
|
|
94
115
|
const iterations = reportData.iterations as Record<string, number>;
|
|
95
|
-
metrics += `• Iterations: ${iterations.total} (${iterations.rate.toFixed(
|
|
116
|
+
metrics += `• Iterations: ${iterations.total} (${iterations.rate.toFixed(2)}/s)\n`;
|
|
96
117
|
}
|
|
97
118
|
|
|
98
119
|
if (reportData.httpReqDuration) {
|
|
99
120
|
const duration = reportData.httpReqDuration as Record<string, number>;
|
|
100
|
-
metrics += `• HTTP Duration: avg=${this.formatDuration(duration.avg || 0)}
|
|
121
|
+
metrics += `• HTTP Duration: avg=${this.formatDuration(duration.avg || 0)} · p95=${this.formatDuration(duration.p95 || 0)}\n`;
|
|
101
122
|
}
|
|
102
123
|
|
|
103
124
|
if (reportData.vus) {
|
|
@@ -105,23 +126,35 @@ export class SlackReporter {
|
|
|
105
126
|
metrics += `• VUs: ${vus.current} (min=${vus.min}, max=${vus.max})\n`;
|
|
106
127
|
}
|
|
107
128
|
|
|
108
|
-
|
|
109
|
-
|
|
129
|
+
return [
|
|
130
|
+
{
|
|
131
|
+
type: "section",
|
|
132
|
+
text: {
|
|
133
|
+
type: "mrkdwn",
|
|
134
|
+
text: `*Metrics*\n${metrics}`,
|
|
135
|
+
},
|
|
136
|
+
},
|
|
137
|
+
];
|
|
110
138
|
}
|
|
111
139
|
|
|
112
|
-
private
|
|
113
|
-
|
|
140
|
+
private generateTableBlocks(reportData: Record<string, unknown>): KnownBlock[] {
|
|
141
|
+
const blocks: KnownBlock[] = [];
|
|
114
142
|
|
|
115
143
|
if (reportData.topSlowUrls) {
|
|
116
144
|
const topSlowUrls = reportData.topSlowUrls as Record<string, unknown>;
|
|
117
145
|
const urls = topSlowUrls.urls as Array<{ method: string; url: string; p95Duration: number }>;
|
|
118
146
|
if (urls && urls.length > 0) {
|
|
119
|
-
tables += "*Top 10 Slowest URLs*\n";
|
|
120
147
|
const tableData = [
|
|
121
148
|
["#", "Method", "URL", "p(95)"],
|
|
122
149
|
...urls.map((u, i) => [String(i + 1), u.method, u.url, this.formatDuration(u.p95Duration)]),
|
|
123
150
|
];
|
|
124
|
-
|
|
151
|
+
blocks.push({
|
|
152
|
+
type: "section",
|
|
153
|
+
text: {
|
|
154
|
+
type: "mrkdwn",
|
|
155
|
+
text: `*Top 10 Slowest URLs*\n\`\`\`\n${this.formatTable(tableData)}\`\`\``,
|
|
156
|
+
},
|
|
157
|
+
});
|
|
125
158
|
}
|
|
126
159
|
}
|
|
127
160
|
|
|
@@ -129,12 +162,17 @@ export class SlackReporter {
|
|
|
129
162
|
const rpsPerUrl = reportData.rpsPerUrl as Record<string, unknown>;
|
|
130
163
|
const urls = rpsPerUrl.urls as Array<{ method: string; url: string; count: number; rps: { avg: number; p95: number; max: number } }>;
|
|
131
164
|
if (urls && urls.length > 0) {
|
|
132
|
-
tables += "*RPS per URL*\n";
|
|
133
165
|
const tableData = [
|
|
134
166
|
["#", "Method", "URL", "Count", "avg", "p(95)", "max"],
|
|
135
167
|
...urls.map((u, i) => [String(i + 1), u.method, u.url, String(u.count), u.rps.avg.toFixed(2), u.rps.p95.toFixed(2), u.rps.max.toFixed(2)]),
|
|
136
168
|
];
|
|
137
|
-
|
|
169
|
+
blocks.push({
|
|
170
|
+
type: "section",
|
|
171
|
+
text: {
|
|
172
|
+
type: "mrkdwn",
|
|
173
|
+
text: `*RPS per URL*\n\`\`\`\n${this.formatTable(tableData)}\`\`\``,
|
|
174
|
+
},
|
|
175
|
+
});
|
|
138
176
|
}
|
|
139
177
|
}
|
|
140
178
|
|
|
@@ -142,12 +180,17 @@ export class SlackReporter {
|
|
|
142
180
|
const successRequests = reportData.successRequests as Record<string, unknown>;
|
|
143
181
|
const requests = successRequests.requests as Array<{ method: string; url: string; status: number; count: number; min: number; avg: number; p95: number }>;
|
|
144
182
|
if (requests && requests.length > 0) {
|
|
145
|
-
tables += "*Top Successful Requests*\n";
|
|
146
183
|
const tableData = [
|
|
147
184
|
["#", "Method", "URL", "Status", "Count", "Min", "Avg", "p(95)"],
|
|
148
185
|
...requests.map((r, i) => [String(i + 1), r.method, r.url, String(r.status), String(r.count), this.formatDuration(r.min), this.formatDuration(r.avg), this.formatDuration(r.p95)]),
|
|
149
186
|
];
|
|
150
|
-
|
|
187
|
+
blocks.push({
|
|
188
|
+
type: "section",
|
|
189
|
+
text: {
|
|
190
|
+
type: "mrkdwn",
|
|
191
|
+
text: `*Top Successful Requests*\n\`\`\`\n${this.formatTable(tableData)}\`\`\``,
|
|
192
|
+
},
|
|
193
|
+
});
|
|
151
194
|
}
|
|
152
195
|
}
|
|
153
196
|
|
|
@@ -155,12 +198,17 @@ export class SlackReporter {
|
|
|
155
198
|
const errorRequests = reportData.errorRequests as Record<string, unknown>;
|
|
156
199
|
const errors = errorRequests.errors as Array<{ method: string; url: string; status: number; count: number }>;
|
|
157
200
|
if (errors && errors.length > 0) {
|
|
158
|
-
tables += "*Top Error Requests*\n";
|
|
159
201
|
const tableData = [
|
|
160
202
|
["#", "Method", "URL", "Code", "Count"],
|
|
161
203
|
...errors.map((e, i) => [String(i + 1), e.method, e.url, String(e.status), String(e.count)]),
|
|
162
204
|
];
|
|
163
|
-
|
|
205
|
+
blocks.push({
|
|
206
|
+
type: "section",
|
|
207
|
+
text: {
|
|
208
|
+
type: "mrkdwn",
|
|
209
|
+
text: `*Top Error Requests*\n\`\`\`\n${this.formatTable(tableData)}\`\`\``,
|
|
210
|
+
},
|
|
211
|
+
});
|
|
164
212
|
}
|
|
165
213
|
}
|
|
166
214
|
|
|
@@ -186,7 +234,6 @@ export class SlackReporter {
|
|
|
186
234
|
}
|
|
187
235
|
});
|
|
188
236
|
|
|
189
|
-
tables += "*Error Responses*\n";
|
|
190
237
|
const tableData = [
|
|
191
238
|
["#", "Method", "URL", "Status", "Error", "Count"],
|
|
192
239
|
...Array.from(groupedErrors.values()).map((r, i) => {
|
|
@@ -200,11 +247,17 @@ export class SlackReporter {
|
|
|
200
247
|
return [String(i + 1), r.method, url, String(r.status), r.error, String(r.count)];
|
|
201
248
|
}),
|
|
202
249
|
];
|
|
203
|
-
|
|
250
|
+
blocks.push({
|
|
251
|
+
type: "section",
|
|
252
|
+
text: {
|
|
253
|
+
type: "mrkdwn",
|
|
254
|
+
text: `*Error Responses*\n\`\`\`\n${this.formatTable(tableData)}\`\`\``,
|
|
255
|
+
},
|
|
256
|
+
});
|
|
204
257
|
}
|
|
205
258
|
}
|
|
206
259
|
|
|
207
|
-
return
|
|
260
|
+
return blocks;
|
|
208
261
|
}
|
|
209
262
|
|
|
210
263
|
private formatTable(tableData: string[][]): string {
|
|
@@ -251,52 +304,19 @@ export class SlackReporter {
|
|
|
251
304
|
return `${(ms / 1000).toFixed(2)}s`;
|
|
252
305
|
}
|
|
253
306
|
|
|
254
|
-
private async sendMessages(
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
for (const message of messages) {
|
|
259
|
-
await this.sendMessage(message);
|
|
307
|
+
private async sendMessages(blocks: KnownBlock[]): Promise<void> {
|
|
308
|
+
for (let i = 0; i < blocks.length; i += this.MAX_BLOCKS_PER_MESSAGE) {
|
|
309
|
+
const messageBatch = blocks.slice(i, i + this.MAX_BLOCKS_PER_MESSAGE);
|
|
310
|
+
await this.sendMessage(messageBatch);
|
|
260
311
|
}
|
|
261
312
|
}
|
|
262
313
|
|
|
263
|
-
private
|
|
264
|
-
const messages: string[] = [];
|
|
265
|
-
const sections = text.split(/(\n\n)/);
|
|
266
|
-
let currentMessage = "";
|
|
267
|
-
|
|
268
|
-
for (const section of sections) {
|
|
269
|
-
if ((currentMessage + section).length <= maxLength) {
|
|
270
|
-
currentMessage += section;
|
|
271
|
-
} else {
|
|
272
|
-
if (currentMessage) {
|
|
273
|
-
messages.push(currentMessage);
|
|
274
|
-
}
|
|
275
|
-
currentMessage = section;
|
|
276
|
-
}
|
|
277
|
-
}
|
|
278
|
-
|
|
279
|
-
if (currentMessage) {
|
|
280
|
-
messages.push(currentMessage);
|
|
281
|
-
}
|
|
282
|
-
|
|
283
|
-
return messages;
|
|
284
|
-
}
|
|
285
|
-
|
|
286
|
-
private async sendMessage(markdown: string): Promise<void> {
|
|
314
|
+
private async sendMessage(blocks: KnownBlock[]): Promise<void> {
|
|
287
315
|
try {
|
|
288
316
|
await this.client.chat.postMessage({
|
|
289
317
|
channel: this.channel,
|
|
290
318
|
text: "k6 Performance Test Report",
|
|
291
|
-
blocks
|
|
292
|
-
{
|
|
293
|
-
type: "section",
|
|
294
|
-
text: {
|
|
295
|
-
type: "mrkdwn",
|
|
296
|
-
text: markdown,
|
|
297
|
-
},
|
|
298
|
-
},
|
|
299
|
-
],
|
|
319
|
+
blocks,
|
|
300
320
|
});
|
|
301
321
|
} catch (error) {
|
|
302
322
|
throw new Error(`Failed to send Slack message: ${error instanceof Error ? error.message : String(error)}`);
|