diff --git a/packages/twenty-server/src/engine/core-modules/message-queue/drivers/bullmq.driver.ts b/packages/twenty-server/src/engine/core-modules/message-queue/drivers/bullmq.driver.ts index e44c15fcd92..d82b30cccde 100644 --- a/packages/twenty-server/src/engine/core-modules/message-queue/drivers/bullmq.driver.ts +++ b/packages/twenty-server/src/engine/core-modules/message-queue/drivers/bullmq.driver.ts @@ -1,4 +1,8 @@ -import { Logger, type OnModuleDestroy } from '@nestjs/common'; +import { + Logger, + type OnModuleDestroy, + type OnModuleInit, +} from '@nestjs/common'; import { type JobsOptions, @@ -29,7 +33,9 @@ export type BullMQDriverOptions = QueueOptions; const V4_LENGTH = 36; -export class BullMQDriver implements MessageQueueDriver, OnModuleDestroy { +export class BullMQDriver + implements MessageQueueDriver, OnModuleDestroy, OnModuleInit +{ private logger = new Logger(BullMQDriver.name); private queueMap: Record = {} as Record< MessageQueue, @@ -45,6 +51,27 @@ export class BullMQDriver implements MessageQueueDriver, OnModuleDestroy { private metricsService: MetricsService, ) {} + onModuleInit() { + this.metricsService.createObservableGauge( + 'twenty_queue_jobs_waiting_total', + { description: 'Current number of jobs waiting in queue' }, + async (observableResult) => { + for (const [queueName, queue] of Object.entries(this.queueMap)) { + try { + const waitingCount = await queue.count(); + + observableResult.observe(waitingCount, { queue: queueName }); + } catch (error) { + this.logger.error( + `Failed to collect waiting jobs metrics for queue ${queueName}`, + error, + ); + } + } + }, + ); + } + register(queueName: MessageQueue): void { this.queueMap[queueName] = new Queue(queueName, this.options); } diff --git a/packages/twenty-server/src/engine/core-modules/metrics/types/metrics-keys.type.ts b/packages/twenty-server/src/engine/core-modules/metrics/types/metrics-keys.type.ts index c9869ef5e9b..8a5964deb6d 100644 --- a/packages/twenty-server/src/engine/core-modules/metrics/types/metrics-keys.type.ts +++ b/packages/twenty-server/src/engine/core-modules/metrics/types/metrics-keys.type.ts @@ -32,4 +32,5 @@ export enum MetricsKeys { CommonApiQueryRateLimited = 'common-api-query/rate-limited', JobCompleted = 'job/completed', JobFailed = 'job/failed', + JobWaiting = 'job/waiting', }