newrelic
Version:
New Relic agent
69 lines (60 loc) • 2.02 kB
JavaScript
/*
* Copyright 2025 New Relic Corporation. All rights reserved.
* SPDX-License-Identifier: Apache-2.0
*/
const MessageConsumerSubscriber = require('#agentlib/subscribers/message-consumer.js')
const {
DESTINATION_TYPE_EXCHANGE,
LIB_RABBITMQ,
TRANSPORT_TYPE_AMQP
} = require('#agentlib/message-broker-description.js')
const { getParameters, getParametersFromMessage, TEMP_RE } = require('./utils')
class ConsumeSubscriber extends MessageConsumerSubscriber {
constructor({ agent, logger, channelName = 'nr_consume' }) {
super({
agent,
logger,
packageName: 'amqplib',
channelName,
system: LIB_RABBITMQ,
type: DESTINATION_TYPE_EXCHANGE,
callback: 1,
transport: TRANSPORT_TYPE_AMQP
})
this.segmentName = 'amqplib.Channel#consume'
}
/**
* Handles the consumption of a message(s),
* this will create a new transaction every time this function is called.
* @param {object} data the data associated with the `asyncStart` event
*/
asyncStart(data) {
const [queue] = data?.arguments
const message = data?.error
this.consumerParameters = getParametersFromMessage.call(this, { channel: data?.self, message })
this.headers = message?.properties?.headers
this.destination = this.getExchange(message?.fields)
this.queue = queue
super.asyncStart(data)
}
getExchange(fields = {}) {
const isDefault = fields.exchange === ''
let exchange = 'Default'
if (!isDefault) {
exchange = TEMP_RE.test(fields.exchange) ? null : fields.exchange
}
return exchange
}
/**
* Handles the creation of the segment if `channel.consume` is made within
* an active transaction.
* @param {object} data the data associated with the subscribed event
* @param {object} ctx context
*/
handler(data, ctx) {
this.parameters = {}
getParameters.call(this, { params: this.parameters, channel: data.self })
return super.handler(data, ctx)
}
}
module.exports = ConsumeSubscriber