@trigger.dev/core 4.0.2 → 4.0.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.
- package/dist/commonjs/v3/errors.d.ts +1 -0
- package/dist/commonjs/v3/errors.js +35 -2
- package/dist/commonjs/v3/errors.js.map +1 -1
- package/dist/commonjs/v3/heartbeats/api.d.ts +14 -0
- package/dist/commonjs/v3/heartbeats/api.js +58 -0
- package/dist/commonjs/v3/heartbeats/api.js.map +1 -0
- package/dist/commonjs/v3/heartbeats/manager.d.ts +16 -0
- package/dist/commonjs/v3/heartbeats/manager.js +72 -0
- package/dist/commonjs/v3/heartbeats/manager.js.map +1 -0
- package/dist/commonjs/v3/heartbeats/types.d.ts +7 -0
- package/dist/commonjs/v3/heartbeats/types.js +3 -0
- package/dist/commonjs/v3/heartbeats/types.js.map +1 -0
- package/dist/commonjs/v3/heartbeats-api.d.ts +3 -0
- package/dist/commonjs/v3/heartbeats-api.js +9 -0
- package/dist/commonjs/v3/heartbeats-api.js.map +1 -0
- package/dist/commonjs/v3/index.d.ts +1 -0
- package/dist/commonjs/v3/index.js +1 -0
- package/dist/commonjs/v3/index.js.map +1 -1
- package/dist/commonjs/v3/links.d.ts +1 -0
- package/dist/commonjs/v3/links.js +1 -0
- package/dist/commonjs/v3/links.js.map +1 -1
- package/dist/commonjs/v3/runEngineWorker/index.d.ts +1 -0
- package/dist/commonjs/v3/runEngineWorker/index.js +1 -0
- package/dist/commonjs/v3/runEngineWorker/index.js.map +1 -1
- package/dist/commonjs/v3/runEngineWorker/supervisor/consumerPool.d.ts +71 -0
- package/dist/commonjs/v3/runEngineWorker/supervisor/consumerPool.js +316 -0
- package/dist/commonjs/v3/runEngineWorker/supervisor/consumerPool.js.map +1 -0
- package/dist/commonjs/v3/runEngineWorker/supervisor/consumerPool.test.d.ts +1 -0
- package/dist/commonjs/v3/runEngineWorker/supervisor/consumerPool.test.js +589 -0
- package/dist/commonjs/v3/runEngineWorker/supervisor/consumerPool.test.js.map +1 -0
- package/dist/commonjs/v3/runEngineWorker/supervisor/consumerPoolMetrics.d.ts +43 -0
- package/dist/commonjs/v3/runEngineWorker/supervisor/consumerPoolMetrics.js +131 -0
- package/dist/commonjs/v3/runEngineWorker/supervisor/consumerPoolMetrics.js.map +1 -0
- package/dist/commonjs/v3/runEngineWorker/supervisor/queueConsumer.d.ts +7 -4
- package/dist/commonjs/v3/runEngineWorker/supervisor/queueConsumer.js.map +1 -1
- package/dist/commonjs/v3/runEngineWorker/supervisor/queueMetricsProcessor.d.ts +76 -0
- package/dist/commonjs/v3/runEngineWorker/supervisor/queueMetricsProcessor.js +161 -0
- package/dist/commonjs/v3/runEngineWorker/supervisor/queueMetricsProcessor.js.map +1 -0
- package/dist/commonjs/v3/runEngineWorker/supervisor/queueMetricsProcessor.test.d.ts +1 -0
- package/dist/commonjs/v3/runEngineWorker/supervisor/queueMetricsProcessor.test.js +293 -0
- package/dist/commonjs/v3/runEngineWorker/supervisor/queueMetricsProcessor.test.js.map +1 -0
- package/dist/commonjs/v3/runEngineWorker/supervisor/scalingStrategies.d.ts +67 -0
- package/dist/commonjs/v3/runEngineWorker/supervisor/scalingStrategies.js +153 -0
- package/dist/commonjs/v3/runEngineWorker/supervisor/scalingStrategies.js.map +1 -0
- package/dist/commonjs/v3/runEngineWorker/supervisor/scalingStrategies.test.d.ts +1 -0
- package/dist/commonjs/v3/runEngineWorker/supervisor/scalingStrategies.test.js +235 -0
- package/dist/commonjs/v3/runEngineWorker/supervisor/scalingStrategies.test.js.map +1 -0
- package/dist/commonjs/v3/runEngineWorker/supervisor/session.d.ts +5 -2
- package/dist/commonjs/v3/runEngineWorker/supervisor/session.js +14 -8
- package/dist/commonjs/v3/runEngineWorker/supervisor/session.js.map +1 -1
- package/dist/commonjs/v3/runEngineWorker/workload/http.d.ts +80 -111
- package/dist/commonjs/v3/runEngineWorker/workload/http.js +36 -14
- package/dist/commonjs/v3/runEngineWorker/workload/http.js.map +1 -1
- package/dist/commonjs/v3/schemas/api.d.ts +139 -0
- package/dist/commonjs/v3/schemas/api.js +11 -3
- package/dist/commonjs/v3/schemas/api.js.map +1 -1
- package/dist/commonjs/v3/utils/globals.d.ts +2 -0
- package/dist/commonjs/v3/utils/globals.js.map +1 -1
- package/dist/commonjs/v3/utils/ioSerialization.d.ts +1 -0
- package/dist/commonjs/v3/utils/ioSerialization.js +92 -3
- package/dist/commonjs/v3/utils/ioSerialization.js.map +1 -1
- package/dist/commonjs/v3/workers/index.d.ts +1 -0
- package/dist/commonjs/v3/workers/index.js +3 -1
- package/dist/commonjs/v3/workers/index.js.map +1 -1
- package/dist/commonjs/version.js +1 -1
- package/dist/esm/v3/errors.d.ts +1 -0
- package/dist/esm/v3/errors.js +34 -2
- package/dist/esm/v3/errors.js.map +1 -1
- package/dist/esm/v3/heartbeats/api.d.ts +14 -0
- package/dist/esm/v3/heartbeats/api.js +54 -0
- package/dist/esm/v3/heartbeats/api.js.map +1 -0
- package/dist/esm/v3/heartbeats/manager.d.ts +16 -0
- package/dist/esm/v3/heartbeats/manager.js +68 -0
- package/dist/esm/v3/heartbeats/manager.js.map +1 -0
- package/dist/esm/v3/heartbeats/types.d.ts +7 -0
- package/dist/esm/v3/heartbeats/types.js +2 -0
- package/dist/esm/v3/heartbeats/types.js.map +1 -0
- package/dist/esm/v3/heartbeats-api.d.ts +3 -0
- package/dist/esm/v3/heartbeats-api.js +6 -0
- package/dist/esm/v3/heartbeats-api.js.map +1 -0
- package/dist/esm/v3/index.d.ts +1 -0
- package/dist/esm/v3/index.js +1 -0
- package/dist/esm/v3/index.js.map +1 -1
- package/dist/esm/v3/links.d.ts +1 -0
- package/dist/esm/v3/links.js +1 -0
- package/dist/esm/v3/links.js.map +1 -1
- package/dist/esm/v3/runEngineWorker/index.d.ts +1 -0
- package/dist/esm/v3/runEngineWorker/index.js +1 -0
- package/dist/esm/v3/runEngineWorker/index.js.map +1 -1
- package/dist/esm/v3/runEngineWorker/supervisor/consumerPool.d.ts +71 -0
- package/dist/esm/v3/runEngineWorker/supervisor/consumerPool.js +312 -0
- package/dist/esm/v3/runEngineWorker/supervisor/consumerPool.js.map +1 -0
- package/dist/esm/v3/runEngineWorker/supervisor/consumerPool.test.d.ts +1 -0
- package/dist/esm/v3/runEngineWorker/supervisor/consumerPool.test.js +587 -0
- package/dist/esm/v3/runEngineWorker/supervisor/consumerPool.test.js.map +1 -0
- package/dist/esm/v3/runEngineWorker/supervisor/consumerPoolMetrics.d.ts +43 -0
- package/dist/esm/v3/runEngineWorker/supervisor/consumerPoolMetrics.js +127 -0
- package/dist/esm/v3/runEngineWorker/supervisor/consumerPoolMetrics.js.map +1 -0
- package/dist/esm/v3/runEngineWorker/supervisor/queueConsumer.d.ts +7 -4
- package/dist/esm/v3/runEngineWorker/supervisor/queueConsumer.js.map +1 -1
- package/dist/esm/v3/runEngineWorker/supervisor/queueMetricsProcessor.d.ts +76 -0
- package/dist/esm/v3/runEngineWorker/supervisor/queueMetricsProcessor.js +157 -0
- package/dist/esm/v3/runEngineWorker/supervisor/queueMetricsProcessor.js.map +1 -0
- package/dist/esm/v3/runEngineWorker/supervisor/queueMetricsProcessor.test.d.ts +1 -0
- package/dist/esm/v3/runEngineWorker/supervisor/queueMetricsProcessor.test.js +291 -0
- package/dist/esm/v3/runEngineWorker/supervisor/queueMetricsProcessor.test.js.map +1 -0
- package/dist/esm/v3/runEngineWorker/supervisor/scalingStrategies.d.ts +67 -0
- package/dist/esm/v3/runEngineWorker/supervisor/scalingStrategies.js +146 -0
- package/dist/esm/v3/runEngineWorker/supervisor/scalingStrategies.js.map +1 -0
- package/dist/esm/v3/runEngineWorker/supervisor/scalingStrategies.test.d.ts +1 -0
- package/dist/esm/v3/runEngineWorker/supervisor/scalingStrategies.test.js +233 -0
- package/dist/esm/v3/runEngineWorker/supervisor/scalingStrategies.test.js.map +1 -0
- package/dist/esm/v3/runEngineWorker/supervisor/session.d.ts +5 -2
- package/dist/esm/v3/runEngineWorker/supervisor/session.js +14 -8
- package/dist/esm/v3/runEngineWorker/supervisor/session.js.map +1 -1
- package/dist/esm/v3/runEngineWorker/workload/http.d.ts +80 -111
- package/dist/esm/v3/runEngineWorker/workload/http.js +37 -15
- package/dist/esm/v3/runEngineWorker/workload/http.js.map +1 -1
- package/dist/esm/v3/schemas/api.d.ts +139 -0
- package/dist/esm/v3/schemas/api.js +8 -0
- package/dist/esm/v3/schemas/api.js.map +1 -1
- package/dist/esm/v3/utils/globals.d.ts +2 -0
- package/dist/esm/v3/utils/globals.js.map +1 -1
- package/dist/esm/v3/utils/ioSerialization.d.ts +1 -0
- package/dist/esm/v3/utils/ioSerialization.js +92 -3
- package/dist/esm/v3/utils/ioSerialization.js.map +1 -1
- package/dist/esm/v3/workers/index.d.ts +1 -0
- package/dist/esm/v3/workers/index.js +1 -0
- package/dist/esm/v3/workers/index.js.map +1 -1
- package/dist/esm/version.js +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,293 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const vitest_1 = require("vitest");
|
|
4
|
+
const queueMetricsProcessor_js_1 = require("./queueMetricsProcessor.js");
|
|
5
|
+
(0, vitest_1.describe)("QueueMetricsProcessor", () => {
|
|
6
|
+
let processor;
|
|
7
|
+
(0, vitest_1.beforeEach)(() => {
|
|
8
|
+
vitest_1.vi.useFakeTimers();
|
|
9
|
+
});
|
|
10
|
+
(0, vitest_1.afterEach)(() => {
|
|
11
|
+
vitest_1.vi.useRealTimers();
|
|
12
|
+
});
|
|
13
|
+
(0, vitest_1.describe)("Constructor validation", () => {
|
|
14
|
+
(0, vitest_1.it)("should throw error for invalid ewmaAlpha", () => {
|
|
15
|
+
(0, vitest_1.expect)(() => new queueMetricsProcessor_js_1.QueueMetricsProcessor({ ewmaAlpha: -0.1, batchWindowMs: 1000 })).toThrow("ewmaAlpha must be between 0 and 1");
|
|
16
|
+
(0, vitest_1.expect)(() => new queueMetricsProcessor_js_1.QueueMetricsProcessor({ ewmaAlpha: 1.1, batchWindowMs: 1000 })).toThrow("ewmaAlpha must be between 0 and 1");
|
|
17
|
+
});
|
|
18
|
+
(0, vitest_1.it)("should throw error for invalid batchWindowMs", () => {
|
|
19
|
+
(0, vitest_1.expect)(() => new queueMetricsProcessor_js_1.QueueMetricsProcessor({ ewmaAlpha: 0.3, batchWindowMs: 0 })).toThrow("batchWindowMs must be positive");
|
|
20
|
+
(0, vitest_1.expect)(() => new queueMetricsProcessor_js_1.QueueMetricsProcessor({ ewmaAlpha: 0.3, batchWindowMs: -100 })).toThrow("batchWindowMs must be positive");
|
|
21
|
+
});
|
|
22
|
+
(0, vitest_1.it)("should accept valid parameters", () => {
|
|
23
|
+
(0, vitest_1.expect)(() => new queueMetricsProcessor_js_1.QueueMetricsProcessor({ ewmaAlpha: 0, batchWindowMs: 1 })).not.toThrow();
|
|
24
|
+
(0, vitest_1.expect)(() => new queueMetricsProcessor_js_1.QueueMetricsProcessor({ ewmaAlpha: 1, batchWindowMs: 5000 })).not.toThrow();
|
|
25
|
+
});
|
|
26
|
+
});
|
|
27
|
+
(0, vitest_1.describe)("Sample collection", () => {
|
|
28
|
+
(0, vitest_1.beforeEach)(() => {
|
|
29
|
+
processor = new queueMetricsProcessor_js_1.QueueMetricsProcessor({ ewmaAlpha: 0.3, batchWindowMs: 1000 });
|
|
30
|
+
});
|
|
31
|
+
(0, vitest_1.it)("should collect samples without limit", () => {
|
|
32
|
+
for (let i = 0; i < 100; i++) {
|
|
33
|
+
processor.addSample(i);
|
|
34
|
+
}
|
|
35
|
+
(0, vitest_1.expect)(processor.getCurrentSampleCount()).toBe(100);
|
|
36
|
+
(0, vitest_1.expect)(processor.getCurrentSamples()).toHaveLength(100);
|
|
37
|
+
});
|
|
38
|
+
(0, vitest_1.it)("should throw error for negative queue lengths", () => {
|
|
39
|
+
(0, vitest_1.expect)(() => processor.addSample(-1)).toThrow("Queue length cannot be negative");
|
|
40
|
+
});
|
|
41
|
+
(0, vitest_1.it)("should accept zero queue length", () => {
|
|
42
|
+
(0, vitest_1.expect)(() => processor.addSample(0)).not.toThrow();
|
|
43
|
+
(0, vitest_1.expect)(processor.getCurrentSampleCount()).toBe(1);
|
|
44
|
+
});
|
|
45
|
+
(0, vitest_1.it)("should handle empty queue with all zero samples", () => {
|
|
46
|
+
processor.addSample(0);
|
|
47
|
+
processor.addSample(0);
|
|
48
|
+
processor.addSample(0);
|
|
49
|
+
const result = processor.processBatch();
|
|
50
|
+
(0, vitest_1.expect)(result).not.toBeNull();
|
|
51
|
+
(0, vitest_1.expect)(result.median).toBe(0);
|
|
52
|
+
(0, vitest_1.expect)(result.smoothedValue).toBe(0);
|
|
53
|
+
(0, vitest_1.expect)(processor.getSmoothedValue()).toBe(0);
|
|
54
|
+
});
|
|
55
|
+
(0, vitest_1.it)("should properly transition from zero to non-zero queue", () => {
|
|
56
|
+
// Start with empty queue
|
|
57
|
+
processor.addSample(0);
|
|
58
|
+
processor.addSample(0);
|
|
59
|
+
let result = processor.processBatch();
|
|
60
|
+
(0, vitest_1.expect)(result.median).toBe(0);
|
|
61
|
+
(0, vitest_1.expect)(result.smoothedValue).toBe(0);
|
|
62
|
+
// Queue starts filling
|
|
63
|
+
processor.addSample(10);
|
|
64
|
+
processor.addSample(15);
|
|
65
|
+
result = processor.processBatch();
|
|
66
|
+
(0, vitest_1.expect)(result.median).toBeGreaterThan(0);
|
|
67
|
+
// EWMA: 0.3 * median + 0.7 * 0
|
|
68
|
+
(0, vitest_1.expect)(result.smoothedValue).toBeGreaterThan(0);
|
|
69
|
+
});
|
|
70
|
+
(0, vitest_1.it)("should properly transition from non-zero to zero queue", () => {
|
|
71
|
+
// Start with non-empty queue
|
|
72
|
+
processor.addSample(10);
|
|
73
|
+
processor.addSample(15);
|
|
74
|
+
let result = processor.processBatch();
|
|
75
|
+
const initialSmoothed = result.smoothedValue;
|
|
76
|
+
(0, vitest_1.expect)(initialSmoothed).toBeGreaterThan(0);
|
|
77
|
+
// Queue becomes empty
|
|
78
|
+
processor.addSample(0);
|
|
79
|
+
processor.addSample(0);
|
|
80
|
+
processor.addSample(0);
|
|
81
|
+
result = processor.processBatch();
|
|
82
|
+
(0, vitest_1.expect)(result.median).toBe(0);
|
|
83
|
+
// EWMA should gradually decrease: 0.3 * 0 + 0.7 * initialSmoothed
|
|
84
|
+
(0, vitest_1.expect)(result.smoothedValue).toBe(0.7 * initialSmoothed);
|
|
85
|
+
});
|
|
86
|
+
});
|
|
87
|
+
(0, vitest_1.describe)("Batch processing timing", () => {
|
|
88
|
+
(0, vitest_1.beforeEach)(() => {
|
|
89
|
+
processor = new queueMetricsProcessor_js_1.QueueMetricsProcessor({ ewmaAlpha: 0.3, batchWindowMs: 1000 });
|
|
90
|
+
});
|
|
91
|
+
(0, vitest_1.it)("should not process batch before window expires", () => {
|
|
92
|
+
processor.addSample(10, 1000);
|
|
93
|
+
(0, vitest_1.expect)(processor.shouldProcessBatch(1500)).toBe(false); // 500ms later
|
|
94
|
+
(0, vitest_1.expect)(processor.shouldProcessBatch(1999)).toBe(false); // 999ms later
|
|
95
|
+
});
|
|
96
|
+
(0, vitest_1.it)("should process batch when window expires", () => {
|
|
97
|
+
processor.addSample(10, 1000);
|
|
98
|
+
(0, vitest_1.expect)(processor.shouldProcessBatch(2000)).toBe(true); // 1000ms later
|
|
99
|
+
(0, vitest_1.expect)(processor.shouldProcessBatch(2500)).toBe(true); // 1500ms later
|
|
100
|
+
});
|
|
101
|
+
(0, vitest_1.it)("should not process empty batch", () => {
|
|
102
|
+
(0, vitest_1.expect)(processor.shouldProcessBatch(5000)).toBe(false);
|
|
103
|
+
});
|
|
104
|
+
});
|
|
105
|
+
(0, vitest_1.describe)("EWMA calculation", () => {
|
|
106
|
+
(0, vitest_1.it)("should initialize with first value", () => {
|
|
107
|
+
processor = new queueMetricsProcessor_js_1.QueueMetricsProcessor({ ewmaAlpha: 0.3, batchWindowMs: 1000 });
|
|
108
|
+
processor.addSample(10);
|
|
109
|
+
const result = processor.processBatch();
|
|
110
|
+
(0, vitest_1.expect)(result).not.toBeNull();
|
|
111
|
+
(0, vitest_1.expect)(result.median).toBe(10);
|
|
112
|
+
(0, vitest_1.expect)(result.smoothedValue).toBe(10);
|
|
113
|
+
(0, vitest_1.expect)(processor.getSmoothedValue()).toBe(10);
|
|
114
|
+
});
|
|
115
|
+
(0, vitest_1.it)("should apply EWMA formula correctly", () => {
|
|
116
|
+
processor = new queueMetricsProcessor_js_1.QueueMetricsProcessor({ ewmaAlpha: 0.3, batchWindowMs: 1000 });
|
|
117
|
+
// First batch: smoothed = 10
|
|
118
|
+
processor.addSample(10);
|
|
119
|
+
processor.processBatch();
|
|
120
|
+
(0, vitest_1.expect)(processor.getSmoothedValue()).toBe(10);
|
|
121
|
+
// Second batch: smoothed = 0.3 * 20 + 0.7 * 10 = 6 + 7 = 13
|
|
122
|
+
processor.addSample(20);
|
|
123
|
+
processor.processBatch();
|
|
124
|
+
(0, vitest_1.expect)(processor.getSmoothedValue()).toBe(13);
|
|
125
|
+
// Third batch: smoothed = 0.3 * 5 + 0.7 * 13 = 1.5 + 9.1 = 10.6
|
|
126
|
+
processor.addSample(5);
|
|
127
|
+
processor.processBatch();
|
|
128
|
+
(0, vitest_1.expect)(processor.getSmoothedValue()).toBe(10.6);
|
|
129
|
+
});
|
|
130
|
+
(0, vitest_1.it)("should test different alpha values", () => {
|
|
131
|
+
// High alpha (0.8) - more responsive
|
|
132
|
+
const highAlphaProcessor = new queueMetricsProcessor_js_1.QueueMetricsProcessor({ ewmaAlpha: 0.8, batchWindowMs: 1000 });
|
|
133
|
+
highAlphaProcessor.addSample(10);
|
|
134
|
+
highAlphaProcessor.processBatch();
|
|
135
|
+
highAlphaProcessor.addSample(20);
|
|
136
|
+
highAlphaProcessor.processBatch();
|
|
137
|
+
// Low alpha (0.1) - more smoothing
|
|
138
|
+
const lowAlphaProcessor = new queueMetricsProcessor_js_1.QueueMetricsProcessor({ ewmaAlpha: 0.1, batchWindowMs: 1000 });
|
|
139
|
+
lowAlphaProcessor.addSample(10);
|
|
140
|
+
lowAlphaProcessor.processBatch();
|
|
141
|
+
lowAlphaProcessor.addSample(20);
|
|
142
|
+
lowAlphaProcessor.processBatch();
|
|
143
|
+
// High alpha should be closer to recent value (20)
|
|
144
|
+
(0, vitest_1.expect)(highAlphaProcessor.getSmoothedValue()).toBeCloseTo(18); // 0.8 * 20 + 0.2 * 10 = 18
|
|
145
|
+
// Low alpha should be closer to previous value (10)
|
|
146
|
+
(0, vitest_1.expect)(lowAlphaProcessor.getSmoothedValue()).toBeCloseTo(11); // 0.1 * 20 + 0.9 * 10 = 11
|
|
147
|
+
});
|
|
148
|
+
});
|
|
149
|
+
(0, vitest_1.describe)("Median filtering", () => {
|
|
150
|
+
(0, vitest_1.beforeEach)(() => {
|
|
151
|
+
processor = new queueMetricsProcessor_js_1.QueueMetricsProcessor({ ewmaAlpha: 0.3, batchWindowMs: 1000 });
|
|
152
|
+
});
|
|
153
|
+
(0, vitest_1.it)("should calculate median of single sample", () => {
|
|
154
|
+
processor.addSample(42);
|
|
155
|
+
const result = processor.processBatch();
|
|
156
|
+
(0, vitest_1.expect)(result.median).toBe(42);
|
|
157
|
+
(0, vitest_1.expect)(result.sampleCount).toBe(1);
|
|
158
|
+
(0, vitest_1.expect)(result.smoothedValue).toBe(42); // First batch initializes to median
|
|
159
|
+
});
|
|
160
|
+
(0, vitest_1.it)("should calculate median of odd number of samples", () => {
|
|
161
|
+
processor.addSample(1);
|
|
162
|
+
processor.addSample(10);
|
|
163
|
+
processor.addSample(5);
|
|
164
|
+
const result = processor.processBatch();
|
|
165
|
+
(0, vitest_1.expect)(result.median).toBe(5);
|
|
166
|
+
});
|
|
167
|
+
(0, vitest_1.it)("should calculate median of even number of samples", () => {
|
|
168
|
+
processor.addSample(1);
|
|
169
|
+
processor.addSample(10);
|
|
170
|
+
processor.addSample(5);
|
|
171
|
+
processor.addSample(8);
|
|
172
|
+
const result = processor.processBatch();
|
|
173
|
+
// With even count, we average the two middle values
|
|
174
|
+
// Sorted: [1, 5, 8, 10], median = (5 + 8) / 2 = 6.5
|
|
175
|
+
(0, vitest_1.expect)(result.median).toBe(6.5);
|
|
176
|
+
});
|
|
177
|
+
(0, vitest_1.it)("should filter outliers using median", () => {
|
|
178
|
+
// Add mostly low values with one outlier
|
|
179
|
+
processor.addSample(5);
|
|
180
|
+
processor.addSample(5);
|
|
181
|
+
processor.addSample(5);
|
|
182
|
+
processor.addSample(100); // outlier
|
|
183
|
+
processor.addSample(5);
|
|
184
|
+
const result = processor.processBatch();
|
|
185
|
+
// Sorted: [5, 5, 5, 5, 100], median = 5 (filters out outlier)
|
|
186
|
+
(0, vitest_1.expect)(result.median).toBe(5);
|
|
187
|
+
});
|
|
188
|
+
});
|
|
189
|
+
(0, vitest_1.describe)("Batch result", () => {
|
|
190
|
+
(0, vitest_1.beforeEach)(() => {
|
|
191
|
+
processor = new queueMetricsProcessor_js_1.QueueMetricsProcessor({ ewmaAlpha: 0.3, batchWindowMs: 1000 });
|
|
192
|
+
});
|
|
193
|
+
(0, vitest_1.it)("should return comprehensive batch result", () => {
|
|
194
|
+
processor.addSample(10);
|
|
195
|
+
processor.addSample(20);
|
|
196
|
+
processor.addSample(15);
|
|
197
|
+
const result = processor.processBatch();
|
|
198
|
+
(0, vitest_1.expect)(result).not.toBeNull();
|
|
199
|
+
(0, vitest_1.expect)(result.median).toBe(15);
|
|
200
|
+
(0, vitest_1.expect)(result.smoothedValue).toBe(15); // First batch
|
|
201
|
+
(0, vitest_1.expect)(result.sampleCount).toBe(3);
|
|
202
|
+
(0, vitest_1.expect)(result.samples).toEqual([10, 20, 15]);
|
|
203
|
+
});
|
|
204
|
+
(0, vitest_1.it)("should return null for empty batch", () => {
|
|
205
|
+
const result = processor.processBatch();
|
|
206
|
+
(0, vitest_1.expect)(result).toBeNull();
|
|
207
|
+
});
|
|
208
|
+
(0, vitest_1.it)("should clear samples after processing", () => {
|
|
209
|
+
processor.addSample(10);
|
|
210
|
+
processor.addSample(20);
|
|
211
|
+
(0, vitest_1.expect)(processor.getCurrentSampleCount()).toBe(2);
|
|
212
|
+
processor.processBatch();
|
|
213
|
+
(0, vitest_1.expect)(processor.getCurrentSampleCount()).toBe(0);
|
|
214
|
+
(0, vitest_1.expect)(processor.getCurrentSamples()).toHaveLength(0);
|
|
215
|
+
});
|
|
216
|
+
});
|
|
217
|
+
(0, vitest_1.describe)("Reset functionality", () => {
|
|
218
|
+
(0, vitest_1.beforeEach)(() => {
|
|
219
|
+
processor = new queueMetricsProcessor_js_1.QueueMetricsProcessor({ ewmaAlpha: 0.3, batchWindowMs: 1000 });
|
|
220
|
+
});
|
|
221
|
+
(0, vitest_1.it)("should reset all state", () => {
|
|
222
|
+
processor.addSample(10);
|
|
223
|
+
processor.processBatch();
|
|
224
|
+
processor.addSample(20);
|
|
225
|
+
(0, vitest_1.expect)(processor.getSmoothedValue()).toBe(10);
|
|
226
|
+
(0, vitest_1.expect)(processor.getCurrentSampleCount()).toBe(1);
|
|
227
|
+
processor.reset();
|
|
228
|
+
(0, vitest_1.expect)(processor.getSmoothedValue()).toBe(0);
|
|
229
|
+
(0, vitest_1.expect)(processor.getCurrentSampleCount()).toBe(0);
|
|
230
|
+
(0, vitest_1.expect)(processor.getCurrentSamples()).toHaveLength(0);
|
|
231
|
+
});
|
|
232
|
+
(0, vitest_1.it)("should reinitialize correctly after reset", () => {
|
|
233
|
+
// Process some data
|
|
234
|
+
processor.addSample(10);
|
|
235
|
+
processor.processBatch();
|
|
236
|
+
processor.addSample(20);
|
|
237
|
+
processor.processBatch();
|
|
238
|
+
processor.reset();
|
|
239
|
+
// Should initialize with first value again
|
|
240
|
+
processor.addSample(30);
|
|
241
|
+
const result = processor.processBatch();
|
|
242
|
+
(0, vitest_1.expect)(result.smoothedValue).toBe(30);
|
|
243
|
+
(0, vitest_1.expect)(processor.getSmoothedValue()).toBe(30);
|
|
244
|
+
});
|
|
245
|
+
});
|
|
246
|
+
(0, vitest_1.describe)("Configuration", () => {
|
|
247
|
+
(0, vitest_1.it)("should return configuration", () => {
|
|
248
|
+
processor = new queueMetricsProcessor_js_1.QueueMetricsProcessor({ ewmaAlpha: 0.5, batchWindowMs: 2000 });
|
|
249
|
+
const config = processor.getConfig();
|
|
250
|
+
(0, vitest_1.expect)(config.ewmaAlpha).toBe(0.5);
|
|
251
|
+
(0, vitest_1.expect)(config.batchWindowMs).toBe(2000);
|
|
252
|
+
});
|
|
253
|
+
});
|
|
254
|
+
(0, vitest_1.describe)("Real-world simulation", () => {
|
|
255
|
+
(0, vitest_1.it)("should handle high-frequency samples from multiple consumers", () => {
|
|
256
|
+
processor = new queueMetricsProcessor_js_1.QueueMetricsProcessor({ ewmaAlpha: 0.3, batchWindowMs: 1000 });
|
|
257
|
+
// Simulate 40 consumers reporting queue lengths within 1 second
|
|
258
|
+
const baseTime = 1000;
|
|
259
|
+
for (let i = 0; i < 40; i++) {
|
|
260
|
+
const queueLength = 100 - i * 2; // Queue decreasing as consumers work
|
|
261
|
+
processor.addSample(queueLength, baseTime + i * 25); // Spread over 1 second
|
|
262
|
+
}
|
|
263
|
+
const result = processor.processBatch(baseTime + 1000);
|
|
264
|
+
(0, vitest_1.expect)(result).not.toBeNull();
|
|
265
|
+
(0, vitest_1.expect)(result.sampleCount).toBe(40);
|
|
266
|
+
// Median should be around middle values (queue lengths 60-80)
|
|
267
|
+
(0, vitest_1.expect)(result.median).toBeGreaterThanOrEqual(60);
|
|
268
|
+
(0, vitest_1.expect)(result.median).toBeLessThanOrEqual(80);
|
|
269
|
+
});
|
|
270
|
+
(0, vitest_1.it)("should demonstrate EWMA smoothing over time", () => {
|
|
271
|
+
processor = new queueMetricsProcessor_js_1.QueueMetricsProcessor({ ewmaAlpha: 0.3, batchWindowMs: 1000 });
|
|
272
|
+
const results = [];
|
|
273
|
+
// Simulate queue spike and recovery
|
|
274
|
+
const scenarios = [
|
|
275
|
+
{ samples: [5, 5, 5], expected: 5 }, // Baseline
|
|
276
|
+
{ samples: [50, 50, 50], expected: 18.5 }, // Spike: 0.3 * 50 + 0.7 * 5 = 18.5
|
|
277
|
+
{ samples: [5, 5, 5], expected: 10.05 }, // Recovery: 0.3 * 5 + 0.7 * 18.5 = 14.45
|
|
278
|
+
];
|
|
279
|
+
for (const scenario of scenarios) {
|
|
280
|
+
for (const sample of scenario.samples) {
|
|
281
|
+
processor.addSample(sample);
|
|
282
|
+
}
|
|
283
|
+
const result = processor.processBatch();
|
|
284
|
+
results.push(result.smoothedValue);
|
|
285
|
+
}
|
|
286
|
+
// Should show gradual change due to EWMA smoothing
|
|
287
|
+
(0, vitest_1.expect)(results[0]).toBe(5); // Initial
|
|
288
|
+
(0, vitest_1.expect)(results[1]).toBeCloseTo(18.5); // Spike response
|
|
289
|
+
(0, vitest_1.expect)(results[2]).toBeCloseTo(14.45); // Gradual recovery
|
|
290
|
+
});
|
|
291
|
+
});
|
|
292
|
+
});
|
|
293
|
+
//# sourceMappingURL=queueMetricsProcessor.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"queueMetricsProcessor.test.js","sourceRoot":"","sources":["../../../../../src/v3/runEngineWorker/supervisor/queueMetricsProcessor.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { QueueMetricsProcessor } from "./queueMetricsProcessor.js";
|
|
2
|
+
export type ScalingStrategyKind = "none" | "smooth" | "aggressive";
|
|
3
|
+
export interface ScalingStrategyOptions {
|
|
4
|
+
metricsProcessor?: QueueMetricsProcessor;
|
|
5
|
+
dampingFactor?: number;
|
|
6
|
+
minConsumerCount: number;
|
|
7
|
+
maxConsumerCount: number;
|
|
8
|
+
targetRatio: number;
|
|
9
|
+
}
|
|
10
|
+
export declare abstract class ScalingStrategy {
|
|
11
|
+
abstract readonly name: string;
|
|
12
|
+
private readonly minConsumerCount;
|
|
13
|
+
private readonly maxConsumerCount;
|
|
14
|
+
protected readonly targetRatio: number;
|
|
15
|
+
constructor(options?: ScalingStrategyOptions);
|
|
16
|
+
/**
|
|
17
|
+
* Calculates the target consumer count with clamping to min/max bounds
|
|
18
|
+
* Uses template method pattern to ensure consistent clamping across all strategies
|
|
19
|
+
*/
|
|
20
|
+
calculateTargetCount(currentCount: number): number;
|
|
21
|
+
/**
|
|
22
|
+
* Internal method for subclasses to implement their specific scaling logic
|
|
23
|
+
* Should return the unclamped target count
|
|
24
|
+
*/
|
|
25
|
+
protected abstract calculateTargetCountInternal(currentCount: number): number;
|
|
26
|
+
/**
|
|
27
|
+
* Creates a scaling strategy by name
|
|
28
|
+
*/
|
|
29
|
+
static create(strategy: ScalingStrategyKind, options?: ScalingStrategyOptions): ScalingStrategy;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Static scaling strategy - maintains a fixed number of consumers
|
|
33
|
+
*/
|
|
34
|
+
export declare class NoneScalingStrategy extends ScalingStrategy {
|
|
35
|
+
readonly name = "none";
|
|
36
|
+
constructor(options?: ScalingStrategyOptions);
|
|
37
|
+
protected calculateTargetCountInternal(currentCount: number): number;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Smooth scaling strategy with EWMA smoothing and damping
|
|
41
|
+
* Uses exponentially weighted moving average for queue length smoothing
|
|
42
|
+
* and applies damping to prevent rapid oscillations.
|
|
43
|
+
*/
|
|
44
|
+
export declare class SmoothScalingStrategy extends ScalingStrategy {
|
|
45
|
+
readonly name = "smooth";
|
|
46
|
+
private readonly dampingFactor;
|
|
47
|
+
private readonly metricsProcessor;
|
|
48
|
+
constructor(options?: ScalingStrategyOptions);
|
|
49
|
+
protected calculateTargetCountInternal(currentCount: number): number;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Aggressive scaling strategy with threshold-based zones
|
|
53
|
+
* Uses threshold-based zones for different scaling behaviors.
|
|
54
|
+
* Scales up quickly when load increases but scales down cautiously.
|
|
55
|
+
*/
|
|
56
|
+
export declare class AggressiveScalingStrategy extends ScalingStrategy {
|
|
57
|
+
readonly name = "aggressive";
|
|
58
|
+
private readonly metricsProcessor;
|
|
59
|
+
constructor(options?: ScalingStrategyOptions);
|
|
60
|
+
protected calculateTargetCountInternal(currentCount: number): number;
|
|
61
|
+
getThresholds(targetRatio: number): {
|
|
62
|
+
scaleDownThreshold: number;
|
|
63
|
+
scaleUpThreshold: number;
|
|
64
|
+
criticalThreshold: number;
|
|
65
|
+
highThreshold: number;
|
|
66
|
+
};
|
|
67
|
+
}
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.AggressiveScalingStrategy = exports.SmoothScalingStrategy = exports.NoneScalingStrategy = exports.ScalingStrategy = void 0;
|
|
4
|
+
class ScalingStrategy {
|
|
5
|
+
minConsumerCount;
|
|
6
|
+
maxConsumerCount;
|
|
7
|
+
targetRatio;
|
|
8
|
+
constructor(options) {
|
|
9
|
+
this.minConsumerCount = options?.minConsumerCount ?? 1;
|
|
10
|
+
this.maxConsumerCount = options?.maxConsumerCount ?? 10;
|
|
11
|
+
this.targetRatio = options?.targetRatio ?? 1;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Calculates the target consumer count with clamping to min/max bounds
|
|
15
|
+
* Uses template method pattern to ensure consistent clamping across all strategies
|
|
16
|
+
*/
|
|
17
|
+
calculateTargetCount(currentCount) {
|
|
18
|
+
const targetCount = this.calculateTargetCountInternal(currentCount);
|
|
19
|
+
// Apply consistent clamping to all strategies
|
|
20
|
+
return Math.min(Math.max(targetCount, this.minConsumerCount), this.maxConsumerCount);
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Creates a scaling strategy by name
|
|
24
|
+
*/
|
|
25
|
+
static create(strategy, options) {
|
|
26
|
+
switch (strategy) {
|
|
27
|
+
case "none":
|
|
28
|
+
return new NoneScalingStrategy(options);
|
|
29
|
+
case "smooth":
|
|
30
|
+
return new SmoothScalingStrategy(options);
|
|
31
|
+
case "aggressive":
|
|
32
|
+
return new AggressiveScalingStrategy(options);
|
|
33
|
+
default:
|
|
34
|
+
throw new Error(`Unknown scaling strategy: ${strategy}`);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
exports.ScalingStrategy = ScalingStrategy;
|
|
39
|
+
/**
|
|
40
|
+
* Static scaling strategy - maintains a fixed number of consumers
|
|
41
|
+
*/
|
|
42
|
+
class NoneScalingStrategy extends ScalingStrategy {
|
|
43
|
+
name = "none";
|
|
44
|
+
constructor(options) {
|
|
45
|
+
super(options);
|
|
46
|
+
}
|
|
47
|
+
calculateTargetCountInternal(currentCount) {
|
|
48
|
+
return currentCount;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
exports.NoneScalingStrategy = NoneScalingStrategy;
|
|
52
|
+
/**
|
|
53
|
+
* Smooth scaling strategy with EWMA smoothing and damping
|
|
54
|
+
* Uses exponentially weighted moving average for queue length smoothing
|
|
55
|
+
* and applies damping to prevent rapid oscillations.
|
|
56
|
+
*/
|
|
57
|
+
class SmoothScalingStrategy extends ScalingStrategy {
|
|
58
|
+
name = "smooth";
|
|
59
|
+
dampingFactor;
|
|
60
|
+
metricsProcessor;
|
|
61
|
+
constructor(options) {
|
|
62
|
+
super(options);
|
|
63
|
+
const dampingFactor = options?.dampingFactor ?? 0.7;
|
|
64
|
+
if (dampingFactor < 0 || dampingFactor > 1) {
|
|
65
|
+
throw new Error("dampingFactor must be between 0 and 1");
|
|
66
|
+
}
|
|
67
|
+
if (!options?.metricsProcessor) {
|
|
68
|
+
throw new Error("metricsProcessor is required for smooth scaling strategy");
|
|
69
|
+
}
|
|
70
|
+
this.dampingFactor = dampingFactor;
|
|
71
|
+
this.metricsProcessor = options.metricsProcessor;
|
|
72
|
+
}
|
|
73
|
+
calculateTargetCountInternal(currentCount) {
|
|
74
|
+
const smoothedQueueLength = this.metricsProcessor.getSmoothedValue();
|
|
75
|
+
// Calculate target consumers based on the configured ratio
|
|
76
|
+
const targetConsumers = Math.ceil(smoothedQueueLength / this.targetRatio);
|
|
77
|
+
// Apply damping factor to smooth out changes
|
|
78
|
+
// This prevents oscillation by only moving toward the target gradually
|
|
79
|
+
const dampedTarget = currentCount + (targetConsumers - currentCount) * this.dampingFactor;
|
|
80
|
+
// Return rounded value without clamping (handled by base class)
|
|
81
|
+
return Math.round(dampedTarget);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
exports.SmoothScalingStrategy = SmoothScalingStrategy;
|
|
85
|
+
/**
|
|
86
|
+
* Aggressive scaling strategy with threshold-based zones
|
|
87
|
+
* Uses threshold-based zones for different scaling behaviors.
|
|
88
|
+
* Scales up quickly when load increases but scales down cautiously.
|
|
89
|
+
*/
|
|
90
|
+
class AggressiveScalingStrategy extends ScalingStrategy {
|
|
91
|
+
name = "aggressive";
|
|
92
|
+
metricsProcessor;
|
|
93
|
+
constructor(options) {
|
|
94
|
+
super(options);
|
|
95
|
+
if (!options?.metricsProcessor) {
|
|
96
|
+
throw new Error("metricsProcessor is required for aggressive scaling strategy");
|
|
97
|
+
}
|
|
98
|
+
this.metricsProcessor = options.metricsProcessor;
|
|
99
|
+
}
|
|
100
|
+
calculateTargetCountInternal(currentCount) {
|
|
101
|
+
const smoothedQueueLength = this.metricsProcessor.getSmoothedValue();
|
|
102
|
+
// Calculate queue items per consumer,
|
|
103
|
+
const queuePerConsumer = smoothedQueueLength / (currentCount || 1);
|
|
104
|
+
// Define zones based on targetRatio
|
|
105
|
+
// Optimal zone: 0.5x to 2x the target ratio
|
|
106
|
+
const scaleDownThreshold = this.targetRatio * 0.5;
|
|
107
|
+
const scaleUpThreshold = this.targetRatio * 2.0;
|
|
108
|
+
if (queuePerConsumer < scaleDownThreshold) {
|
|
109
|
+
// Zone 1: Under-utilized (< 0.5x target ratio)
|
|
110
|
+
// Scale down gradually to avoid removing too many consumers
|
|
111
|
+
const reductionFactor = Math.max(0.9, 1 - (scaleDownThreshold - queuePerConsumer) * 0.1);
|
|
112
|
+
// Return without min clamping (handled by base class)
|
|
113
|
+
return Math.floor(currentCount * reductionFactor);
|
|
114
|
+
}
|
|
115
|
+
else if (queuePerConsumer > scaleUpThreshold) {
|
|
116
|
+
// Zone 3: Over-utilized (> 2x target ratio)
|
|
117
|
+
// Scale up aggressively based on queue pressure
|
|
118
|
+
let scaleFactor;
|
|
119
|
+
if (queuePerConsumer >= this.targetRatio * 5) {
|
|
120
|
+
// Critical: Queue is 5x target ratio or higher
|
|
121
|
+
scaleFactor = 1.5; // 50% increase
|
|
122
|
+
}
|
|
123
|
+
else if (queuePerConsumer >= this.targetRatio * 3) {
|
|
124
|
+
// High: Queue is 3x target ratio
|
|
125
|
+
scaleFactor = 1.3; // 30% increase
|
|
126
|
+
}
|
|
127
|
+
else {
|
|
128
|
+
// Moderate: Queue is 2x target ratio
|
|
129
|
+
scaleFactor = 1.1; // 10% increase
|
|
130
|
+
}
|
|
131
|
+
const targetCount = Math.ceil(currentCount * scaleFactor);
|
|
132
|
+
// Cap increase at 50% to prevent overshooting
|
|
133
|
+
const maxIncrement = Math.ceil(currentCount * 0.5);
|
|
134
|
+
// Return without max clamping (handled by base class)
|
|
135
|
+
return Math.min(currentCount + maxIncrement, targetCount);
|
|
136
|
+
}
|
|
137
|
+
else {
|
|
138
|
+
// Zone 2: Optimal (0.5x - 2x target ratio)
|
|
139
|
+
// Maintain current consumer count
|
|
140
|
+
return currentCount;
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
getThresholds(targetRatio) {
|
|
144
|
+
return {
|
|
145
|
+
scaleDownThreshold: targetRatio * 0.5,
|
|
146
|
+
scaleUpThreshold: targetRatio * 2.0,
|
|
147
|
+
criticalThreshold: targetRatio * 5.0,
|
|
148
|
+
highThreshold: targetRatio * 3.0,
|
|
149
|
+
};
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
exports.AggressiveScalingStrategy = AggressiveScalingStrategy;
|
|
153
|
+
//# sourceMappingURL=scalingStrategies.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scalingStrategies.js","sourceRoot":"","sources":["../../../../../src/v3/runEngineWorker/supervisor/scalingStrategies.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|