@trigger.dev/core 4.0.1 → 4.0.3

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 (145) hide show
  1. package/dist/commonjs/v3/errors.d.ts +1 -0
  2. package/dist/commonjs/v3/errors.js +35 -2
  3. package/dist/commonjs/v3/errors.js.map +1 -1
  4. package/dist/commonjs/v3/heartbeats/api.d.ts +14 -0
  5. package/dist/commonjs/v3/heartbeats/api.js +58 -0
  6. package/dist/commonjs/v3/heartbeats/api.js.map +1 -0
  7. package/dist/commonjs/v3/heartbeats/manager.d.ts +16 -0
  8. package/dist/commonjs/v3/heartbeats/manager.js +72 -0
  9. package/dist/commonjs/v3/heartbeats/manager.js.map +1 -0
  10. package/dist/commonjs/v3/heartbeats/types.d.ts +7 -0
  11. package/dist/commonjs/v3/heartbeats/types.js +3 -0
  12. package/dist/commonjs/v3/heartbeats/types.js.map +1 -0
  13. package/dist/commonjs/v3/heartbeats-api.d.ts +3 -0
  14. package/dist/commonjs/v3/heartbeats-api.js +9 -0
  15. package/dist/commonjs/v3/heartbeats-api.js.map +1 -0
  16. package/dist/commonjs/v3/index.d.ts +1 -0
  17. package/dist/commonjs/v3/index.js +1 -0
  18. package/dist/commonjs/v3/index.js.map +1 -1
  19. package/dist/commonjs/v3/links.d.ts +1 -0
  20. package/dist/commonjs/v3/links.js +1 -0
  21. package/dist/commonjs/v3/links.js.map +1 -1
  22. package/dist/commonjs/v3/runEngineWorker/index.d.ts +1 -0
  23. package/dist/commonjs/v3/runEngineWorker/index.js +1 -0
  24. package/dist/commonjs/v3/runEngineWorker/index.js.map +1 -1
  25. package/dist/commonjs/v3/runEngineWorker/supervisor/consumerPool.d.ts +71 -0
  26. package/dist/commonjs/v3/runEngineWorker/supervisor/consumerPool.js +316 -0
  27. package/dist/commonjs/v3/runEngineWorker/supervisor/consumerPool.js.map +1 -0
  28. package/dist/commonjs/v3/runEngineWorker/supervisor/consumerPool.test.d.ts +1 -0
  29. package/dist/commonjs/v3/runEngineWorker/supervisor/consumerPool.test.js +589 -0
  30. package/dist/commonjs/v3/runEngineWorker/supervisor/consumerPool.test.js.map +1 -0
  31. package/dist/commonjs/v3/runEngineWorker/supervisor/consumerPoolMetrics.d.ts +43 -0
  32. package/dist/commonjs/v3/runEngineWorker/supervisor/consumerPoolMetrics.js +131 -0
  33. package/dist/commonjs/v3/runEngineWorker/supervisor/consumerPoolMetrics.js.map +1 -0
  34. package/dist/commonjs/v3/runEngineWorker/supervisor/http.d.ts +2 -0
  35. package/dist/commonjs/v3/runEngineWorker/supervisor/queueConsumer.d.ts +7 -4
  36. package/dist/commonjs/v3/runEngineWorker/supervisor/queueConsumer.js.map +1 -1
  37. package/dist/commonjs/v3/runEngineWorker/supervisor/queueMetricsProcessor.d.ts +76 -0
  38. package/dist/commonjs/v3/runEngineWorker/supervisor/queueMetricsProcessor.js +161 -0
  39. package/dist/commonjs/v3/runEngineWorker/supervisor/queueMetricsProcessor.js.map +1 -0
  40. package/dist/commonjs/v3/runEngineWorker/supervisor/queueMetricsProcessor.test.d.ts +1 -0
  41. package/dist/commonjs/v3/runEngineWorker/supervisor/queueMetricsProcessor.test.js +293 -0
  42. package/dist/commonjs/v3/runEngineWorker/supervisor/queueMetricsProcessor.test.js.map +1 -0
  43. package/dist/commonjs/v3/runEngineWorker/supervisor/scalingStrategies.d.ts +67 -0
  44. package/dist/commonjs/v3/runEngineWorker/supervisor/scalingStrategies.js +153 -0
  45. package/dist/commonjs/v3/runEngineWorker/supervisor/scalingStrategies.js.map +1 -0
  46. package/dist/commonjs/v3/runEngineWorker/supervisor/scalingStrategies.test.d.ts +1 -0
  47. package/dist/commonjs/v3/runEngineWorker/supervisor/scalingStrategies.test.js +235 -0
  48. package/dist/commonjs/v3/runEngineWorker/supervisor/scalingStrategies.test.js.map +1 -0
  49. package/dist/commonjs/v3/runEngineWorker/supervisor/schemas.d.ts +6 -0
  50. package/dist/commonjs/v3/runEngineWorker/supervisor/session.d.ts +5 -2
  51. package/dist/commonjs/v3/runEngineWorker/supervisor/session.js +14 -8
  52. package/dist/commonjs/v3/runEngineWorker/supervisor/session.js.map +1 -1
  53. package/dist/commonjs/v3/runEngineWorker/workload/http.d.ts +81 -111
  54. package/dist/commonjs/v3/runEngineWorker/workload/http.js +36 -14
  55. package/dist/commonjs/v3/runEngineWorker/workload/http.js.map +1 -1
  56. package/dist/commonjs/v3/runEngineWorker/workload/schemas.d.ts +3 -0
  57. package/dist/commonjs/v3/schemas/api.d.ts +144 -0
  58. package/dist/commonjs/v3/schemas/api.js +11 -3
  59. package/dist/commonjs/v3/schemas/api.js.map +1 -1
  60. package/dist/commonjs/v3/schemas/checkpoints.d.ts +3 -0
  61. package/dist/commonjs/v3/schemas/runEngine.d.ts +3 -0
  62. package/dist/commonjs/v3/schemas/runEngine.js +1 -0
  63. package/dist/commonjs/v3/schemas/runEngine.js.map +1 -1
  64. package/dist/commonjs/v3/utils/globals.d.ts +2 -0
  65. package/dist/commonjs/v3/utils/globals.js.map +1 -1
  66. package/dist/commonjs/v3/utils/ioSerialization.d.ts +1 -0
  67. package/dist/commonjs/v3/utils/ioSerialization.js +92 -3
  68. package/dist/commonjs/v3/utils/ioSerialization.js.map +1 -1
  69. package/dist/commonjs/v3/workers/index.d.ts +1 -0
  70. package/dist/commonjs/v3/workers/index.js +3 -1
  71. package/dist/commonjs/v3/workers/index.js.map +1 -1
  72. package/dist/commonjs/version.js +1 -1
  73. package/dist/esm/v3/errors.d.ts +1 -0
  74. package/dist/esm/v3/errors.js +34 -2
  75. package/dist/esm/v3/errors.js.map +1 -1
  76. package/dist/esm/v3/heartbeats/api.d.ts +14 -0
  77. package/dist/esm/v3/heartbeats/api.js +54 -0
  78. package/dist/esm/v3/heartbeats/api.js.map +1 -0
  79. package/dist/esm/v3/heartbeats/manager.d.ts +16 -0
  80. package/dist/esm/v3/heartbeats/manager.js +68 -0
  81. package/dist/esm/v3/heartbeats/manager.js.map +1 -0
  82. package/dist/esm/v3/heartbeats/types.d.ts +7 -0
  83. package/dist/esm/v3/heartbeats/types.js +2 -0
  84. package/dist/esm/v3/heartbeats/types.js.map +1 -0
  85. package/dist/esm/v3/heartbeats-api.d.ts +3 -0
  86. package/dist/esm/v3/heartbeats-api.js +6 -0
  87. package/dist/esm/v3/heartbeats-api.js.map +1 -0
  88. package/dist/esm/v3/index.d.ts +1 -0
  89. package/dist/esm/v3/index.js +1 -0
  90. package/dist/esm/v3/index.js.map +1 -1
  91. package/dist/esm/v3/links.d.ts +1 -0
  92. package/dist/esm/v3/links.js +1 -0
  93. package/dist/esm/v3/links.js.map +1 -1
  94. package/dist/esm/v3/runEngineWorker/index.d.ts +1 -0
  95. package/dist/esm/v3/runEngineWorker/index.js +1 -0
  96. package/dist/esm/v3/runEngineWorker/index.js.map +1 -1
  97. package/dist/esm/v3/runEngineWorker/supervisor/consumerPool.d.ts +71 -0
  98. package/dist/esm/v3/runEngineWorker/supervisor/consumerPool.js +312 -0
  99. package/dist/esm/v3/runEngineWorker/supervisor/consumerPool.js.map +1 -0
  100. package/dist/esm/v3/runEngineWorker/supervisor/consumerPool.test.d.ts +1 -0
  101. package/dist/esm/v3/runEngineWorker/supervisor/consumerPool.test.js +587 -0
  102. package/dist/esm/v3/runEngineWorker/supervisor/consumerPool.test.js.map +1 -0
  103. package/dist/esm/v3/runEngineWorker/supervisor/consumerPoolMetrics.d.ts +43 -0
  104. package/dist/esm/v3/runEngineWorker/supervisor/consumerPoolMetrics.js +127 -0
  105. package/dist/esm/v3/runEngineWorker/supervisor/consumerPoolMetrics.js.map +1 -0
  106. package/dist/esm/v3/runEngineWorker/supervisor/http.d.ts +2 -0
  107. package/dist/esm/v3/runEngineWorker/supervisor/queueConsumer.d.ts +7 -4
  108. package/dist/esm/v3/runEngineWorker/supervisor/queueConsumer.js.map +1 -1
  109. package/dist/esm/v3/runEngineWorker/supervisor/queueMetricsProcessor.d.ts +76 -0
  110. package/dist/esm/v3/runEngineWorker/supervisor/queueMetricsProcessor.js +157 -0
  111. package/dist/esm/v3/runEngineWorker/supervisor/queueMetricsProcessor.js.map +1 -0
  112. package/dist/esm/v3/runEngineWorker/supervisor/queueMetricsProcessor.test.d.ts +1 -0
  113. package/dist/esm/v3/runEngineWorker/supervisor/queueMetricsProcessor.test.js +291 -0
  114. package/dist/esm/v3/runEngineWorker/supervisor/queueMetricsProcessor.test.js.map +1 -0
  115. package/dist/esm/v3/runEngineWorker/supervisor/scalingStrategies.d.ts +67 -0
  116. package/dist/esm/v3/runEngineWorker/supervisor/scalingStrategies.js +146 -0
  117. package/dist/esm/v3/runEngineWorker/supervisor/scalingStrategies.js.map +1 -0
  118. package/dist/esm/v3/runEngineWorker/supervisor/scalingStrategies.test.d.ts +1 -0
  119. package/dist/esm/v3/runEngineWorker/supervisor/scalingStrategies.test.js +233 -0
  120. package/dist/esm/v3/runEngineWorker/supervisor/scalingStrategies.test.js.map +1 -0
  121. package/dist/esm/v3/runEngineWorker/supervisor/schemas.d.ts +6 -0
  122. package/dist/esm/v3/runEngineWorker/supervisor/session.d.ts +5 -2
  123. package/dist/esm/v3/runEngineWorker/supervisor/session.js +14 -8
  124. package/dist/esm/v3/runEngineWorker/supervisor/session.js.map +1 -1
  125. package/dist/esm/v3/runEngineWorker/workload/http.d.ts +81 -111
  126. package/dist/esm/v3/runEngineWorker/workload/http.js +37 -15
  127. package/dist/esm/v3/runEngineWorker/workload/http.js.map +1 -1
  128. package/dist/esm/v3/runEngineWorker/workload/schemas.d.ts +3 -0
  129. package/dist/esm/v3/schemas/api.d.ts +144 -0
  130. package/dist/esm/v3/schemas/api.js +8 -0
  131. package/dist/esm/v3/schemas/api.js.map +1 -1
  132. package/dist/esm/v3/schemas/checkpoints.d.ts +3 -0
  133. package/dist/esm/v3/schemas/runEngine.d.ts +3 -0
  134. package/dist/esm/v3/schemas/runEngine.js +1 -0
  135. package/dist/esm/v3/schemas/runEngine.js.map +1 -1
  136. package/dist/esm/v3/utils/globals.d.ts +2 -0
  137. package/dist/esm/v3/utils/globals.js.map +1 -1
  138. package/dist/esm/v3/utils/ioSerialization.d.ts +1 -0
  139. package/dist/esm/v3/utils/ioSerialization.js +92 -3
  140. package/dist/esm/v3/utils/ioSerialization.js.map +1 -1
  141. package/dist/esm/v3/workers/index.d.ts +1 -0
  142. package/dist/esm/v3/workers/index.js +1 -0
  143. package/dist/esm/v3/workers/index.js.map +1 -1
  144. package/dist/esm/version.js +1 -1
  145. package/package.json +1 -1
@@ -0,0 +1,131 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ConsumerPoolMetrics = void 0;
4
+ const prom_client_1 = require("prom-client");
5
+ class ConsumerPoolMetrics {
6
+ register;
7
+ prefix;
8
+ // Current state metrics
9
+ consumerCount;
10
+ queueLength;
11
+ smoothedQueueLength;
12
+ targetConsumerCount;
13
+ scalingStrategy;
14
+ // Scaling operation metrics
15
+ scalingOperationsTotal;
16
+ consumersAddedTotal;
17
+ consumersRemovedTotal;
18
+ scalingCooldownsApplied;
19
+ // Performance metrics
20
+ queueLengthUpdatesTotal;
21
+ batchesProcessedTotal;
22
+ constructor(opts = {}) {
23
+ this.register = opts.register ?? new prom_client_1.Registry();
24
+ this.prefix = opts.prefix ?? "queue_consumer_pool";
25
+ // Current state metrics
26
+ this.consumerCount = new prom_client_1.Gauge({
27
+ name: `${this.prefix}_consumer_count`,
28
+ help: "Current number of active queue consumers",
29
+ labelNames: ["strategy"],
30
+ registers: [this.register],
31
+ });
32
+ this.queueLength = new prom_client_1.Gauge({
33
+ name: `${this.prefix}_queue_length`,
34
+ help: "Current queue length (median of recent samples)",
35
+ registers: [this.register],
36
+ });
37
+ this.smoothedQueueLength = new prom_client_1.Gauge({
38
+ name: `${this.prefix}_smoothed_queue_length`,
39
+ help: "EWMA smoothed queue length",
40
+ registers: [this.register],
41
+ });
42
+ this.targetConsumerCount = new prom_client_1.Gauge({
43
+ name: `${this.prefix}_target_consumer_count`,
44
+ help: "Target number of consumers calculated by scaling strategy",
45
+ labelNames: ["strategy"],
46
+ registers: [this.register],
47
+ });
48
+ this.scalingStrategy = new prom_client_1.Gauge({
49
+ name: `${this.prefix}_scaling_strategy_info`,
50
+ help: "Information about the active scaling strategy (1 = active, 0 = inactive)",
51
+ labelNames: ["strategy"],
52
+ registers: [this.register],
53
+ });
54
+ // Scaling operation metrics
55
+ this.scalingOperationsTotal = new prom_client_1.Counter({
56
+ name: `${this.prefix}_scaling_operations_total`,
57
+ help: "Total number of scaling operations performed",
58
+ labelNames: ["direction", "strategy"],
59
+ registers: [this.register],
60
+ });
61
+ this.consumersAddedTotal = new prom_client_1.Counter({
62
+ name: `${this.prefix}_consumers_added_total`,
63
+ help: "Total number of consumers added",
64
+ registers: [this.register],
65
+ });
66
+ this.consumersRemovedTotal = new prom_client_1.Counter({
67
+ name: `${this.prefix}_consumers_removed_total`,
68
+ help: "Total number of consumers removed",
69
+ registers: [this.register],
70
+ });
71
+ this.scalingCooldownsApplied = new prom_client_1.Counter({
72
+ name: `${this.prefix}_scaling_cooldowns_applied_total`,
73
+ help: "Number of times scaling was prevented due to cooldown",
74
+ labelNames: ["direction"],
75
+ registers: [this.register],
76
+ });
77
+ this.queueLengthUpdatesTotal = new prom_client_1.Counter({
78
+ name: `${this.prefix}_queue_length_updates_total`,
79
+ help: "Total number of queue length updates received",
80
+ registers: [this.register],
81
+ });
82
+ this.batchesProcessedTotal = new prom_client_1.Counter({
83
+ name: `${this.prefix}_batches_processed_total`,
84
+ help: "Total number of metric batches processed",
85
+ registers: [this.register],
86
+ });
87
+ }
88
+ /**
89
+ * Update all gauge metrics with current state
90
+ */
91
+ updateState(state) {
92
+ this.consumerCount.set({ strategy: state.strategy }, state.consumerCount);
93
+ if (state.queueLength !== undefined) {
94
+ this.queueLength.set(state.queueLength);
95
+ }
96
+ this.smoothedQueueLength.set(state.smoothedQueueLength);
97
+ this.targetConsumerCount.set({ strategy: state.strategy }, state.targetConsumerCount);
98
+ // Set strategy info (1 for active strategy, 0 for others)
99
+ ["none", "smooth", "aggressive"].forEach((s) => {
100
+ this.scalingStrategy.set({ strategy: s }, s === state.strategy ? 1 : 0);
101
+ });
102
+ }
103
+ /**
104
+ * Record a scaling operation
105
+ */
106
+ recordScalingOperation(direction, strategy, count) {
107
+ if (direction !== "none") {
108
+ this.scalingOperationsTotal.inc({ direction, strategy });
109
+ if (direction === "up") {
110
+ this.consumersAddedTotal.inc(count);
111
+ }
112
+ else {
113
+ this.consumersRemovedTotal.inc(count);
114
+ }
115
+ }
116
+ }
117
+ /**
118
+ * Record that scaling was prevented by cooldown
119
+ */
120
+ recordCooldownApplied(direction) {
121
+ this.scalingCooldownsApplied.inc({ direction });
122
+ }
123
+ /**
124
+ * Record a queue length update
125
+ */
126
+ recordQueueLengthUpdate() {
127
+ this.queueLengthUpdatesTotal.inc();
128
+ }
129
+ }
130
+ exports.ConsumerPoolMetrics = ConsumerPoolMetrics;
131
+ //# sourceMappingURL=consumerPoolMetrics.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"consumerPoolMetrics.js","sourceRoot":"","sources":["../../../../../src/v3/runEngineWorker/supervisor/consumerPoolMetrics.ts"],"names":[],"mappings":";;;AAAA,6CAAkE;AAOlE,MAAa,mBAAmB;IACb,QAAQ,CAAW;IACnB,MAAM,CAAS;IAEhC,wBAAwB;IACR,aAAa,CAAQ;IACrB,WAAW,CAAQ;IACnB,mBAAmB,CAAQ;IAC3B,mBAAmB,CAAQ;IAC3B,eAAe,CAAQ;IAEvC,4BAA4B;IACZ,sBAAsB,CAAU;IAChC,mBAAmB,CAAU;IAC7B,qBAAqB,CAAU;IAC/B,uBAAuB,CAAU;IAEjD,sBAAsB;IACN,uBAAuB,CAAU;IACjC,qBAAqB,CAAU;IAE/C,YAAY,OAAmC,EAAE;QAC/C,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,IAAI,IAAI,sBAAQ,EAAE,CAAC;QAChD,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,qBAAqB,CAAC;QAEnD,wBAAwB;QACxB,IAAI,CAAC,aAAa,GAAG,IAAI,mBAAK,CAAC;YAC7B,IAAI,EAAE,GAAG,IAAI,CAAC,MAAM,iBAAiB;YACrC,IAAI,EAAE,0CAA0C;YAChD,UAAU,EAAE,CAAC,UAAU,CAAC;YACxB,SAAS,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC;SAC3B,CAAC,CAAC;QAEH,IAAI,CAAC,WAAW,GAAG,IAAI,mBAAK,CAAC;YAC3B,IAAI,EAAE,GAAG,IAAI,CAAC,MAAM,eAAe;YACnC,IAAI,EAAE,iDAAiD;YACvD,SAAS,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC;SAC3B,CAAC,CAAC;QAEH,IAAI,CAAC,mBAAmB,GAAG,IAAI,mBAAK,CAAC;YACnC,IAAI,EAAE,GAAG,IAAI,CAAC,MAAM,wBAAwB;YAC5C,IAAI,EAAE,4BAA4B;YAClC,SAAS,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC;SAC3B,CAAC,CAAC;QAEH,IAAI,CAAC,mBAAmB,GAAG,IAAI,mBAAK,CAAC;YACnC,IAAI,EAAE,GAAG,IAAI,CAAC,MAAM,wBAAwB;YAC5C,IAAI,EAAE,2DAA2D;YACjE,UAAU,EAAE,CAAC,UAAU,CAAC;YACxB,SAAS,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC;SAC3B,CAAC,CAAC;QAEH,IAAI,CAAC,eAAe,GAAG,IAAI,mBAAK,CAAC;YAC/B,IAAI,EAAE,GAAG,IAAI,CAAC,MAAM,wBAAwB;YAC5C,IAAI,EAAE,0EAA0E;YAChF,UAAU,EAAE,CAAC,UAAU,CAAC;YACxB,SAAS,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC;SAC3B,CAAC,CAAC;QAEH,4BAA4B;QAC5B,IAAI,CAAC,sBAAsB,GAAG,IAAI,qBAAO,CAAC;YACxC,IAAI,EAAE,GAAG,IAAI,CAAC,MAAM,2BAA2B;YAC/C,IAAI,EAAE,8CAA8C;YACpD,UAAU,EAAE,CAAC,WAAW,EAAE,UAAU,CAAC;YACrC,SAAS,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC;SAC3B,CAAC,CAAC;QAEH,IAAI,CAAC,mBAAmB,GAAG,IAAI,qBAAO,CAAC;YACrC,IAAI,EAAE,GAAG,IAAI,CAAC,MAAM,wBAAwB;YAC5C,IAAI,EAAE,iCAAiC;YACvC,SAAS,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC;SAC3B,CAAC,CAAC;QAEH,IAAI,CAAC,qBAAqB,GAAG,IAAI,qBAAO,CAAC;YACvC,IAAI,EAAE,GAAG,IAAI,CAAC,MAAM,0BAA0B;YAC9C,IAAI,EAAE,mCAAmC;YACzC,SAAS,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC;SAC3B,CAAC,CAAC;QAEH,IAAI,CAAC,uBAAuB,GAAG,IAAI,qBAAO,CAAC;YACzC,IAAI,EAAE,GAAG,IAAI,CAAC,MAAM,kCAAkC;YACtD,IAAI,EAAE,uDAAuD;YAC7D,UAAU,EAAE,CAAC,WAAW,CAAC;YACzB,SAAS,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC;SAC3B,CAAC,CAAC;QAEH,IAAI,CAAC,uBAAuB,GAAG,IAAI,qBAAO,CAAC;YACzC,IAAI,EAAE,GAAG,IAAI,CAAC,MAAM,6BAA6B;YACjD,IAAI,EAAE,+CAA+C;YACrD,SAAS,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC;SAC3B,CAAC,CAAC;QAEH,IAAI,CAAC,qBAAqB,GAAG,IAAI,qBAAO,CAAC;YACvC,IAAI,EAAE,GAAG,IAAI,CAAC,MAAM,0BAA0B;YAC9C,IAAI,EAAE,0CAA0C;YAChD,SAAS,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC;SAC3B,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACH,WAAW,CAAC,KAMX;QACC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,EAAE,KAAK,CAAC,aAAa,CAAC,CAAC;QAE1E,IAAI,KAAK,CAAC,WAAW,KAAK,SAAS,EAAE,CAAC;YACpC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;QAC1C,CAAC;QAED,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC;QACxD,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,EAAE,KAAK,CAAC,mBAAmB,CAAC,CAAC;QAEtF,0DAA0D;QAC1D,CAAC,MAAM,EAAE,QAAQ,EAAE,YAAY,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE;YAC7C,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,EAAE,CAAC,KAAK,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC1E,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACH,sBAAsB,CAAC,SAAiC,EAAE,QAAgB,EAAE,KAAa;QACvF,IAAI,SAAS,KAAK,MAAM,EAAE,CAAC;YACzB,IAAI,CAAC,sBAAsB,CAAC,GAAG,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,CAAC;YAEzD,IAAI,SAAS,KAAK,IAAI,EAAE,CAAC;gBACvB,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;YACtC,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;YACxC,CAAC;QACH,CAAC;IACH,CAAC;IAED;;OAEG;IACH,qBAAqB,CAAC,SAAwB;QAC5C,IAAI,CAAC,uBAAuB,CAAC,GAAG,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC;IAClD,CAAC;IAED;;OAEG;IACH,uBAAuB;QACrB,IAAI,CAAC,uBAAuB,CAAC,GAAG,EAAE,CAAC;IACrC,CAAC;CACF;AAxJD,kDAwJC"}
@@ -91,6 +91,7 @@ export declare class SupervisorHttpClient {
91
91
  imageRef?: string | null | undefined;
92
92
  reason?: string | null | undefined;
93
93
  } | undefined;
94
+ workerQueueLength?: number | undefined;
94
95
  image?: string | undefined;
95
96
  placementTags?: {
96
97
  key: string;
@@ -173,6 +174,7 @@ export declare class SupervisorHttpClient {
173
174
  imageRef?: string | null | undefined;
174
175
  reason?: string | null | undefined;
175
176
  } | undefined;
177
+ workerQueueLength?: number | undefined;
176
178
  image?: string | undefined;
177
179
  placementTags?: {
178
180
  key: string;
@@ -1,7 +1,11 @@
1
1
  import { SupervisorHttpClient } from "./http.js";
2
2
  import { WorkerApiDequeueResponseBody } from "./schemas.js";
3
3
  import { PreDequeueFn, PreSkipFn } from "./types.js";
4
- type RunQueueConsumerOptions = {
4
+ export interface QueueConsumer {
5
+ start(): void;
6
+ stop(): void;
7
+ }
8
+ export type RunQueueConsumerOptions = {
5
9
  client: SupervisorHttpClient;
6
10
  intervalMs: number;
7
11
  idleIntervalMs: number;
@@ -10,7 +14,7 @@ type RunQueueConsumerOptions = {
10
14
  maxRunCount?: number;
11
15
  onDequeue: (messages: WorkerApiDequeueResponseBody) => Promise<void>;
12
16
  };
13
- export declare class RunQueueConsumer {
17
+ export declare class RunQueueConsumer implements QueueConsumer {
14
18
  private readonly client;
15
19
  private readonly preDequeue?;
16
20
  private readonly preSkip?;
@@ -24,6 +28,5 @@ export declare class RunQueueConsumer {
24
28
  start(): void;
25
29
  stop(): void;
26
30
  private dequeue;
27
- scheduleNextDequeue(delayMs: number): void;
31
+ private scheduleNextDequeue;
28
32
  }
29
- export {};
@@ -1 +1 @@
1
- {"version":3,"file":"queueConsumer.js","sourceRoot":"","sources":["../../../../../src/v3/runEngineWorker/supervisor/queueConsumer.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"queueConsumer.js","sourceRoot":"","sources":["../../../../../src/v3/runEngineWorker/supervisor/queueConsumer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,76 @@
1
+ export interface QueueMetricsProcessorOptions {
2
+ /**
3
+ * EWMA smoothing factor (0-1)
4
+ * Lower values = more smoothing, less reactive
5
+ * Higher values = more responsive to recent changes
6
+ */
7
+ ewmaAlpha: number;
8
+ /**
9
+ * Batch window duration in milliseconds
10
+ * Samples within this window are collected and processed together
11
+ */
12
+ batchWindowMs: number;
13
+ }
14
+ export interface BatchProcessingResult {
15
+ /** Median of samples in the batch */
16
+ median: number;
17
+ /** EWMA-smoothed value after processing this batch */
18
+ smoothedValue: number;
19
+ /** Number of samples processed in this batch */
20
+ sampleCount: number;
21
+ /** Raw samples that were processed */
22
+ samples: readonly number[];
23
+ }
24
+ /**
25
+ * Processes queue length samples using exponential weighted moving average (EWMA)
26
+ * for smoothing and median filtering for outlier resistance.
27
+ *
28
+ * Collects samples within a batch window, calculates median to filter outliers,
29
+ * then applies EWMA smoothing for stable trend tracking.
30
+ */
31
+ export declare class QueueMetricsProcessor {
32
+ private readonly ewmaAlpha;
33
+ private readonly batchWindowMs;
34
+ private readonly logger;
35
+ private samples;
36
+ private smoothedValue;
37
+ private lastBatchTime;
38
+ private isInitialized;
39
+ constructor(options: QueueMetricsProcessorOptions);
40
+ /**
41
+ * Adds a sample to the current batch
42
+ */
43
+ addSample(value: number, timestamp?: number): void;
44
+ /**
45
+ * Checks if enough time has passed to process the current batch
46
+ */
47
+ shouldProcessBatch(currentTime?: number): boolean;
48
+ private calculateMedian;
49
+ /**
50
+ * Processes the current batch of samples and returns the result.
51
+ * Clears the samples array and updates the smoothed value.
52
+ *
53
+ * Returns null if there are no samples to process.
54
+ */
55
+ processBatch(currentTime?: number): BatchProcessingResult | null;
56
+ /**
57
+ * Gets the current smoothed value without processing a batch
58
+ */
59
+ getSmoothedValue(): number;
60
+ /**
61
+ * Gets the number of samples in the current batch
62
+ */
63
+ getCurrentSampleCount(): number;
64
+ /**
65
+ * Gets the current samples (for testing/debugging)
66
+ */
67
+ getCurrentSamples(): readonly number[];
68
+ /**
69
+ * Resets the processor state
70
+ */
71
+ reset(): void;
72
+ /**
73
+ * Gets processor configuration
74
+ */
75
+ getConfig(): Readonly<QueueMetricsProcessorOptions>;
76
+ }
@@ -0,0 +1,161 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.QueueMetricsProcessor = void 0;
4
+ const structuredLogger_js_1 = require("../../utils/structuredLogger.js");
5
+ /**
6
+ * Processes queue length samples using exponential weighted moving average (EWMA)
7
+ * for smoothing and median filtering for outlier resistance.
8
+ *
9
+ * Collects samples within a batch window, calculates median to filter outliers,
10
+ * then applies EWMA smoothing for stable trend tracking.
11
+ */
12
+ class QueueMetricsProcessor {
13
+ ewmaAlpha;
14
+ batchWindowMs;
15
+ logger = new structuredLogger_js_1.SimpleStructuredLogger("queue-metrics-processor");
16
+ samples = [];
17
+ smoothedValue = 0;
18
+ lastBatchTime = 0;
19
+ isInitialized = false;
20
+ constructor(options) {
21
+ if (options.ewmaAlpha < 0 || options.ewmaAlpha > 1) {
22
+ throw new Error("ewmaAlpha must be between 0 and 1");
23
+ }
24
+ if (options.batchWindowMs <= 0) {
25
+ throw new Error("batchWindowMs must be positive");
26
+ }
27
+ this.ewmaAlpha = options.ewmaAlpha;
28
+ this.batchWindowMs = options.batchWindowMs;
29
+ }
30
+ /**
31
+ * Adds a sample to the current batch
32
+ */
33
+ addSample(value, timestamp = Date.now()) {
34
+ if (value < 0) {
35
+ throw new Error("Queue length cannot be negative");
36
+ }
37
+ this.samples.push(value);
38
+ // Update last batch time on first sample
39
+ if (this.samples.length === 1) {
40
+ this.lastBatchTime = timestamp;
41
+ }
42
+ }
43
+ /**
44
+ * Checks if enough time has passed to process the current batch
45
+ */
46
+ shouldProcessBatch(currentTime = Date.now()) {
47
+ if (this.samples.length === 0) {
48
+ return false;
49
+ }
50
+ return currentTime - this.lastBatchTime >= this.batchWindowMs;
51
+ }
52
+ calculateMedian(samples) {
53
+ const sortedSamples = [...samples].sort((a, b) => a - b);
54
+ const mid = Math.floor(sortedSamples.length / 2);
55
+ if (sortedSamples.length % 2 === 1) {
56
+ // Odd length: use middle value
57
+ const median = sortedSamples[mid];
58
+ if (median === undefined) {
59
+ this.logger.error("Invalid median calculated from odd samples", {
60
+ sortedSamples,
61
+ mid,
62
+ median,
63
+ });
64
+ return null;
65
+ }
66
+ return median;
67
+ }
68
+ else {
69
+ // Even length: average two middle values
70
+ const lowMid = sortedSamples[mid - 1];
71
+ const highMid = sortedSamples[mid];
72
+ if (lowMid === undefined || highMid === undefined) {
73
+ this.logger.error("Invalid median calculated from even samples", {
74
+ sortedSamples,
75
+ mid,
76
+ lowMid,
77
+ highMid,
78
+ });
79
+ return null;
80
+ }
81
+ const median = (lowMid + highMid) / 2;
82
+ return median;
83
+ }
84
+ }
85
+ /**
86
+ * Processes the current batch of samples and returns the result.
87
+ * Clears the samples array and updates the smoothed value.
88
+ *
89
+ * Returns null if there are no samples to process.
90
+ */
91
+ processBatch(currentTime = Date.now()) {
92
+ if (this.samples.length === 0) {
93
+ // No samples to process
94
+ return null;
95
+ }
96
+ // Calculate median of samples to filter outliers
97
+ const median = this.calculateMedian(this.samples);
98
+ if (median === null) {
99
+ // We already logged a more specific error message
100
+ return null;
101
+ }
102
+ // Update EWMA smoothed value
103
+ if (!this.isInitialized) {
104
+ // First value - initialize with median
105
+ this.smoothedValue = median;
106
+ this.isInitialized = true;
107
+ }
108
+ else {
109
+ // Apply EWMA: s_t = α * x_t + (1 - α) * s_(t-1)
110
+ this.smoothedValue = this.ewmaAlpha * median + (1 - this.ewmaAlpha) * this.smoothedValue;
111
+ }
112
+ const result = {
113
+ median,
114
+ smoothedValue: this.smoothedValue,
115
+ sampleCount: this.samples.length,
116
+ samples: Object.freeze([...this.samples]),
117
+ };
118
+ // Clear samples for next batch
119
+ this.samples = [];
120
+ this.lastBatchTime = currentTime;
121
+ return result;
122
+ }
123
+ /**
124
+ * Gets the current smoothed value without processing a batch
125
+ */
126
+ getSmoothedValue() {
127
+ return this.smoothedValue;
128
+ }
129
+ /**
130
+ * Gets the number of samples in the current batch
131
+ */
132
+ getCurrentSampleCount() {
133
+ return this.samples.length;
134
+ }
135
+ /**
136
+ * Gets the current samples (for testing/debugging)
137
+ */
138
+ getCurrentSamples() {
139
+ return Object.freeze([...this.samples]);
140
+ }
141
+ /**
142
+ * Resets the processor state
143
+ */
144
+ reset() {
145
+ this.samples = [];
146
+ this.smoothedValue = 0;
147
+ this.lastBatchTime = 0;
148
+ this.isInitialized = false;
149
+ }
150
+ /**
151
+ * Gets processor configuration
152
+ */
153
+ getConfig() {
154
+ return {
155
+ ewmaAlpha: this.ewmaAlpha,
156
+ batchWindowMs: this.batchWindowMs,
157
+ };
158
+ }
159
+ }
160
+ exports.QueueMetricsProcessor = QueueMetricsProcessor;
161
+ //# sourceMappingURL=queueMetricsProcessor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"queueMetricsProcessor.js","sourceRoot":"","sources":["../../../../../src/v3/runEngineWorker/supervisor/queueMetricsProcessor.ts"],"names":[],"mappings":"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"}