bunqueue 2.6.55 → 2.6.57
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/cli/commands/server.d.ts.map +1 -1
- package/dist/cli/commands/server.js +19 -4
- package/dist/cli/commands/server.js.map +1 -1
- package/dist/infrastructure/cloud/cloudAgent.d.ts +7 -5
- package/dist/infrastructure/cloud/cloudAgent.d.ts.map +1 -1
- package/dist/infrastructure/cloud/cloudAgent.js +21 -27
- package/dist/infrastructure/cloud/cloudAgent.js.map +1 -1
- package/dist/infrastructure/cloud/httpSender.d.ts +2 -1
- package/dist/infrastructure/cloud/httpSender.d.ts.map +1 -1
- package/dist/infrastructure/cloud/httpSender.js +9 -5
- package/dist/infrastructure/cloud/httpSender.js.map +1 -1
- package/dist/infrastructure/cloud/snapshotCollector.d.ts +7 -5
- package/dist/infrastructure/cloud/snapshotCollector.d.ts.map +1 -1
- package/dist/infrastructure/cloud/snapshotCollector.js +24 -161
- package/dist/infrastructure/cloud/snapshotCollector.js.map +1 -1
- package/dist/infrastructure/cloud/snapshotHelpers.d.ts +40 -0
- package/dist/infrastructure/cloud/snapshotHelpers.d.ts.map +1 -0
- package/dist/infrastructure/cloud/snapshotHelpers.js +333 -0
- package/dist/infrastructure/cloud/snapshotHelpers.js.map +1 -0
- package/dist/infrastructure/cloud/types.d.ts +63 -1
- package/dist/infrastructure/cloud/types.d.ts.map +1 -1
- package/dist/infrastructure/cloud/wsSender.d.ts +14 -20
- package/dist/infrastructure/cloud/wsSender.d.ts.map +1 -1
- package/dist/infrastructure/cloud/wsSender.js +64 -113
- package/dist/infrastructure/cloud/wsSender.js.map +1 -1
- package/package.json +1 -1
|
@@ -1,18 +1,25 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Snapshot Collector
|
|
3
|
-
* Two-tier collection: light (every
|
|
3
|
+
* Two-tier collection: light (every 15s) + heavy (every 90s)
|
|
4
4
|
*
|
|
5
5
|
* Light: stats, throughput, latency, memory, connections — O(SHARD_COUNT)
|
|
6
6
|
* Heavy: recentJobs, dlqEntries, topErrors, workerDetails, queueConfigs, webhooks — O(queues × shards)
|
|
7
|
-
* Queues are always collected but use a single pass with cached counts.
|
|
8
7
|
*/
|
|
9
|
-
import { hostname } from 'os';
|
|
8
|
+
import { hostname, arch, platform, cpus } from 'os';
|
|
10
9
|
import { throughputTracker } from '../../application/throughputTracker';
|
|
11
10
|
import { latencyTracker } from '../../application/latencyTracker';
|
|
12
11
|
import { getTaskErrorStats } from '../../application/backgroundTasks';
|
|
13
12
|
import { VERSION } from '../../shared/version';
|
|
13
|
+
import { collectRecentJobs, collectDlqEntries, collectTopErrors, collectQueueConfigs, collectWebhooks, collectQueueThroughput, collectWorkerUtilization, collectDurationHistogram, collectQueueWaitTime, collectQueueRetryRate, collectBacklogVelocity, collectStallDetails, collectPriorityDistribution, } from './snapshotHelpers';
|
|
14
14
|
/** Cached hostname — computed once */
|
|
15
15
|
const HOST = hostname();
|
|
16
|
+
/** Cached runtime info — computed once */
|
|
17
|
+
const RUNTIME = {
|
|
18
|
+
bunVersion: typeof Bun !== 'undefined' ? Bun.version : 'unknown',
|
|
19
|
+
os: platform(),
|
|
20
|
+
arch: arch(),
|
|
21
|
+
cpus: cpus().length,
|
|
22
|
+
};
|
|
16
23
|
/** Cached heavy data — reused between snapshots until refreshed */
|
|
17
24
|
let cachedHeavy = {
|
|
18
25
|
recentJobs: [],
|
|
@@ -24,7 +31,7 @@ let cachedHeavy = {
|
|
|
24
31
|
s3Backup: null,
|
|
25
32
|
};
|
|
26
33
|
/** Collect a snapshot. Light data always fresh, heavy data cached between refreshes. */
|
|
27
|
-
export function collectSnapshot(params) {
|
|
34
|
+
export async function collectSnapshot(params) {
|
|
28
35
|
const { queueManager, instanceId, instanceName, startedAt, sequenceId, serverHandles } = params;
|
|
29
36
|
// ─── Light data (O(SHARD_COUNT), every snapshot) ───
|
|
30
37
|
const stats = queueManager.getStats();
|
|
@@ -35,8 +42,6 @@ export function collectSnapshot(params) {
|
|
|
35
42
|
const averages = latencyTracker.getAverages();
|
|
36
43
|
const storage = queueManager.getStorageStatus();
|
|
37
44
|
const mem = process.memoryUsage();
|
|
38
|
-
// Queues: single pass — listQueues + getQueueJobCounts + perQueueStats for DLQ
|
|
39
|
-
// Avoids getQueuesSummary() which internally calls getQueueJobCounts but drops totalCompleted/totalFailed
|
|
40
45
|
const queueNames = queueManager.listQueues();
|
|
41
46
|
const perQueue = queueManager.getPerQueueStats();
|
|
42
47
|
const queues = queueNames.map((name) => {
|
|
@@ -52,7 +57,6 @@ export function collectSnapshot(params) {
|
|
|
52
57
|
totalFailed: counts.totalFailed,
|
|
53
58
|
};
|
|
54
59
|
});
|
|
55
|
-
// Crons (cheap, in-memory list)
|
|
56
60
|
const crons = queueManager.listCrons().map((c) => ({
|
|
57
61
|
name: c.name,
|
|
58
62
|
queue: c.queue,
|
|
@@ -60,13 +64,11 @@ export function collectSnapshot(params) {
|
|
|
60
64
|
nextRun: c.nextRun,
|
|
61
65
|
executions: c.executions,
|
|
62
66
|
maxLimit: c.maxLimit,
|
|
67
|
+
lastRun: c.executions > 0 && c.repeatEvery ? c.nextRun - c.repeatEvery : null,
|
|
63
68
|
}));
|
|
64
69
|
// ─── Heavy data (only when requested) ───
|
|
65
70
|
if (params.includeHeavy) {
|
|
66
|
-
// recentJobs: only queues with current activity (not historical)
|
|
67
|
-
// completed/failed jobs are fetched from ALL queues since they're in-memory bounded sets
|
|
68
71
|
const activeQueues = queues.filter((q) => q.waiting > 0 || q.active > 0 || q.delayed > 0);
|
|
69
|
-
// Include all queues for completed/failed snapshot since getJobs handles the state filter
|
|
70
72
|
const allQueuesForJobs = queues.length <= 20 ? queues : activeQueues;
|
|
71
73
|
const dlqQueues = queues.filter((q) => q.dlq > 0);
|
|
72
74
|
cachedHeavy = {
|
|
@@ -86,7 +88,7 @@ export function collectSnapshot(params) {
|
|
|
86
88
|
failedJobs: w.failedJobs,
|
|
87
89
|
currentJob: w.currentJob,
|
|
88
90
|
})),
|
|
89
|
-
queueConfigs: collectQueueConfigs(queueManager, queueNames),
|
|
91
|
+
queueConfigs: collectQueueConfigs(queueManager, new Set(queueNames)),
|
|
90
92
|
webhooks: collectWebhooks(queueManager),
|
|
91
93
|
s3Backup: serverHandles?.getBackupStatus?.() ?? null,
|
|
92
94
|
};
|
|
@@ -146,157 +148,18 @@ export function collectSnapshot(params) {
|
|
|
146
148
|
ws: serverHandles?.getWsClientCount() ?? 0,
|
|
147
149
|
sse: serverHandles?.getSseClientCount() ?? 0,
|
|
148
150
|
},
|
|
149
|
-
//
|
|
151
|
+
// Analytics
|
|
152
|
+
queueThroughput: collectQueueThroughput(queues),
|
|
153
|
+
durationHistogram: collectDurationHistogram(cachedHeavy.recentJobs),
|
|
154
|
+
workerUtilization: collectWorkerUtilization(queueManager),
|
|
155
|
+
sqliteStats: serverHandles?.getSqliteStats?.() ?? null,
|
|
156
|
+
runtime: RUNTIME,
|
|
157
|
+
queueWaitTime: collectQueueWaitTime(cachedHeavy.recentJobs),
|
|
158
|
+
queueRetryRate: collectQueueRetryRate(cachedHeavy.recentJobs),
|
|
159
|
+
queueBacklogVelocity: collectBacklogVelocity(queues),
|
|
160
|
+
stallDetails: await collectStallDetails(queueManager),
|
|
161
|
+
queuePriorityDistribution: collectPriorityDistribution(cachedHeavy.recentJobs),
|
|
150
162
|
...cachedHeavy,
|
|
151
163
|
};
|
|
152
164
|
}
|
|
153
|
-
// ─── Heavy data collectors (only called every ~30s) ───
|
|
154
|
-
/** Collect recent jobs — only from active queues */
|
|
155
|
-
function collectRecentJobs(queueManager, activeQueueNames) {
|
|
156
|
-
if (activeQueueNames.length === 0)
|
|
157
|
-
return [];
|
|
158
|
-
const jobs = [];
|
|
159
|
-
const perQueue = Math.max(1, Math.floor(50 / activeQueueNames.length));
|
|
160
|
-
for (const name of activeQueueNames) {
|
|
161
|
-
try {
|
|
162
|
-
const queueJobs = queueManager.getJobs(name, {
|
|
163
|
-
state: ['waiting', 'active', 'delayed', 'completed', 'failed'],
|
|
164
|
-
start: 0,
|
|
165
|
-
end: perQueue - 1,
|
|
166
|
-
});
|
|
167
|
-
for (const j of queueJobs) {
|
|
168
|
-
const data = j.data;
|
|
169
|
-
const state = j.completedAt
|
|
170
|
-
? 'completed'
|
|
171
|
-
: j.startedAt
|
|
172
|
-
? 'active'
|
|
173
|
-
: j.runAt > Date.now()
|
|
174
|
-
? 'delayed'
|
|
175
|
-
: 'waiting';
|
|
176
|
-
jobs.push({
|
|
177
|
-
id: String(j.id),
|
|
178
|
-
name: data?.name ?? 'default',
|
|
179
|
-
queue: j.queue,
|
|
180
|
-
state,
|
|
181
|
-
data,
|
|
182
|
-
priority: j.priority,
|
|
183
|
-
createdAt: j.createdAt,
|
|
184
|
-
startedAt: j.startedAt ?? undefined,
|
|
185
|
-
completedAt: j.completedAt ?? undefined,
|
|
186
|
-
failedReason: state === 'active' && j.attempts > 0
|
|
187
|
-
? `Retry ${j.attempts}/${j.maxAttempts}`
|
|
188
|
-
: undefined,
|
|
189
|
-
attempts: j.attempts,
|
|
190
|
-
maxAttempts: j.maxAttempts,
|
|
191
|
-
duration: j.completedAt && j.startedAt ? j.completedAt - j.startedAt : undefined,
|
|
192
|
-
progress: j.progress > 0 ? j.progress : undefined,
|
|
193
|
-
});
|
|
194
|
-
}
|
|
195
|
-
}
|
|
196
|
-
catch {
|
|
197
|
-
// Skip queue on error
|
|
198
|
-
}
|
|
199
|
-
}
|
|
200
|
-
return jobs.sort((a, b) => b.createdAt - a.createdAt).slice(0, 50);
|
|
201
|
-
}
|
|
202
|
-
/** Collect DLQ entries — only from queues with DLQ > 0 */
|
|
203
|
-
function collectDlqEntries(queueManager, dlqQueueNames) {
|
|
204
|
-
if (dlqQueueNames.length === 0)
|
|
205
|
-
return [];
|
|
206
|
-
const entries = [];
|
|
207
|
-
for (const name of dlqQueueNames) {
|
|
208
|
-
try {
|
|
209
|
-
const dlq = queueManager.getDlqEntries(name);
|
|
210
|
-
for (const e of dlq.slice(0, 20)) {
|
|
211
|
-
entries.push({
|
|
212
|
-
jobId: String(e.job.id),
|
|
213
|
-
queue: e.job.queue,
|
|
214
|
-
reason: e.reason,
|
|
215
|
-
error: e.error,
|
|
216
|
-
enteredAt: e.enteredAt,
|
|
217
|
-
retryCount: e.retryCount,
|
|
218
|
-
attempts: e.job.attempts,
|
|
219
|
-
});
|
|
220
|
-
}
|
|
221
|
-
}
|
|
222
|
-
catch {
|
|
223
|
-
// Skip
|
|
224
|
-
}
|
|
225
|
-
}
|
|
226
|
-
return entries.sort((a, b) => b.enteredAt - a.enteredAt).slice(0, 50);
|
|
227
|
-
}
|
|
228
|
-
/** Collect per-queue config */
|
|
229
|
-
function collectQueueConfigs(queueManager, queueNames) {
|
|
230
|
-
const configs = {};
|
|
231
|
-
const perQueue = queueManager.getPerQueueStats();
|
|
232
|
-
for (const name of queueNames) {
|
|
233
|
-
try {
|
|
234
|
-
const stall = queueManager.getStallConfig(name);
|
|
235
|
-
const dlq = queueManager.getDlqConfig(name);
|
|
236
|
-
const pq = perQueue.get(name);
|
|
237
|
-
configs[name] = {
|
|
238
|
-
paused: queueManager.isPaused(name),
|
|
239
|
-
rateLimit: null,
|
|
240
|
-
concurrencyLimit: null,
|
|
241
|
-
concurrencyActive: pq?.active ?? 0,
|
|
242
|
-
stallConfig: { stallInterval: stall.stallInterval, maxStalls: stall.maxStalls },
|
|
243
|
-
dlqConfig: { maxRetries: dlq.maxAutoRetries, maxAge: dlq.maxAge ?? 0 },
|
|
244
|
-
};
|
|
245
|
-
}
|
|
246
|
-
catch {
|
|
247
|
-
// Skip
|
|
248
|
-
}
|
|
249
|
-
}
|
|
250
|
-
return configs;
|
|
251
|
-
}
|
|
252
|
-
/** Collect webhook delivery stats */
|
|
253
|
-
function collectWebhooks(queueManager) {
|
|
254
|
-
try {
|
|
255
|
-
return queueManager.webhookManager.list().map((w) => ({
|
|
256
|
-
id: w.id,
|
|
257
|
-
url: w.url,
|
|
258
|
-
events: w.events,
|
|
259
|
-
queue: w.queue,
|
|
260
|
-
enabled: w.enabled,
|
|
261
|
-
successCount: w.successCount,
|
|
262
|
-
failureCount: w.failureCount,
|
|
263
|
-
lastTriggered: w.lastTriggered,
|
|
264
|
-
}));
|
|
265
|
-
}
|
|
266
|
-
catch {
|
|
267
|
-
return [];
|
|
268
|
-
}
|
|
269
|
-
}
|
|
270
|
-
/** Collect top errors — only from queues with DLQ entries */
|
|
271
|
-
function collectTopErrors(queueManager, dlqQueueNames) {
|
|
272
|
-
if (dlqQueueNames.length === 0)
|
|
273
|
-
return [];
|
|
274
|
-
const errorMap = new Map();
|
|
275
|
-
const allEntries = dlqQueueNames.flatMap((name) => {
|
|
276
|
-
try {
|
|
277
|
-
return queueManager.getDlqEntries(name);
|
|
278
|
-
}
|
|
279
|
-
catch {
|
|
280
|
-
return [];
|
|
281
|
-
}
|
|
282
|
-
});
|
|
283
|
-
for (const e of allEntries) {
|
|
284
|
-
const msg = e.error ?? e.reason;
|
|
285
|
-
const existing = errorMap.get(msg);
|
|
286
|
-
if (existing) {
|
|
287
|
-
existing.count++;
|
|
288
|
-
if (e.enteredAt > existing.lastSeen) {
|
|
289
|
-
existing.lastSeen = e.enteredAt;
|
|
290
|
-
existing.queue = e.job.queue;
|
|
291
|
-
}
|
|
292
|
-
}
|
|
293
|
-
else {
|
|
294
|
-
errorMap.set(msg, { count: 1, queue: e.job.queue, lastSeen: e.enteredAt });
|
|
295
|
-
}
|
|
296
|
-
}
|
|
297
|
-
return [...errorMap.entries()]
|
|
298
|
-
.map(([message, data]) => ({ message, ...data }))
|
|
299
|
-
.sort((a, b) => b.count - a.count)
|
|
300
|
-
.slice(0, 20);
|
|
301
|
-
}
|
|
302
165
|
//# sourceMappingURL=snapshotCollector.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"snapshotCollector.js","sourceRoot":"","sources":["../../../src/infrastructure/cloud/snapshotCollector.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"snapshotCollector.js","sourceRoot":"","sources":["../../../src/infrastructure/cloud/snapshotCollector.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Snapshot Helper Collectors
|
|
3
|
+
* Heavy and analytics data collectors used by snapshotCollector.
|
|
4
|
+
*/
|
|
5
|
+
import type { QueueManager } from '../../application/queueManager';
|
|
6
|
+
import type { CloudSnapshot } from './types';
|
|
7
|
+
/** Collect recent jobs — only from active queues */
|
|
8
|
+
export declare function collectRecentJobs(queueManager: QueueManager, activeQueueNames: string[]): CloudSnapshot['recentJobs'];
|
|
9
|
+
/** Collect DLQ entries — only from queues with DLQ > 0 */
|
|
10
|
+
export declare function collectDlqEntries(queueManager: QueueManager, dlqQueueNames: string[]): CloudSnapshot['dlqEntries'];
|
|
11
|
+
/** Collect per-queue config */
|
|
12
|
+
export declare function collectQueueConfigs(queueManager: QueueManager, queueNames: Set<string>): CloudSnapshot['queueConfigs'];
|
|
13
|
+
/** Collect webhook delivery stats */
|
|
14
|
+
export declare function collectWebhooks(queueManager: QueueManager): CloudSnapshot['webhooks'];
|
|
15
|
+
/** Collect top errors — only from queues with DLQ entries */
|
|
16
|
+
export declare function collectTopErrors(queueManager: QueueManager, dlqQueueNames: string[]): CloudSnapshot['topErrors'];
|
|
17
|
+
/** Compute per-queue throughput from delta of totalCompleted/totalFailed */
|
|
18
|
+
export declare function collectQueueThroughput(queues: Array<{
|
|
19
|
+
name: string;
|
|
20
|
+
totalCompleted: number;
|
|
21
|
+
totalFailed: number;
|
|
22
|
+
}>): CloudSnapshot['queueThroughput'];
|
|
23
|
+
/** Compute per-worker utilization */
|
|
24
|
+
export declare function collectWorkerUtilization(queueManager: QueueManager): CloudSnapshot['workerUtilization'];
|
|
25
|
+
/** Compute duration histogram from recent jobs */
|
|
26
|
+
export declare function collectDurationHistogram(recentJobs: CloudSnapshot['recentJobs']): CloudSnapshot['durationHistogram'];
|
|
27
|
+
/** Compute per-queue wait time (createdAt → startedAt) from recent jobs */
|
|
28
|
+
export declare function collectQueueWaitTime(recentJobs: CloudSnapshot['recentJobs']): CloudSnapshot['queueWaitTime'];
|
|
29
|
+
/** Compute per-queue retry rate from recent jobs */
|
|
30
|
+
export declare function collectQueueRetryRate(recentJobs: CloudSnapshot['recentJobs']): CloudSnapshot['queueRetryRate'];
|
|
31
|
+
/** Compute queue backlog velocity (delta waiting between snapshots) */
|
|
32
|
+
export declare function collectBacklogVelocity(queues: Array<{
|
|
33
|
+
name: string;
|
|
34
|
+
waiting: number;
|
|
35
|
+
}>): CloudSnapshot['queueBacklogVelocity'];
|
|
36
|
+
/** Collect stall details from processing shards */
|
|
37
|
+
export declare function collectStallDetails(queueManager: QueueManager): Promise<CloudSnapshot['stallDetails']>;
|
|
38
|
+
/** Compute per-queue priority distribution from recent jobs */
|
|
39
|
+
export declare function collectPriorityDistribution(recentJobs: CloudSnapshot['recentJobs']): CloudSnapshot['queuePriorityDistribution'];
|
|
40
|
+
//# sourceMappingURL=snapshotHelpers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"snapshotHelpers.d.ts","sourceRoot":"","sources":["../../../src/infrastructure/cloud/snapshotHelpers.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AAEnE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAa7C,oDAAoD;AACpD,wBAAgB,iBAAiB,CAC/B,YAAY,EAAE,YAAY,EAC1B,gBAAgB,EAAE,MAAM,EAAE,GACzB,aAAa,CAAC,YAAY,CAAC,CAiD7B;AAED,0DAA0D;AAC1D,wBAAgB,iBAAiB,CAC/B,YAAY,EAAE,YAAY,EAC1B,aAAa,EAAE,MAAM,EAAE,GACtB,aAAa,CAAC,YAAY,CAAC,CAyB7B;AAED,+BAA+B;AAC/B,wBAAgB,mBAAmB,CACjC,YAAY,EAAE,YAAY,EAC1B,UAAU,EAAE,GAAG,CAAC,MAAM,CAAC,GACtB,aAAa,CAAC,cAAc,CAAC,CAuB/B;AAED,qCAAqC;AACrC,wBAAgB,eAAe,CAAC,YAAY,EAAE,YAAY,GAAG,aAAa,CAAC,UAAU,CAAC,CAerF;AAED,6DAA6D;AAC7D,wBAAgB,gBAAgB,CAC9B,YAAY,EAAE,YAAY,EAC1B,aAAa,EAAE,MAAM,EAAE,GACtB,aAAa,CAAC,WAAW,CAAC,CA+B5B;AAID,4EAA4E;AAC5E,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,cAAc,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,CAAC,GAC3E,aAAa,CAAC,iBAAiB,CAAC,CA+BlC;AAED,qCAAqC;AACrC,wBAAgB,wBAAwB,CACtC,YAAY,EAAE,YAAY,GACzB,aAAa,CAAC,mBAAmB,CAAC,CAMpC;AAED,kDAAkD;AAClD,wBAAgB,wBAAwB,CACtC,UAAU,EAAE,aAAa,CAAC,YAAY,CAAC,GACtC,aAAa,CAAC,mBAAmB,CAAC,CAWpC;AAED,2EAA2E;AAC3E,wBAAgB,oBAAoB,CAClC,UAAU,EAAE,aAAa,CAAC,YAAY,CAAC,GACtC,aAAa,CAAC,eAAe,CAAC,CAwBhC;AAED,oDAAoD;AACpD,wBAAgB,qBAAqB,CACnC,UAAU,EAAE,aAAa,CAAC,YAAY,CAAC,GACtC,aAAa,CAAC,gBAAgB,CAAC,CAqBjC;AAED,uEAAuE;AACvE,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,GAC/C,aAAa,CAAC,sBAAsB,CAAC,CAsBvC;AAED,mDAAmD;AACnD,wBAAsB,mBAAmB,CACvC,YAAY,EAAE,YAAY,GACzB,OAAO,CAAC,aAAa,CAAC,cAAc,CAAC,CAAC,CA+BxC;AAED,+DAA+D;AAC/D,wBAAgB,2BAA2B,CACzC,UAAU,EAAE,aAAa,CAAC,YAAY,CAAC,GACtC,aAAa,CAAC,2BAA2B,CAAC,CAO5C"}
|
|
@@ -0,0 +1,333 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Snapshot Helper Collectors
|
|
3
|
+
* Heavy and analytics data collectors used by snapshotCollector.
|
|
4
|
+
*/
|
|
5
|
+
import { jobId as toJobId } from '../../domain/types/job';
|
|
6
|
+
/** Per-queue previous totals for delta-based throughput calculation */
|
|
7
|
+
const prevQueueTotals = new Map();
|
|
8
|
+
/** Per-queue previous waiting count for backlog velocity */
|
|
9
|
+
const prevQueueWaiting = new Map();
|
|
10
|
+
// ─── Heavy data collectors (called every ~90s) ───
|
|
11
|
+
/** Collect recent jobs — only from active queues */
|
|
12
|
+
export function collectRecentJobs(queueManager, activeQueueNames) {
|
|
13
|
+
if (activeQueueNames.length === 0)
|
|
14
|
+
return [];
|
|
15
|
+
const jobs = [];
|
|
16
|
+
const perQueue = Math.max(1, Math.floor(50 / activeQueueNames.length));
|
|
17
|
+
for (const name of activeQueueNames) {
|
|
18
|
+
try {
|
|
19
|
+
const queueJobs = queueManager.getJobs(name, {
|
|
20
|
+
state: ['waiting', 'active', 'delayed', 'completed', 'failed'],
|
|
21
|
+
start: 0,
|
|
22
|
+
end: perQueue - 1,
|
|
23
|
+
});
|
|
24
|
+
for (const j of queueJobs) {
|
|
25
|
+
const data = j.data;
|
|
26
|
+
const state = j.completedAt
|
|
27
|
+
? 'completed'
|
|
28
|
+
: j.startedAt
|
|
29
|
+
? 'active'
|
|
30
|
+
: j.runAt > Date.now()
|
|
31
|
+
? 'delayed'
|
|
32
|
+
: 'waiting';
|
|
33
|
+
jobs.push({
|
|
34
|
+
id: String(j.id),
|
|
35
|
+
name: data?.name ?? 'default',
|
|
36
|
+
queue: j.queue,
|
|
37
|
+
state,
|
|
38
|
+
data,
|
|
39
|
+
priority: j.priority,
|
|
40
|
+
createdAt: j.createdAt,
|
|
41
|
+
startedAt: j.startedAt ?? undefined,
|
|
42
|
+
completedAt: j.completedAt ?? undefined,
|
|
43
|
+
failedReason: state === 'active' && j.attempts > 0
|
|
44
|
+
? `Retry ${j.attempts}/${j.maxAttempts}`
|
|
45
|
+
: undefined,
|
|
46
|
+
attempts: j.attempts,
|
|
47
|
+
maxAttempts: j.maxAttempts,
|
|
48
|
+
duration: j.completedAt && j.startedAt ? j.completedAt - j.startedAt : undefined,
|
|
49
|
+
progress: j.progress > 0 ? j.progress : undefined,
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
catch {
|
|
54
|
+
// Skip queue on error
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
return jobs.sort((a, b) => b.createdAt - a.createdAt).slice(0, 50);
|
|
58
|
+
}
|
|
59
|
+
/** Collect DLQ entries — only from queues with DLQ > 0 */
|
|
60
|
+
export function collectDlqEntries(queueManager, dlqQueueNames) {
|
|
61
|
+
if (dlqQueueNames.length === 0)
|
|
62
|
+
return [];
|
|
63
|
+
const entries = [];
|
|
64
|
+
for (const name of dlqQueueNames) {
|
|
65
|
+
try {
|
|
66
|
+
const dlq = queueManager.getDlqEntries(name);
|
|
67
|
+
for (const e of dlq.slice(0, 20)) {
|
|
68
|
+
entries.push({
|
|
69
|
+
jobId: String(e.job.id),
|
|
70
|
+
queue: e.job.queue,
|
|
71
|
+
reason: e.reason,
|
|
72
|
+
error: e.error,
|
|
73
|
+
enteredAt: e.enteredAt,
|
|
74
|
+
retryCount: e.retryCount,
|
|
75
|
+
attempts: e.job.attempts,
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
catch {
|
|
80
|
+
// Skip
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
return entries.sort((a, b) => b.enteredAt - a.enteredAt).slice(0, 50);
|
|
84
|
+
}
|
|
85
|
+
/** Collect per-queue config */
|
|
86
|
+
export function collectQueueConfigs(queueManager, queueNames) {
|
|
87
|
+
const configs = {};
|
|
88
|
+
const perQueue = queueManager.getPerQueueStats();
|
|
89
|
+
for (const name of queueNames) {
|
|
90
|
+
try {
|
|
91
|
+
const stall = queueManager.getStallConfig(name);
|
|
92
|
+
const dlq = queueManager.getDlqConfig(name);
|
|
93
|
+
const pq = perQueue.get(name);
|
|
94
|
+
configs[name] = {
|
|
95
|
+
paused: queueManager.isPaused(name),
|
|
96
|
+
rateLimit: null,
|
|
97
|
+
concurrencyLimit: null,
|
|
98
|
+
concurrencyActive: pq?.active ?? 0,
|
|
99
|
+
stallConfig: { stallInterval: stall.stallInterval, maxStalls: stall.maxStalls },
|
|
100
|
+
dlqConfig: { maxRetries: dlq.maxAutoRetries, maxAge: dlq.maxAge ?? 0 },
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
catch {
|
|
104
|
+
// Skip
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
return configs;
|
|
108
|
+
}
|
|
109
|
+
/** Collect webhook delivery stats */
|
|
110
|
+
export function collectWebhooks(queueManager) {
|
|
111
|
+
try {
|
|
112
|
+
return queueManager.webhookManager.list().map((w) => ({
|
|
113
|
+
id: w.id,
|
|
114
|
+
url: w.url,
|
|
115
|
+
events: w.events,
|
|
116
|
+
queue: w.queue,
|
|
117
|
+
enabled: w.enabled,
|
|
118
|
+
successCount: w.successCount,
|
|
119
|
+
failureCount: w.failureCount,
|
|
120
|
+
lastTriggered: w.lastTriggered,
|
|
121
|
+
}));
|
|
122
|
+
}
|
|
123
|
+
catch {
|
|
124
|
+
return [];
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
/** Collect top errors — only from queues with DLQ entries */
|
|
128
|
+
export function collectTopErrors(queueManager, dlqQueueNames) {
|
|
129
|
+
if (dlqQueueNames.length === 0)
|
|
130
|
+
return [];
|
|
131
|
+
const errorMap = new Map();
|
|
132
|
+
const allEntries = dlqQueueNames.flatMap((name) => {
|
|
133
|
+
try {
|
|
134
|
+
return queueManager.getDlqEntries(name);
|
|
135
|
+
}
|
|
136
|
+
catch {
|
|
137
|
+
return [];
|
|
138
|
+
}
|
|
139
|
+
});
|
|
140
|
+
for (const e of allEntries) {
|
|
141
|
+
const msg = e.error ?? e.reason;
|
|
142
|
+
const existing = errorMap.get(msg);
|
|
143
|
+
if (existing) {
|
|
144
|
+
existing.count++;
|
|
145
|
+
if (e.enteredAt > existing.lastSeen) {
|
|
146
|
+
existing.lastSeen = e.enteredAt;
|
|
147
|
+
existing.queue = e.job.queue;
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
else {
|
|
151
|
+
errorMap.set(msg, { count: 1, queue: e.job.queue, lastSeen: e.enteredAt });
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
return [...errorMap.entries()]
|
|
155
|
+
.map(([message, data]) => ({ message, ...data }))
|
|
156
|
+
.sort((a, b) => b.count - a.count)
|
|
157
|
+
.slice(0, 20);
|
|
158
|
+
}
|
|
159
|
+
// ─── Analytics collectors (derived from recent jobs + queue state) ───
|
|
160
|
+
/** Compute per-queue throughput from delta of totalCompleted/totalFailed */
|
|
161
|
+
export function collectQueueThroughput(queues) {
|
|
162
|
+
const now = Date.now();
|
|
163
|
+
const result = {};
|
|
164
|
+
for (const q of queues) {
|
|
165
|
+
const prev = prevQueueTotals.get(q.name);
|
|
166
|
+
const total = q.totalCompleted + q.totalFailed;
|
|
167
|
+
if (prev) {
|
|
168
|
+
const elapsedSec = (now - prev.timestamp) / 1000;
|
|
169
|
+
if (elapsedSec > 0.5) {
|
|
170
|
+
const completeDelta = q.totalCompleted - prev.completed;
|
|
171
|
+
const failDelta = q.totalFailed - prev.failed;
|
|
172
|
+
result[q.name] = {
|
|
173
|
+
pushPerSec: Math.round(((completeDelta + failDelta) / elapsedSec) * 100) / 100,
|
|
174
|
+
completePerSec: Math.round((completeDelta / elapsedSec) * 100) / 100,
|
|
175
|
+
failPerSec: Math.round((failDelta / elapsedSec) * 100) / 100,
|
|
176
|
+
errorRate: total > 0 ? Math.round((q.totalFailed / total) * 10000) / 10000 : 0,
|
|
177
|
+
};
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
prevQueueTotals.set(q.name, {
|
|
181
|
+
completed: q.totalCompleted,
|
|
182
|
+
failed: q.totalFailed,
|
|
183
|
+
pushed: q.totalCompleted + q.totalFailed,
|
|
184
|
+
timestamp: now,
|
|
185
|
+
});
|
|
186
|
+
}
|
|
187
|
+
return result;
|
|
188
|
+
}
|
|
189
|
+
/** Compute per-worker utilization */
|
|
190
|
+
export function collectWorkerUtilization(queueManager) {
|
|
191
|
+
return queueManager.workerManager.list().map((w) => ({
|
|
192
|
+
id: w.id,
|
|
193
|
+
name: w.name,
|
|
194
|
+
utilization: w.concurrency > 0 ? Math.round((w.activeJobs / w.concurrency) * 100) / 100 : 0,
|
|
195
|
+
}));
|
|
196
|
+
}
|
|
197
|
+
/** Compute duration histogram from recent jobs */
|
|
198
|
+
export function collectDurationHistogram(recentJobs) {
|
|
199
|
+
const h = { lt100ms: 0, lt1s: 0, lt10s: 0, lt60s: 0, gt60s: 0 };
|
|
200
|
+
for (const j of recentJobs) {
|
|
201
|
+
if (!j.duration)
|
|
202
|
+
continue;
|
|
203
|
+
if (j.duration < 100)
|
|
204
|
+
h.lt100ms++;
|
|
205
|
+
else if (j.duration < 1000)
|
|
206
|
+
h.lt1s++;
|
|
207
|
+
else if (j.duration < 10000)
|
|
208
|
+
h.lt10s++;
|
|
209
|
+
else if (j.duration < 60000)
|
|
210
|
+
h.lt60s++;
|
|
211
|
+
else
|
|
212
|
+
h.gt60s++;
|
|
213
|
+
}
|
|
214
|
+
return h;
|
|
215
|
+
}
|
|
216
|
+
/** Compute per-queue wait time (createdAt → startedAt) from recent jobs */
|
|
217
|
+
export function collectQueueWaitTime(recentJobs) {
|
|
218
|
+
const byQueue = new Map();
|
|
219
|
+
for (const j of recentJobs) {
|
|
220
|
+
if (!j.startedAt || !j.createdAt)
|
|
221
|
+
continue;
|
|
222
|
+
const wait = j.startedAt - j.createdAt;
|
|
223
|
+
if (wait < 0)
|
|
224
|
+
continue;
|
|
225
|
+
let arr = byQueue.get(j.queue);
|
|
226
|
+
if (!arr) {
|
|
227
|
+
arr = [];
|
|
228
|
+
byQueue.set(j.queue, arr);
|
|
229
|
+
}
|
|
230
|
+
arr.push(wait);
|
|
231
|
+
}
|
|
232
|
+
const result = {};
|
|
233
|
+
for (const [queue, waits] of byQueue) {
|
|
234
|
+
const sum = waits.reduce((a, b) => a + b, 0);
|
|
235
|
+
result[queue] = {
|
|
236
|
+
avgMs: Math.round(sum / waits.length),
|
|
237
|
+
maxMs: Math.max(...waits),
|
|
238
|
+
minMs: Math.min(...waits),
|
|
239
|
+
};
|
|
240
|
+
}
|
|
241
|
+
return result;
|
|
242
|
+
}
|
|
243
|
+
/** Compute per-queue retry rate from recent jobs */
|
|
244
|
+
export function collectQueueRetryRate(recentJobs) {
|
|
245
|
+
const byQueue = new Map();
|
|
246
|
+
for (const j of recentJobs) {
|
|
247
|
+
let entry = byQueue.get(j.queue);
|
|
248
|
+
if (!entry) {
|
|
249
|
+
entry = { retrying: 0, total: 0 };
|
|
250
|
+
byQueue.set(j.queue, entry);
|
|
251
|
+
}
|
|
252
|
+
entry.total++;
|
|
253
|
+
if (j.attempts > 0)
|
|
254
|
+
entry.retrying++;
|
|
255
|
+
}
|
|
256
|
+
const result = {};
|
|
257
|
+
for (const [queue, data] of byQueue) {
|
|
258
|
+
result[queue] = {
|
|
259
|
+
retryRate: data.total > 0 ? Math.round((data.retrying / data.total) * 10000) / 10000 : 0,
|
|
260
|
+
retrying: data.retrying,
|
|
261
|
+
total: data.total,
|
|
262
|
+
};
|
|
263
|
+
}
|
|
264
|
+
return result;
|
|
265
|
+
}
|
|
266
|
+
/** Compute queue backlog velocity (delta waiting between snapshots) */
|
|
267
|
+
export function collectBacklogVelocity(queues) {
|
|
268
|
+
const now = Date.now();
|
|
269
|
+
const result = {};
|
|
270
|
+
for (const q of queues) {
|
|
271
|
+
const prev = prevQueueWaiting.get(q.name);
|
|
272
|
+
if (prev) {
|
|
273
|
+
const elapsedMin = (now - prev.timestamp) / 60000;
|
|
274
|
+
if (elapsedMin > 0.1) {
|
|
275
|
+
const delta = q.waiting - prev.waiting;
|
|
276
|
+
const deltaPerMin = Math.round((delta / elapsedMin) * 100) / 100;
|
|
277
|
+
result[q.name] = {
|
|
278
|
+
deltaWaiting: delta,
|
|
279
|
+
deltaPerMin,
|
|
280
|
+
trend: deltaPerMin > 5 ? 'growing' : deltaPerMin < -5 ? 'shrinking' : 'stable',
|
|
281
|
+
};
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
prevQueueWaiting.set(q.name, { waiting: q.waiting, timestamp: now });
|
|
285
|
+
}
|
|
286
|
+
return result;
|
|
287
|
+
}
|
|
288
|
+
/** Collect stall details from processing shards */
|
|
289
|
+
export async function collectStallDetails(queueManager) {
|
|
290
|
+
try {
|
|
291
|
+
const memStats = queueManager.getMemoryStats();
|
|
292
|
+
if (memStats.stalledCandidates === 0)
|
|
293
|
+
return [];
|
|
294
|
+
const stalledIds = queueManager
|
|
295
|
+
.stalledCandidates;
|
|
296
|
+
if (stalledIds.size === 0)
|
|
297
|
+
return [];
|
|
298
|
+
const now = Date.now();
|
|
299
|
+
const details = [];
|
|
300
|
+
const ids = [...stalledIds].slice(0, 20);
|
|
301
|
+
for (const id of ids) {
|
|
302
|
+
try {
|
|
303
|
+
const job = await queueManager.getJob(toJobId(id));
|
|
304
|
+
if (!job)
|
|
305
|
+
continue;
|
|
306
|
+
details.push({
|
|
307
|
+
jobId: id,
|
|
308
|
+
queue: job.queue,
|
|
309
|
+
workerId: null,
|
|
310
|
+
stalledAt: job.startedAt ?? now,
|
|
311
|
+
stalledForMs: now - (job.startedAt ?? now),
|
|
312
|
+
});
|
|
313
|
+
}
|
|
314
|
+
catch {
|
|
315
|
+
// Skip
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
return details;
|
|
319
|
+
}
|
|
320
|
+
catch {
|
|
321
|
+
return [];
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
/** Compute per-queue priority distribution from recent jobs */
|
|
325
|
+
export function collectPriorityDistribution(recentJobs) {
|
|
326
|
+
const result = {};
|
|
327
|
+
for (const j of recentJobs) {
|
|
328
|
+
result[j.queue] ??= {};
|
|
329
|
+
result[j.queue][j.priority] = (result[j.queue][j.priority] ?? 0) + 1;
|
|
330
|
+
}
|
|
331
|
+
return result;
|
|
332
|
+
}
|
|
333
|
+
//# sourceMappingURL=snapshotHelpers.js.map
|