@axinom/mosaic-testing 0.7.16-rc.3 → 0.7.16-rc.4

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 (141) hide show
  1. package/dist/index.d.ts +2 -0
  2. package/dist/{cjs/index.d.ts.map → index.d.ts.map} +1 -1
  3. package/dist/{cjs/index.js → index.js} +1 -1
  4. package/dist/index.js.map +1 -0
  5. package/dist/performance/index.d.ts +3 -0
  6. package/dist/performance/index.d.ts.map +1 -0
  7. package/dist/{cjs/performance → performance}/index.js +2 -2
  8. package/dist/performance/index.js.map +1 -0
  9. package/dist/{cjs/performance → performance}/plugins/inbox-outbox-report-endpoint-plugin.d.ts +2 -2
  10. package/dist/performance/plugins/inbox-outbox-report-endpoint-plugin.d.ts.map +1 -0
  11. package/dist/{cjs/performance → performance}/plugins/inbox-outbox-report-endpoint-plugin.js +8 -9
  12. package/dist/performance/plugins/inbox-outbox-report-endpoint-plugin.js.map +1 -0
  13. package/dist/{cjs/performance → performance}/plugins/inbox-outbox-state-endpoint-plugin.d.ts +2 -2
  14. package/dist/performance/plugins/inbox-outbox-state-endpoint-plugin.d.ts.map +1 -0
  15. package/dist/{cjs/performance → performance}/plugins/inbox-outbox-state-endpoint-plugin.js +3 -4
  16. package/dist/performance/plugins/inbox-outbox-state-endpoint-plugin.js.map +1 -0
  17. package/dist/{esm/performance/plugins/index.js → performance/plugins/index.d.ts} +3 -3
  18. package/dist/performance/plugins/index.d.ts.map +1 -0
  19. package/dist/{cjs/performance → performance}/plugins/index.js +4 -4
  20. package/dist/performance/plugins/index.js.map +1 -0
  21. package/dist/performance/scripts/index.d.ts +4 -0
  22. package/dist/performance/scripts/index.d.ts.map +1 -0
  23. package/dist/{cjs/performance → performance}/scripts/index.js +3 -3
  24. package/dist/performance/scripts/index.js.map +1 -0
  25. package/dist/{esm/performance → performance}/scripts/make-graphql-request.d.ts +2 -2
  26. package/dist/performance/scripts/make-graphql-request.d.ts.map +1 -0
  27. package/dist/{cjs/performance → performance}/scripts/make-graphql-request.js +2 -2
  28. package/dist/performance/scripts/make-graphql-request.js.map +1 -0
  29. package/dist/{esm/performance → performance}/scripts/run-inbox-outbox-scenario.d.ts +3 -3
  30. package/dist/performance/scripts/run-inbox-outbox-scenario.d.ts.map +1 -0
  31. package/dist/{cjs/performance → performance}/scripts/run-inbox-outbox-scenario.js +30 -9
  32. package/dist/performance/scripts/run-inbox-outbox-scenario.js.map +1 -0
  33. package/dist/performance/scripts/run-scenario.d.ts.map +1 -0
  34. package/dist/{cjs/performance → performance}/scripts/run-scenario.js +3 -3
  35. package/dist/performance/scripts/run-scenario.js.map +1 -0
  36. package/dist/performance/utils/colorize-text.d.ts.map +1 -0
  37. package/dist/performance/utils/colorize-text.js.map +1 -0
  38. package/dist/performance/utils/index.d.ts +3 -0
  39. package/dist/performance/utils/index.d.ts.map +1 -0
  40. package/dist/{cjs/performance → performance}/utils/index.js +2 -2
  41. package/dist/performance/utils/index.js.map +1 -0
  42. package/dist/{cjs/performance → performance}/utils/report-generation.d.ts +1 -1
  43. package/dist/performance/utils/report-generation.d.ts.map +1 -0
  44. package/dist/{cjs/performance → performance}/utils/report-generation.js +15 -12
  45. package/dist/performance/utils/report-generation.js.map +1 -0
  46. package/package.json +11 -21
  47. package/src/index.ts +1 -1
  48. package/src/performance/index.ts +2 -2
  49. package/src/performance/plugins/inbox-outbox-report-endpoint-plugin.spec.ts +3 -6
  50. package/src/performance/plugins/inbox-outbox-report-endpoint-plugin.ts +3 -3
  51. package/src/performance/plugins/inbox-outbox-state-endpoint-plugin.spec.ts +3 -6
  52. package/src/performance/plugins/inbox-outbox-state-endpoint-plugin.ts +2 -2
  53. package/src/performance/plugins/index.ts +2 -2
  54. package/src/performance/scripts/index.ts +3 -3
  55. package/src/performance/scripts/make-graphql-request.ts +3 -4
  56. package/src/performance/scripts/run-inbox-outbox-scenario.ts +8 -8
  57. package/src/performance/scripts/run-scenario.ts +1 -1
  58. package/src/performance/utils/index.ts +2 -2
  59. package/src/performance/utils/report-generation.ts +2 -2
  60. package/src/tests/utils/index.ts +1 -1
  61. package/src/tests/utils/stub-helpers.ts +2 -2
  62. package/dist/cjs/index.d.ts +0 -2
  63. package/dist/cjs/index.js.map +0 -1
  64. package/dist/cjs/package.json +0 -1
  65. package/dist/cjs/performance/index.d.ts +0 -3
  66. package/dist/cjs/performance/index.d.ts.map +0 -1
  67. package/dist/cjs/performance/index.js.map +0 -1
  68. package/dist/cjs/performance/plugins/inbox-outbox-report-endpoint-plugin.d.ts.map +0 -1
  69. package/dist/cjs/performance/plugins/inbox-outbox-report-endpoint-plugin.js.map +0 -1
  70. package/dist/cjs/performance/plugins/inbox-outbox-state-endpoint-plugin.d.ts.map +0 -1
  71. package/dist/cjs/performance/plugins/inbox-outbox-state-endpoint-plugin.js.map +0 -1
  72. package/dist/cjs/performance/plugins/index.d.ts +0 -3
  73. package/dist/cjs/performance/plugins/index.d.ts.map +0 -1
  74. package/dist/cjs/performance/plugins/index.js.map +0 -1
  75. package/dist/cjs/performance/scripts/index.d.ts +0 -4
  76. package/dist/cjs/performance/scripts/index.d.ts.map +0 -1
  77. package/dist/cjs/performance/scripts/index.js.map +0 -1
  78. package/dist/cjs/performance/scripts/make-graphql-request.d.ts +0 -29
  79. package/dist/cjs/performance/scripts/make-graphql-request.d.ts.map +0 -1
  80. package/dist/cjs/performance/scripts/make-graphql-request.js.map +0 -1
  81. package/dist/cjs/performance/scripts/run-inbox-outbox-scenario.d.ts +0 -97
  82. package/dist/cjs/performance/scripts/run-inbox-outbox-scenario.d.ts.map +0 -1
  83. package/dist/cjs/performance/scripts/run-inbox-outbox-scenario.js.map +0 -1
  84. package/dist/cjs/performance/scripts/run-scenario.d.ts.map +0 -1
  85. package/dist/cjs/performance/scripts/run-scenario.js.map +0 -1
  86. package/dist/cjs/performance/utils/colorize-text.d.ts.map +0 -1
  87. package/dist/cjs/performance/utils/colorize-text.js.map +0 -1
  88. package/dist/cjs/performance/utils/index.d.ts +0 -3
  89. package/dist/cjs/performance/utils/index.d.ts.map +0 -1
  90. package/dist/cjs/performance/utils/index.js.map +0 -1
  91. package/dist/cjs/performance/utils/report-generation.d.ts.map +0 -1
  92. package/dist/cjs/performance/utils/report-generation.js.map +0 -1
  93. package/dist/esm/index.d.ts +0 -2
  94. package/dist/esm/index.d.ts.map +0 -1
  95. package/dist/esm/index.js +0 -2
  96. package/dist/esm/index.js.map +0 -1
  97. package/dist/esm/package.json +0 -1
  98. package/dist/esm/performance/index.d.ts +0 -3
  99. package/dist/esm/performance/index.d.ts.map +0 -1
  100. package/dist/esm/performance/index.js +0 -3
  101. package/dist/esm/performance/index.js.map +0 -1
  102. package/dist/esm/performance/plugins/inbox-outbox-report-endpoint-plugin.d.ts +0 -22
  103. package/dist/esm/performance/plugins/inbox-outbox-report-endpoint-plugin.d.ts.map +0 -1
  104. package/dist/esm/performance/plugins/inbox-outbox-report-endpoint-plugin.js +0 -68
  105. package/dist/esm/performance/plugins/inbox-outbox-report-endpoint-plugin.js.map +0 -1
  106. package/dist/esm/performance/plugins/inbox-outbox-state-endpoint-plugin.d.ts +0 -23
  107. package/dist/esm/performance/plugins/inbox-outbox-state-endpoint-plugin.d.ts.map +0 -1
  108. package/dist/esm/performance/plugins/inbox-outbox-state-endpoint-plugin.js +0 -78
  109. package/dist/esm/performance/plugins/inbox-outbox-state-endpoint-plugin.js.map +0 -1
  110. package/dist/esm/performance/plugins/index.d.ts +0 -3
  111. package/dist/esm/performance/plugins/index.d.ts.map +0 -1
  112. package/dist/esm/performance/plugins/index.js.map +0 -1
  113. package/dist/esm/performance/scripts/index.d.ts +0 -4
  114. package/dist/esm/performance/scripts/index.d.ts.map +0 -1
  115. package/dist/esm/performance/scripts/index.js +0 -4
  116. package/dist/esm/performance/scripts/index.js.map +0 -1
  117. package/dist/esm/performance/scripts/make-graphql-request.d.ts.map +0 -1
  118. package/dist/esm/performance/scripts/make-graphql-request.js +0 -16
  119. package/dist/esm/performance/scripts/make-graphql-request.js.map +0 -1
  120. package/dist/esm/performance/scripts/run-inbox-outbox-scenario.d.ts.map +0 -1
  121. package/dist/esm/performance/scripts/run-inbox-outbox-scenario.js +0 -141
  122. package/dist/esm/performance/scripts/run-inbox-outbox-scenario.js.map +0 -1
  123. package/dist/esm/performance/scripts/run-scenario.d.ts +0 -54
  124. package/dist/esm/performance/scripts/run-scenario.d.ts.map +0 -1
  125. package/dist/esm/performance/scripts/run-scenario.js +0 -33
  126. package/dist/esm/performance/scripts/run-scenario.js.map +0 -1
  127. package/dist/esm/performance/utils/colorize-text.d.ts +0 -3
  128. package/dist/esm/performance/utils/colorize-text.d.ts.map +0 -1
  129. package/dist/esm/performance/utils/colorize-text.js +0 -3
  130. package/dist/esm/performance/utils/colorize-text.js.map +0 -1
  131. package/dist/esm/performance/utils/index.d.ts +0 -3
  132. package/dist/esm/performance/utils/index.d.ts.map +0 -1
  133. package/dist/esm/performance/utils/index.js +0 -3
  134. package/dist/esm/performance/utils/index.js.map +0 -1
  135. package/dist/esm/performance/utils/report-generation.d.ts +0 -14
  136. package/dist/esm/performance/utils/report-generation.d.ts.map +0 -1
  137. package/dist/esm/performance/utils/report-generation.js +0 -235
  138. package/dist/esm/performance/utils/report-generation.js.map +0 -1
  139. /package/dist/{cjs/performance → performance}/scripts/run-scenario.d.ts +0 -0
  140. /package/dist/{cjs/performance → performance}/utils/colorize-text.d.ts +0 -0
  141. /package/dist/{cjs/performance → performance}/utils/colorize-text.js +0 -0
@@ -1,235 +0,0 @@
1
- import { group } from '@axinom/mosaic-service-common';
2
- import { blue, red } from './colorize-text.js';
3
- const NA = 'N/A';
4
- const quartile = (arr, q) => {
5
- if (!arr.length) {
6
- return NA;
7
- }
8
- const sorted = [...arr].sort((a, b) => a - b);
9
- // Turn p into a decimal (e.g. 95 becomes 0.95)
10
- q = q / 100;
11
- // Work out the position in the array of the percentile point
12
- const p = (sorted.length - 1) * q;
13
- const b = Math.floor(p);
14
- // Work out what we rounded off (if anything)
15
- const remainder = p - b;
16
- // See whether that data exists directly
17
- if (sorted[b + 1] !== undefined) {
18
- return sorted[b] + remainder * (sorted[b + 1] - sorted[b]);
19
- }
20
- else {
21
- return sorted[b];
22
- }
23
- };
24
- const millisecondsToStr = (milliseconds) => {
25
- if (typeof milliseconds === 'string') {
26
- return milliseconds;
27
- }
28
- if (milliseconds === undefined) {
29
- return NA;
30
- }
31
- const seconds = milliseconds / 1000;
32
- const minutes = seconds / 60;
33
- const hours = minutes / 60;
34
- if (hours >= 1) {
35
- return hours.toFixed(2) + 'h';
36
- }
37
- if (minutes >= 1) {
38
- return minutes.toFixed(2) + 'm';
39
- }
40
- if (seconds >= 1) {
41
- return seconds.toFixed(2) + 's';
42
- }
43
- return milliseconds.toFixed(2) + 'ms';
44
- };
45
- const format = (value) => value === NA
46
- ? red(NA)
47
- : typeof value === 'number'
48
- ? blue(millisecondsToStr(value))
49
- : blue(value);
50
- const getMetrics = (source) => {
51
- const avg = source.length > 0 ? source.reduce((p, c) => p + c, 0) / source.length : NA;
52
- const min = source.length > 0 ? Math.min(...source) : NA;
53
- const max = source.length > 0 ? Math.max(...source) : NA;
54
- const med = source.length > 0 ? quartile(source, 50) : NA;
55
- const p90 = source.length > 0 ? quartile(source, 90) : NA;
56
- const p95 = source.length > 0 ? quartile(source, 95) : NA;
57
- return {
58
- avg,
59
- min,
60
- med,
61
- max,
62
- p90,
63
- p95,
64
- };
65
- };
66
- const getGeneralStats = (entries) => {
67
- const retriesGroups = group(entries.map((x) => x.started_attempts - 1));
68
- const retriesCounts = Object.keys(retriesGroups).reduce((accumulator, key) => {
69
- accumulator[key] = retriesGroups[key].length;
70
- return accumulator;
71
- }, {});
72
- const processedCount = entries.filter((x) => !!x.processed_at).length;
73
- const abandonedCount = entries.filter((x) => !!x.abandoned_at).length;
74
- return {
75
- messagesCount: entries.length,
76
- processedCount,
77
- abandonedCount,
78
- retriesCounts,
79
- };
80
- };
81
- const getStoredStats = (entries) => {
82
- const sorted = entries.sort((a, b) => a.created_at.localeCompare(b.created_at));
83
- const firstMessageStored = sorted[0].created_at;
84
- const lastMessageStored = sorted[sorted.length - 1].created_at;
85
- const totalTimeToStore = lastMessageStored !== firstMessageStored
86
- ? new Date(lastMessageStored).getTime() -
87
- new Date(firstMessageStored).getTime()
88
- : NA;
89
- const storedMeasures = [];
90
- sorted
91
- .map((x) => x.created_at)
92
- .reduce((previous, current) => {
93
- if (previous) {
94
- storedMeasures.push(new Date(current).getTime() - new Date(previous).getTime());
95
- }
96
- return current;
97
- }, undefined);
98
- const crossMessageStored = getMetrics(storedMeasures);
99
- const transitMeasures = sorted
100
- .filter((x) => !!x.sent_at)
101
- .map((x) => new Date(x.created_at).getTime() - new Date(x.sent_at).getTime());
102
- const perMessageTotal = getMetrics(transitMeasures);
103
- return {
104
- firstMessageStored,
105
- lastMessageStored,
106
- totalTimeToStore,
107
- crossMessageStored,
108
- perMessageTotal,
109
- };
110
- };
111
- const getProcessedStats = (entries) => {
112
- const processed = entries
113
- .filter((x) => !!x.processed_at)
114
- .sort((a, b) => a.processed_at.localeCompare(b.processed_at));
115
- const processedExist = processed.length > 0;
116
- const firstMessageProcessed = processedExist ? processed[0].processed_at : NA;
117
- const lastMessageProcessed = processedExist
118
- ? processed[processed.length - 1].processed_at
119
- : NA;
120
- const totalTimeToProcess = processedExist && firstMessageProcessed !== lastMessageProcessed
121
- ? new Date(lastMessageProcessed).getTime() -
122
- new Date(firstMessageProcessed).getTime()
123
- : NA;
124
- const processedMeasures = [];
125
- processed
126
- .map((x) => x.processed_at)
127
- .filter((x) => !!x)
128
- .reduce((previous, current) => {
129
- if (previous) {
130
- processedMeasures.push(new Date(current).getTime() - new Date(previous).getTime());
131
- }
132
- return current;
133
- }, undefined);
134
- const crossMessageProcessed = getMetrics(processedMeasures);
135
- const perMessageProcessedMeasures = processed.map((x) => new Date(x.processed_at).getTime() - new Date(x.created_at).getTime());
136
- const perMessageProcessed = getMetrics(perMessageProcessedMeasures);
137
- const abandoned = entries
138
- .filter((x) => !!x.abandoned_at)
139
- .sort((a, b) => a.abandoned_at.localeCompare(b.abandoned_at));
140
- const abandonedExist = abandoned.length > 0;
141
- const lastMessageAbandoned = abandonedExist
142
- ? abandoned[abandoned.length - 1].abandoned_at
143
- : NA;
144
- const sorted = entries.sort((a, b) => a.created_at.localeCompare(b.created_at));
145
- const firstMessageStored = sorted[0].created_at;
146
- const totalTimeToStoreAndFinish = processedExist || abandonedExist
147
- ? new Date(lastMessageProcessed !== NA && lastMessageAbandoned !== NA
148
- ? lastMessageProcessed > lastMessageAbandoned
149
- ? lastMessageProcessed
150
- : lastMessageAbandoned
151
- : lastMessageProcessed !== NA
152
- ? lastMessageProcessed
153
- : lastMessageAbandoned).getTime() - new Date(firstMessageStored).getTime()
154
- : NA;
155
- const perMessageTotalTimeMeasures = entries
156
- .filter((x) => !!x.sent_at && (!!x.processed_at || !!x.abandoned_at))
157
- .map((x) => new Date(x.processed_at ?? x.abandoned_at).getTime() -
158
- new Date(x.sent_at).getTime());
159
- const perMessageTotal = getMetrics(perMessageTotalTimeMeasures);
160
- return {
161
- firstMessageProcessed,
162
- lastMessageProcessed,
163
- totalTimeToProcess,
164
- crossMessageProcessed,
165
- perMessageProcessed,
166
- totalTimeToStoreAndFinish,
167
- perMessageTotal,
168
- };
169
- };
170
- export const getGeneralReport = (entries, testId) => {
171
- const { messagesCount, processedCount, abandonedCount, retriesCounts } = getGeneralStats(entries);
172
- return `- Test ID: ${blue(testId)}
173
- - Messages count: ${blue(messagesCount)}
174
- - Processed count: ${processedCount === messagesCount
175
- ? blue(processedCount)
176
- : red(processedCount)}
177
- - Abandoned count: ${abandonedCount > 0 ? red(abandonedCount) : blue(0)}
178
- - Retries count(s):
179
- ${Object.keys(retriesCounts)
180
- .map((key) => ` ${key}: ${blue(retriesCounts[key])} message(s)`)
181
- .join('\n')}`;
182
- };
183
- export const getStoredReport = (entries, table) => {
184
- const { firstMessageStored, lastMessageStored, totalTimeToStore, crossMessageStored, perMessageTotal, } = getStoredStats(entries);
185
- // metrics related to sent_at are only relevant for inbox, since envelope
186
- // timestamp is set only after outbox message is processed
187
- const totalMetrics = table === 'inbox'
188
- ? `
189
-
190
- - Stats for time differences between message being sent out and when it was received and stored:
191
- - avg=${format(perMessageTotal.avg)} min=${format(perMessageTotal.min)} med=${format(perMessageTotal.med)} max=${format(perMessageTotal.max)} p(90)=${format(perMessageTotal.p90)} p(95)=${format(perMessageTotal.p95)}`
192
- : '';
193
- return `- First message stored: ${format(firstMessageStored)}
194
- - Last message stored: ${format(lastMessageStored)}
195
- - Time to store all messages: ${format(totalTimeToStore)}
196
-
197
- - Stats for time differences between one message stored and next message stored:
198
- - avg=${format(crossMessageStored.avg)} min=${format(crossMessageStored.min)} med=${format(crossMessageStored.med)} max=${format(crossMessageStored.max)} p(90)=${format(crossMessageStored.p90)} p(95)=${format(crossMessageStored.p95)}${totalMetrics}`;
199
- };
200
- export const getProcessedReport = (entries, table) => {
201
- const { firstMessageProcessed, lastMessageProcessed, totalTimeToProcess, crossMessageProcessed, perMessageProcessed, totalTimeToStoreAndFinish, perMessageTotal, } = getProcessedStats(entries);
202
- // metrics related to sent_at are only relevant for inbox, since envelope
203
- // timestamp is set only after outbox message is processed
204
- const totalMetrics = table === 'inbox'
205
- ? `
206
-
207
- - Stats for time differences between message being sent out and when it finished processing or was abandoned:
208
- - avg=${format(perMessageTotal.avg)} min=${format(perMessageTotal.min)} med=${format(perMessageTotal.med)} max=${format(perMessageTotal.max)} p(90)=${format(perMessageTotal.p90)} p(95)=${format(perMessageTotal.p95)}`
209
- : '';
210
- return `- First message processed: ${format(firstMessageProcessed)}
211
- - Last message processed: ${format(lastMessageProcessed)}
212
- - Time to process all messages: ${format(totalTimeToProcess)}
213
- - Time to store and process or abandon all messages: ${format(totalTimeToStoreAndFinish)}
214
-
215
- - Stats for time differences between one message finished processing and next message finished processing:
216
- - avg=${format(crossMessageProcessed.avg)} min=${format(crossMessageProcessed.min)} med=${format(crossMessageProcessed.med)} max=${format(crossMessageProcessed.max)} p(90)=${format(crossMessageProcessed.p90)} p(95)=${format(crossMessageProcessed.p95)}
217
-
218
- - Stats for time differences between message being stored and when it finished processing:
219
- - avg=${format(perMessageProcessed.avg)} min=${format(perMessageProcessed.min)} med=${format(perMessageProcessed.med)} max=${format(perMessageProcessed.max)} p(90)=${format(perMessageProcessed.p90)} p(95)=${format(perMessageProcessed.p95)}${totalMetrics}`;
220
- };
221
- export const getReportRows = async (table, testId, ownerPool) => {
222
- const client = await ownerPool.connect();
223
- try {
224
- const testIdPath = table === 'inbox'
225
- ? `metadata->'messageContext'->>'testId'`
226
- : `metadata->'envelopeOverrides'->'message_context'->>'testId'`;
227
- const result = await client.query(`SELECT to_json(created_at)#>>'{}' as created_at, to_json(processed_at)#>>'{}' as processed_at, to_json(abandoned_at)#>>'{}' as abandoned_at, metadata->>'envelopeTimestamp' as sent_at, started_attempts FROM app_hidden.${table}
228
- WHERE ${testIdPath} = $1;`, [testId]);
229
- return result.rows;
230
- }
231
- finally {
232
- client.release();
233
- }
234
- };
235
- //# sourceMappingURL=report-generation.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"report-generation.js","sourceRoot":"","sources":["../../../../src/performance/utils/report-generation.ts"],"names":[],"mappings":"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"}