37 lines
1.3 KiB
TypeScript
37 lines
1.3 KiB
TypeScript
import { Worker, Job } from 'bullmq';
|
|
import logger from './logging';
|
|
|
|
const jobStartTimes = new Map<string | number, number>();
|
|
|
|
export function attachWorkerEvents(worker: Worker) {
|
|
worker.on('active', (job: Job) => {
|
|
jobStartTimes.set(job.id, Date.now());
|
|
logger.info({ event: 'job_active', jobId: job.id, name: job.name, data: job.data });
|
|
});
|
|
|
|
worker.on('completed', (job: Job) => {
|
|
const start = jobStartTimes.get(job.id) || Date.now();
|
|
const durationMs = Date.now() - start;
|
|
jobStartTimes.delete(job.id);
|
|
logger.info({ event: 'job_complete', jobId: job.id, durationMs, timestamp: new Date().toISOString() });
|
|
});
|
|
|
|
worker.on('failed', (job: Job | undefined, err: Error | undefined) => {
|
|
const jobId = job?.id;
|
|
const start = jobId ? jobStartTimes.get(jobId) : undefined;
|
|
const durationMs = start ? Date.now() - start : undefined;
|
|
if (jobId) jobStartTimes.delete(jobId);
|
|
logger.error({ event: 'job_failed', jobId, error: err?.message, stack: err?.stack, durationMs });
|
|
});
|
|
|
|
worker.on('progress', (job: Job, progress) => {
|
|
logger.info({ event: 'job_progress', jobId: job.id, progress });
|
|
});
|
|
|
|
worker.on('error', (err: Error) => {
|
|
logger.error({ event: 'worker_error', error: err?.message, stack: err?.stack });
|
|
});
|
|
}
|
|
|
|
export default attachWorkerEvents;
|