@lokalise/fastify-extras
Version:
Opinionated set of fastify plugins, commonly used in Lokalise
49 lines • 1.81 kB
JavaScript
import { Queue, QueueEvents } from 'bullmq';
export class ObservableQueue {
queue;
events;
metrics;
logger;
async collectDurationMetric(jobId, status) {
try {
const job = await this.queue.getJob(jobId);
if (!job || !job.finishedOn) {
return;
}
this.metrics.finishedDuration
.labels({ status, queue: this.queue.name })
.observe(job.finishedOn - job.timestamp);
if (job.processedOn) {
this.metrics.processedDuration
.labels({ status, queue: this.queue.name })
.observe(job.finishedOn - job.processedOn);
}
}
catch (err) {
this.logger.warn(err);
}
}
constructor(name, redisConfig, metrics, logger) {
this.queue = new Queue(name, { connection: redisConfig });
this.events = new QueueEvents(name, { connection: redisConfig, autorun: true });
this.metrics = metrics;
this.logger = logger;
this.events.on('failed', async ({ jobId }) => {
await this.collectDurationMetric(jobId, 'failed');
});
this.events.on('completed', async ({ jobId }) => {
await this.collectDurationMetric(jobId, 'completed');
});
}
async collect() {
const countByStatus = await this.queue.getJobCounts('active', 'delayed', 'paused', 'prioritized', 'waiting', 'waiting-children');
for (const [status, count] of Object.entries(countByStatus)) {
this.metrics.countGauge.set({ status, queue: this.queue.name }, count);
}
}
async dispose() {
await this.events.close();
await this.queue.close();
}
}
//# sourceMappingURL=ObservableQueue.js.map