dd-trace
Version:
Datadog APM tracing client for JavaScript
84 lines (66 loc) • 2.3 kB
JavaScript
const log = require('../../dd-trace/src/log')
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
// Avoid `delete`'s hidden-class transition; JSON.stringify also omits undefined values.
metadata._datadog = undefined
job.opts.telemetry.metadata = JSON.stringify(metadata)
return ddCarrier
} catch (error) {
log.warn('bullmq: skipping _datadog extract on malformed telemetry.metadata: %s', error.message)
}
}
}
module.exports = BullmqConsumerPlugin