UNPKG

@lokalise/fastify-extras

Version:

Opinionated set of fastify plugins, commonly used in Lokalise

49 lines 1.81 kB
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