UNPKG

dd-trace

Version:

Datadog APM tracing client for JavaScript

83 lines (65 loc) 2.14 kB
'use strict' const ConsumerPlugin = require('../../dd-trace/src/plugins/consumer') const { getMessageSize } = require('../../dd-trace/src/datastreams') class BullmqConsumerPlugin extends ConsumerPlugin { static id = 'bullmq' static prefix = 'tracing:orchestrion:bullmq:Worker_callProcessJob' asyncEnd (ctx) { ctx.currentStore?.span?.finish() } start (ctx) { if (!this.config.dsmEnabled) return const { span } = ctx.currentStore this.setConsumerCheckpoint(span, ctx) } bindStart (ctx) { const job = ctx.arguments?.[0] const queueName = job?.queueName || job?.queue?.name || 'bullmq' let childOf const ddCarrier = this._extractDatadog(job) if (ddCarrier) { ctx._ddCarrier = ddCarrier childOf = this.tracer.extract('text_map', ddCarrier) } this.startSpan({ childOf, resource: queueName, meta: { component: 'bullmq', 'span.kind': 'consumer', 'messaging.system': 'bullmq', 'messaging.destination.name': queueName, 'messaging.operation': 'process', }, }, ctx) return ctx.currentStore } setConsumerCheckpoint (span, ctx) { const job = ctx.arguments?.[0] if (!job) return const queueName = job.queueName || job.queue?.name || 'bullmq' const payloadSize = job.data ? getMessageSize(job.data) : 0 const ddCarrier = ctx._ddCarrier if (ddCarrier) { this.tracer.decodeDataStreamsContext(ddCarrier) } const edgeTags = ['direction:in', `topic:${queueName}`, 'type:bullmq'] this.tracer.setCheckpoint(edgeTags, span, payloadSize) } _extractDatadog (job) { const metadataStr = job?.opts?.telemetry?.metadata if (!metadataStr) return try { const metadata = JSON.parse(metadataStr) const ddCarrier = metadata._datadog if (!ddCarrier) return // Clean up only our _datadog key, preserve other metadata delete metadata._datadog job.opts.telemetry.metadata = JSON.stringify(metadata) return ddCarrier } catch { // Ignore malformed metadata } } } module.exports = BullmqConsumerPlugin