From e1865a482027ff37e8ff62a1f4aa4751b62af445 Mon Sep 17 00:00:00 2001 From: Oren Ben-Meir Date: Tue, 11 Nov 2025 16:22:53 -0500 Subject: [PATCH] Remove deprecated amqp modules 2.5.0, 2.4.1, 1.7.2 --- .../rabbit-amqp-1.7.2/build.gradle | 19 - .../java/RabbitMQTest_Integration.java | 225 ------------ .../rabbitamqp172/InboundWrapper.java | 48 --- .../rabbitamqp172/OutboundWrapper.java | 32 -- .../rabbitamqp172/RabbitAMQPMetricUtil.java | 136 ------- .../client/Consumer_Instrumentation.java | 33 -- .../FileProperties_Instrumentation.java | 17 - .../QueueingConsumer_Instrumentation.java | 50 --- .../client/impl/ChannelN_Instrumentation.java | 67 ---- .../rabbitamqp172/RabbitMQTest.java | 341 ----------------- .../rabbit-amqp-2.4.1/build.gradle | 19 - .../java/RabbitMQTest_Integration.java | 225 ------------ .../rabbitamqp241/InboundWrapper.java | 48 --- .../rabbitamqp241/OutboundWrapper.java | 32 -- .../rabbitamqp241/RabbitAMQPMetricUtil.java | 144 -------- .../client/Consumer_Instrumentation.java | 33 -- .../FileProperties_Instrumentation.java | 17 - .../QueueingConsumer_Instrumentation.java | 50 --- .../client/impl/ChannelN_Instrumentation.java | 67 ---- .../rabbitamqp241/RabbitMQTest.java | 341 ----------------- .../rabbit-amqp-2.5.0/build.gradle | 20 - .../rabbitamqp250/InboundWrapper.java | 48 --- .../rabbitamqp250/OutboundWrapper.java | 32 -- .../rabbitamqp250/RabbitAMQPMetricUtil.java | 144 -------- .../client/Consumer_Instrumentation.java | 33 -- .../QueueingConsumer_Instrumentation.java | 50 --- .../client/impl/ChannelN_Instrumentation.java | 67 ---- .../rabbitamqp250/RabbitMQTest.java | 342 ------------------ settings.gradle | 3 - 29 files changed, 2683 deletions(-) delete mode 100644 instrumentation/rabbit-amqp-1.7.2/build.gradle delete mode 100644 instrumentation/rabbit-amqp-1.7.2/src/integration-test/java/RabbitMQTest_Integration.java delete mode 100644 instrumentation/rabbit-amqp-1.7.2/src/main/java/com/nr/agent/instrumentation/rabbitamqp172/InboundWrapper.java delete mode 100644 instrumentation/rabbit-amqp-1.7.2/src/main/java/com/nr/agent/instrumentation/rabbitamqp172/OutboundWrapper.java delete mode 100644 instrumentation/rabbit-amqp-1.7.2/src/main/java/com/nr/agent/instrumentation/rabbitamqp172/RabbitAMQPMetricUtil.java delete mode 100644 instrumentation/rabbit-amqp-1.7.2/src/main/java/com/rabbitmq/client/Consumer_Instrumentation.java delete mode 100644 instrumentation/rabbit-amqp-1.7.2/src/main/java/com/rabbitmq/client/FileProperties_Instrumentation.java delete mode 100644 instrumentation/rabbit-amqp-1.7.2/src/main/java/com/rabbitmq/client/QueueingConsumer_Instrumentation.java delete mode 100644 instrumentation/rabbit-amqp-1.7.2/src/main/java/com/rabbitmq/client/impl/ChannelN_Instrumentation.java delete mode 100644 instrumentation/rabbit-amqp-1.7.2/src/test/java/com/nr/agent/instrumentation/rabbitamqp172/RabbitMQTest.java delete mode 100644 instrumentation/rabbit-amqp-2.4.1/build.gradle delete mode 100644 instrumentation/rabbit-amqp-2.4.1/src/integration-test/java/RabbitMQTest_Integration.java delete mode 100644 instrumentation/rabbit-amqp-2.4.1/src/main/java/com/nr/agent/instrumentation/rabbitamqp241/InboundWrapper.java delete mode 100644 instrumentation/rabbit-amqp-2.4.1/src/main/java/com/nr/agent/instrumentation/rabbitamqp241/OutboundWrapper.java delete mode 100644 instrumentation/rabbit-amqp-2.4.1/src/main/java/com/nr/agent/instrumentation/rabbitamqp241/RabbitAMQPMetricUtil.java delete mode 100644 instrumentation/rabbit-amqp-2.4.1/src/main/java/com/rabbitmq/client/Consumer_Instrumentation.java delete mode 100644 instrumentation/rabbit-amqp-2.4.1/src/main/java/com/rabbitmq/client/FileProperties_Instrumentation.java delete mode 100644 instrumentation/rabbit-amqp-2.4.1/src/main/java/com/rabbitmq/client/QueueingConsumer_Instrumentation.java delete mode 100644 instrumentation/rabbit-amqp-2.4.1/src/main/java/com/rabbitmq/client/impl/ChannelN_Instrumentation.java delete mode 100644 instrumentation/rabbit-amqp-2.4.1/src/test/java/com/nr/agent/instrumentation/rabbitamqp241/RabbitMQTest.java delete mode 100644 instrumentation/rabbit-amqp-2.5.0/build.gradle delete mode 100644 instrumentation/rabbit-amqp-2.5.0/src/main/java/com/nr/agent/instrumentation/rabbitamqp250/InboundWrapper.java delete mode 100644 instrumentation/rabbit-amqp-2.5.0/src/main/java/com/nr/agent/instrumentation/rabbitamqp250/OutboundWrapper.java delete mode 100644 instrumentation/rabbit-amqp-2.5.0/src/main/java/com/nr/agent/instrumentation/rabbitamqp250/RabbitAMQPMetricUtil.java delete mode 100644 instrumentation/rabbit-amqp-2.5.0/src/main/java/com/rabbitmq/client/Consumer_Instrumentation.java delete mode 100644 instrumentation/rabbit-amqp-2.5.0/src/main/java/com/rabbitmq/client/QueueingConsumer_Instrumentation.java delete mode 100644 instrumentation/rabbit-amqp-2.5.0/src/main/java/com/rabbitmq/client/impl/ChannelN_Instrumentation.java delete mode 100644 instrumentation/rabbit-amqp-2.5.0/src/test/java/com/nr/agent/instrumentation/rabbitamqp250/RabbitMQTest.java diff --git a/instrumentation/rabbit-amqp-1.7.2/build.gradle b/instrumentation/rabbit-amqp-1.7.2/build.gradle deleted file mode 100644 index 45d82aee7d..0000000000 --- a/instrumentation/rabbit-amqp-1.7.2/build.gradle +++ /dev/null @@ -1,19 +0,0 @@ -dependencies { - implementation(project(":agent-bridge")) - implementation("com.rabbitmq:amqp-client:1.7.2") - testImplementation("io.arivera.oss:embedded-rabbitmq:1.4.0") - testImplementation("org.slf4j:slf4j-simple:1.7.30") -} - -jar { - manifest { attributes 'Implementation-Title': 'com.newrelic.instrumentation.rabbit-amqp-1.7.2' } -} - -verifyInstrumentation { - passesOnly 'com.rabbitmq:amqp-client:[1.7.2,2.4.1)' -} - -site { - title 'RabbitAMQP' - type 'Messaging' -} \ No newline at end of file diff --git a/instrumentation/rabbit-amqp-1.7.2/src/integration-test/java/RabbitMQTest_Integration.java b/instrumentation/rabbit-amqp-1.7.2/src/integration-test/java/RabbitMQTest_Integration.java deleted file mode 100644 index fe4225b5a0..0000000000 --- a/instrumentation/rabbit-amqp-1.7.2/src/integration-test/java/RabbitMQTest_Integration.java +++ /dev/null @@ -1,225 +0,0 @@ -/* - * - * * Copyright 2024 New Relic Corporation. All rights reserved. - * * SPDX-License-Identifier: Apache-2.0 - * - */ -import com.newrelic.agent.introspec.InstrumentationTestConfig; -import com.newrelic.agent.introspec.InstrumentationTestRunner; -import com.newrelic.agent.introspec.Introspector; -import com.newrelic.agent.introspec.TraceSegment; -import com.newrelic.agent.introspec.TracedMetricData; -import com.newrelic.agent.introspec.TransactionEvent; -import com.newrelic.agent.introspec.TransactionTrace; -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Trace; -import com.rabbitmq.client.AMQP; -import com.rabbitmq.client.Channel; -import com.rabbitmq.client.Connection; -import com.rabbitmq.client.ConnectionFactory; -import com.rabbitmq.client.DefaultConsumer; -import com.rabbitmq.client.Envelope; -import com.rabbitmq.client.GetResponse; -import com.rabbitmq.client.QueueingConsumer; -import org.junit.After; -import org.junit.Before; -import org.junit.Ignore; -import org.junit.Test; -import org.junit.runner.RunWith; - -import java.io.IOException; -import java.util.Collection; -import java.util.Collections; -import java.util.LinkedList; -import java.util.Map; -import java.util.Queue; -import java.util.UUID; - -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertTrue; - -@Ignore -@RunWith(InstrumentationTestRunner.class) -@InstrumentationTestConfig(includePrefixes = { "com.rabbitmq.client", "com.rabbitmq.client.impl"}) -public class RabbitMQTest_Integration { - private Channel channel; - private String DEFAULT_EXCHANGE = ""; - - @Before - public void setUp() throws IOException { - ConnectionFactory factory = new ConnectionFactory(); - Connection connection = factory.newConnection("localhost"); - channel = connection.createChannel(); - } - - @After - public void tearDown() throws IOException { - channel.getConnection().close(); - } - - @Test - public void testProduceConsume() throws IOException { - final String queueName = UUID.randomUUID().toString(); - putAndGetInTransaction(queueName); - - Introspector introspector = InstrumentationTestRunner.getIntrospector(); - - String expectedTransactionName = String.format("OtherTransaction/Message/RabbitMQ/Queue/Named/%s", queueName); - final Collection transactionNames = introspector.getTransactionNames(); - assertTrue(transactionNames.contains(expectedTransactionName)); - - Map metrics = introspector.getMetricsForTransaction(expectedTransactionName); - assertTrue(metrics.containsKey(String.format("MessageBroker/RabbitMQ/Queue/Consume/Named/%s", queueName))); - assertTrue(metrics.containsKey(String.format("MessageBroker/RabbitMQ/Queue/Produce/Named/%s", queueName))); - } - - @Test - public void testMessageListener() throws IOException, InterruptedException { - final String queueName = UUID.randomUUID().toString(); - final String messageForListener = "Hello message listener!"; - - channel.queueDeclare(queueName, false, false, true, true, Collections. emptyMap()); - channel.basicPublish(DEFAULT_EXCHANGE, queueName, new AMQP.BasicProperties(), messageForListener.getBytes()); - channel.basicConsume(queueName, new DefaultConsumer(channel) { - @Override - public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, - byte[] body) throws IOException { - assertEquals(messageForListener, new String(body)); - } - }); - - // Let handleDelivery Transaction to finish. - Thread.sleep(1000); - - Introspector introspector = InstrumentationTestRunner.getIntrospector(); - - String expectedTransactionName = String.format("OtherTransaction/Message/RabbitMQ/Queue/Named/%s", queueName); - final Collection transactionNames = introspector.getTransactionNames(); - assertTrue(transactionNames.contains(expectedTransactionName)); - - Map metrics = introspector.getMetricsForTransaction(expectedTransactionName); - assertTrue(metrics.containsKey(String.format("MessageBroker/RabbitMQ/Queue/Consume/Named/%s", queueName))); - } - - @Test - public void testCat() throws IOException, InterruptedException { - final String queueName = UUID.randomUUID().toString(); - channel.queueDeclare(queueName, false, false, true, true, Collections. emptyMap()); - final String replyMessage = "reply"; - - channel.basicConsume(queueName, new DefaultConsumer(channel) { - @Override - public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, - byte[] body) throws IOException { - channel.basicPublish(DEFAULT_EXCHANGE, properties.getReplyTo(), new AMQP.BasicProperties(), - replyMessage.getBytes()); - } - }); - - Thread thread = new Thread(new Runnable() { - @Override - @Trace(dispatcher = true) - public void run() { - NewRelic.setTransactionName("Category", "Sender"); - - try { - String tempQueue = channel.queueDeclare().getQueue(); - AMQP.BasicProperties properties = new AMQP.BasicProperties(); - properties.setReplyTo(tempQueue); - channel.basicPublish(DEFAULT_EXCHANGE, queueName, properties, "message".getBytes()); - - QueueingConsumer queueingConsumer = new QueueingConsumer(channel); - channel.basicConsume(tempQueue, true, queueingConsumer); - - // block - QueueingConsumer.Delivery delivery = queueingConsumer.nextDelivery(); - assertEquals(replyMessage, new String(delivery.getBody())); - - } catch (IOException e) { - } catch (InterruptedException e) { - } - } - }); - - thread.start(); - thread.join(2000); - - Introspector introspector = InstrumentationTestRunner.getIntrospector(); - - String senderTransactioName = "OtherTransaction/Category/Sender"; - String messageListenerTransactionName = String.format("OtherTransaction/Message/RabbitMQ/Queue/Named/%s", - queueName); - - final Collection transactionNames = introspector.getTransactionNames(); - assertTrue(transactionNames.contains(senderTransactioName)); - assertTrue(transactionNames.contains(messageListenerTransactionName)); - - Map senderMetrics = introspector.getMetricsForTransaction(senderTransactioName); - Map messageListenerMetrics = introspector.getMetricsForTransaction( - messageListenerTransactionName); - - assertTrue(senderMetrics.containsKey(String.format("MessageBroker/RabbitMQ/Queue/Produce/Named/%s", - queueName))); - assertTrue(senderMetrics.containsKey("MessageBroker/RabbitMQ/Queue/Consume/Temp")); - - assertTrue(messageListenerMetrics.containsKey(String.format("MessageBroker/RabbitMQ/Queue/Consume/Named/%s", - queueName))); - assertTrue(messageListenerMetrics.containsKey("MessageBroker/RabbitMQ/Queue/Produce/Temp")); - - // Ideally, the block below could be replaced with the following line: - // CatHelper.verifyOneSuccessfulCat(introspector, senderTransactioName, messageListenerTransactionName); - { - TransactionTrace senderTT = introspector.getTransactionTracesForTransaction( - senderTransactioName).iterator().next(); - TransactionTrace messageListenerTT = introspector.getTransactionTracesForTransaction( - messageListenerTransactionName).iterator().next(); - - Map senderTTIntrinsics = senderTT.getIntrinsicAttributes(); - Map messageListenerTTIntrinsics = messageListenerTT.getIntrinsicAttributes(); - - assertNotNull(senderTTIntrinsics.get("trip_id")); - assertNotNull(senderTTIntrinsics.get("path_hash")); - assertNotNull(getAttribute(senderTT, "transaction_guid")); - assertNotNull(messageListenerTTIntrinsics.get("referring_transaction_guid")); - assertNotNull(messageListenerTTIntrinsics.get("client_cross_process_id")); - - TransactionEvent senderEvent = introspector.getTransactionEvents(senderTransactioName).iterator().next(); - TransactionEvent messageListenerEvent = introspector.getTransactionEvents(messageListenerTransactionName).iterator().next(); - - assertEquals(senderEvent.getMyGuid(), messageListenerEvent.getReferrerGuid()); - } - - } - - private String getAttribute(TransactionTrace senderTT, String attributeName) { - Queue queue = new LinkedList(); - queue.offer(senderTT.getInitialTraceSegment()); - - while (!queue.isEmpty()) { - TraceSegment segment = queue.poll(); - if (segment.getTracerAttributes().containsKey(attributeName)) { - return (String) segment.getTracerAttributes().get(attributeName); - } - - for (TraceSegment childSegment : segment.getChildren()) { - queue.offer(childSegment); - } - } - - return null; - } - - - @Trace(dispatcher = true) - public void putAndGetInTransaction(String queueName) throws IOException { - channel.queueDeclare(queueName, false, false, true, true, Collections. emptyMap()); - - AMQP.BasicProperties properties = new AMQP.BasicProperties(); - channel.basicPublish(DEFAULT_EXCHANGE, queueName, properties, "message".getBytes()); - - GetResponse response = channel.basicGet(queueName, true); - assertEquals("message", new String(response.getBody())); - } - -} \ No newline at end of file diff --git a/instrumentation/rabbit-amqp-1.7.2/src/main/java/com/nr/agent/instrumentation/rabbitamqp172/InboundWrapper.java b/instrumentation/rabbit-amqp-1.7.2/src/main/java/com/nr/agent/instrumentation/rabbitamqp172/InboundWrapper.java deleted file mode 100644 index d5642712a2..0000000000 --- a/instrumentation/rabbit-amqp-1.7.2/src/main/java/com/nr/agent/instrumentation/rabbitamqp172/InboundWrapper.java +++ /dev/null @@ -1,48 +0,0 @@ -/* - * - * * Copyright 2020 New Relic Corporation. All rights reserved. - * * SPDX-License-Identifier: Apache-2.0 - * - */ - -package com.nr.agent.instrumentation.rabbitamqp172; - -import java.util.Collections; -import java.util.List; -import java.util.Map; - -import com.newrelic.api.agent.HeaderType; -import com.newrelic.api.agent.ExtendedInboundHeaders; - -public class InboundWrapper extends ExtendedInboundHeaders { - private final Map delegate; - - public InboundWrapper(Map arguments) { - super(); - this.delegate = arguments; - } - - @Override - public String getHeader(String name) { - Object property = delegate.get(name); - if (property == null) { - return null; - } - return property.toString(); - } - - @Override - public List getHeaders(String name) { - String result = getHeader(name); - if (result == null) { - return null; - } - return Collections.singletonList(result); - } - - @Override - public HeaderType getHeaderType() { - return HeaderType.MESSAGE; - } - -} diff --git a/instrumentation/rabbit-amqp-1.7.2/src/main/java/com/nr/agent/instrumentation/rabbitamqp172/OutboundWrapper.java b/instrumentation/rabbit-amqp-1.7.2/src/main/java/com/nr/agent/instrumentation/rabbitamqp172/OutboundWrapper.java deleted file mode 100644 index e7343f7730..0000000000 --- a/instrumentation/rabbit-amqp-1.7.2/src/main/java/com/nr/agent/instrumentation/rabbitamqp172/OutboundWrapper.java +++ /dev/null @@ -1,32 +0,0 @@ -/* - * - * * Copyright 2020 New Relic Corporation. All rights reserved. - * * SPDX-License-Identifier: Apache-2.0 - * - */ - -package com.nr.agent.instrumentation.rabbitamqp172; - -import java.util.Map; - -import com.newrelic.api.agent.HeaderType; -import com.newrelic.api.agent.OutboundHeaders; - -public class OutboundWrapper implements OutboundHeaders { - - private final Map delegate; - - public OutboundWrapper(Map headers) { - this.delegate = headers; - } - - @Override - public void setHeader(String name, String value) { - delegate.put(name, value); - } - - @Override - public HeaderType getHeaderType() { - return HeaderType.MESSAGE; - } -} diff --git a/instrumentation/rabbit-amqp-1.7.2/src/main/java/com/nr/agent/instrumentation/rabbitamqp172/RabbitAMQPMetricUtil.java b/instrumentation/rabbit-amqp-1.7.2/src/main/java/com/nr/agent/instrumentation/rabbitamqp172/RabbitAMQPMetricUtil.java deleted file mode 100644 index 6d9c1964e4..0000000000 --- a/instrumentation/rabbit-amqp-1.7.2/src/main/java/com/nr/agent/instrumentation/rabbitamqp172/RabbitAMQPMetricUtil.java +++ /dev/null @@ -1,136 +0,0 @@ -/* - * - * * Copyright 2020 New Relic Corporation. All rights reserved. - * * SPDX-License-Identifier: Apache-2.0 - * - */ - -package com.nr.agent.instrumentation.rabbitamqp172; - -import com.newrelic.agent.bridge.AgentBridge; -import com.newrelic.agent.bridge.TracedMethod; -import com.newrelic.agent.bridge.TransactionNamePriority; -import com.newrelic.api.agent.DestinationType; -import com.newrelic.api.agent.MessageConsumeParameters; -import com.newrelic.api.agent.MessageProduceParameters; -import com.rabbitmq.client.AMQP; -import com.rabbitmq.client.Connection; - -import java.text.MessageFormat; -import java.util.HashMap; -import java.util.Map; - -public abstract class RabbitAMQPMetricUtil { - private static final String RABBITMQ = "RabbitMQ"; - - private static final String MESSAGE_BROKER_TRANSACTION_EXCHANGE_NAMED = "RabbitMQ/Exchange/Named/{0}"; - - private static final String MESSAGE = "Message"; - private static final String DEFAULT = "Default"; - - private static final boolean captureSegmentParameters = AgentBridge.getAgent() - .getConfig() - .getValue("message_tracer.segment_parameters.enabled", Boolean.TRUE); - - public static void nameTransaction(String exchangeName) { - String transactionName = MessageFormat.format(MESSAGE_BROKER_TRANSACTION_EXCHANGE_NAMED, - exchangeName.isEmpty() ? DEFAULT : exchangeName); - AgentBridge.getAgent() - .getTransaction() - .setTransactionName(TransactionNamePriority.FRAMEWORK, false, MESSAGE, transactionName); - } - - public static void processSendMessage(String exchangeName, String routingKey, - HashMap headers, - AMQP.BasicProperties props, TracedMethod tracedMethod, Connection connection) { - String host = getHost(connection); - Integer port = getPort(connection); - tracedMethod.reportAsExternal(MessageProduceParameters - .library(RABBITMQ) - .destinationType(DestinationType.EXCHANGE) - .destinationName(wrapExchange(exchangeName)) - .outboundHeaders(new OutboundWrapper(headers)) - .instance(host, port) - .build()); - - addProduceAttributes(exchangeName, routingKey, props); - } - - public static void processGetMessage(String queueName, String routingKey, String exchangeName, - AMQP.BasicProperties properties, TracedMethod tracedMethod, Connection connection) { - String host = getHost(connection); - Integer port = getPort(connection); - tracedMethod.reportAsExternal(MessageConsumeParameters - .library(RABBITMQ) - .destinationType(DestinationType.EXCHANGE) - .destinationName(wrapExchange(exchangeName)) - .inboundHeaders(new InboundWrapper(properties.getHeaders())) - .instance(host, port) - .build()); - - addConsumeAttributes(exchangeName, queueName, routingKey, properties); - } - - public static void addConsumeAttributes(String exchangeName, String queueName, String routingKey, AMQP.BasicProperties properties) { - if (queueName != null && captureSegmentParameters) { - AgentBridge.privateApi.addTracerParameter("message.queueName", queueName, true); - // OTel attributes - AgentBridge.privateApi.addTracerParameter("messaging.destination.name", queueName, true); - if (exchangeName != null) { - AgentBridge.privateApi.addTracerParameter("messaging.destination_publish.name", exchangeName, true); - } - } - addAttributes(routingKey, properties); - } - - public static void addProduceAttributes(String exchangeName, String routingKey, AMQP.BasicProperties properties) { - if (exchangeName != null && captureSegmentParameters) { - // OTel attributes - AgentBridge.privateApi.addTracerParameter("messaging.destination.name", wrapExchange(exchangeName), true); - } - addAttributes(routingKey, properties); - } - - public static String wrapExchange(String exchangeName) { - return exchangeName.isEmpty() ? DEFAULT : exchangeName; - } - - public static void queuePurge(String queue, TracedMethod tracedMethod) { - tracedMethod.setMetricName(MessageFormat.format("MessageBroker/{0}/Queue/Purge/Named/{1}", - RABBITMQ, queue.isEmpty() ? DEFAULT : queue)); - } - - private static String getHost(Connection connection) { - return (connection != null) ? connection.getHost() : null; - } - - private static Integer getPort(Connection connection) { - return (connection != null) ? connection.getPort() : null; - } - - private static void addAttributes(String routingKey, AMQP.BasicProperties properties) { - if (!captureSegmentParameters) { - return; - } - - AgentBridge.privateApi.addTracerParameter("message.routingKey", routingKey, true); - // Add Open Telemetry attribute for routing key to be added to spans - AgentBridge.privateApi.addTracerParameter("messaging.rabbitmq.destination.routing_key", routingKey, true); - if (properties.getReplyTo() != null) { - AgentBridge.privateApi.addTracerParameter("message.replyTo", properties.getReplyTo()); - } - if (properties.getCorrelationId() != null) { - AgentBridge.privateApi.addTracerParameter("message.correlationId", properties.getCorrelationId()); - } - if (properties.getHeaders() != null) { - for (Map.Entry entry : properties.getHeaders().entrySet()) { - if (entry.getKey().equals("NewRelicTransaction") || entry.getKey().equals("NewRelicID")) { - continue; - } - - AgentBridge.privateApi.addTracerParameter("message.headers." + entry.getKey(), entry.toString()); - } - } - } - -} diff --git a/instrumentation/rabbit-amqp-1.7.2/src/main/java/com/rabbitmq/client/Consumer_Instrumentation.java b/instrumentation/rabbit-amqp-1.7.2/src/main/java/com/rabbitmq/client/Consumer_Instrumentation.java deleted file mode 100644 index 9a22219645..0000000000 --- a/instrumentation/rabbit-amqp-1.7.2/src/main/java/com/rabbitmq/client/Consumer_Instrumentation.java +++ /dev/null @@ -1,33 +0,0 @@ -/* - * - * * Copyright 2020 New Relic Corporation. All rights reserved. - * * SPDX-License-Identifier: Apache-2.0 - * - */ - -package com.rabbitmq.client; - -import java.io.IOException; - -import com.newrelic.agent.bridge.AgentBridge; -import com.newrelic.api.agent.TransportType; -import com.newrelic.api.agent.Trace; -import com.newrelic.api.agent.weaver.MatchType; -import com.newrelic.api.agent.weaver.Weave; -import com.newrelic.api.agent.weaver.Weaver; -import com.nr.agent.instrumentation.rabbitamqp172.InboundWrapper; -import com.nr.agent.instrumentation.rabbitamqp172.RabbitAMQPMetricUtil; - -@Weave(type = MatchType.Interface, originalName = "com.rabbitmq.client.Consumer") -public abstract class Consumer_Instrumentation { - - @Trace(dispatcher = true) - public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) - throws IOException { - RabbitAMQPMetricUtil.nameTransaction(envelope.getExchange()); - AgentBridge.getAgent().getTransaction().provideHeaders(new InboundWrapper(properties.getHeaders())); - AgentBridge.getAgent().getTransaction(false).setTransportType(TransportType.AMQP); - RabbitAMQPMetricUtil.addConsumeAttributes(envelope.getExchange(), null, envelope.getRoutingKey(), properties); - Weaver.callOriginal(); - } -} diff --git a/instrumentation/rabbit-amqp-1.7.2/src/main/java/com/rabbitmq/client/FileProperties_Instrumentation.java b/instrumentation/rabbit-amqp-1.7.2/src/main/java/com/rabbitmq/client/FileProperties_Instrumentation.java deleted file mode 100644 index 213cf2d111..0000000000 --- a/instrumentation/rabbit-amqp-1.7.2/src/main/java/com/rabbitmq/client/FileProperties_Instrumentation.java +++ /dev/null @@ -1,17 +0,0 @@ -/* - * - * * Copyright 2020 New Relic Corporation. All rights reserved. - * * SPDX-License-Identifier: Apache-2.0 - * - */ - -package com.rabbitmq.client; - -import com.newrelic.api.agent.weaver.Weave; - -/** - * This class is weaved only to foce this module to fail in rabbitmq 2.5.0 and above. - */ -@Weave(originalName = "com.rabbitmq.client.FileProperties") -public class FileProperties_Instrumentation { -} diff --git a/instrumentation/rabbit-amqp-1.7.2/src/main/java/com/rabbitmq/client/QueueingConsumer_Instrumentation.java b/instrumentation/rabbit-amqp-1.7.2/src/main/java/com/rabbitmq/client/QueueingConsumer_Instrumentation.java deleted file mode 100644 index 782adb14a6..0000000000 --- a/instrumentation/rabbit-amqp-1.7.2/src/main/java/com/rabbitmq/client/QueueingConsumer_Instrumentation.java +++ /dev/null @@ -1,50 +0,0 @@ -/* - * - * * Copyright 2020 New Relic Corporation. All rights reserved. - * * SPDX-License-Identifier: Apache-2.0 - * - */ - -package com.rabbitmq.client; - -import com.nr.agent.instrumentation.rabbitamqp172.RabbitAMQPMetricUtil; -import com.newrelic.agent.bridge.AgentBridge; -import com.newrelic.api.agent.Trace; -import com.newrelic.api.agent.weaver.MatchType; -import com.newrelic.api.agent.weaver.Weave; -import com.newrelic.api.agent.weaver.Weaver; -import com.rabbitmq.client.AMQP.BasicProperties; - -@Weave(type = MatchType.BaseClass, originalName = "com.rabbitmq.client.QueueingConsumer") -public abstract class QueueingConsumer_Instrumentation { - - public abstract Channel getChannel(); - - @Weave(originalName = "com.rabbitmq.client.QueueingConsumer$Delivery") - public static class Delivery_Instrumentation { - public BasicProperties getProperties() { - return Weaver.callOriginal(); - } - - public Envelope getEnvelope() { - return Weaver.callOriginal(); - } - } - - @Trace - public QueueingConsumer.Delivery nextDelivery() { - QueueingConsumer.Delivery delivery = Weaver.callOriginal(); - Envelope envelope = delivery.getEnvelope(); - BasicProperties props = delivery.getProperties(); - Connection connection = null; - Channel channel = getChannel(); - if (channel != null) { - connection = channel.getConnection(); - } - RabbitAMQPMetricUtil.processGetMessage(null, envelope.getRoutingKey(), - envelope.getExchange(), props, AgentBridge.getAgent().getTracedMethod(), connection); - RabbitAMQPMetricUtil.nameTransaction(envelope.getExchange()); - return delivery; - } - -} diff --git a/instrumentation/rabbit-amqp-1.7.2/src/main/java/com/rabbitmq/client/impl/ChannelN_Instrumentation.java b/instrumentation/rabbit-amqp-1.7.2/src/main/java/com/rabbitmq/client/impl/ChannelN_Instrumentation.java deleted file mode 100644 index 533ea0921a..0000000000 --- a/instrumentation/rabbit-amqp-1.7.2/src/main/java/com/rabbitmq/client/impl/ChannelN_Instrumentation.java +++ /dev/null @@ -1,67 +0,0 @@ -/* - * - * * Copyright 2020 New Relic Corporation. All rights reserved. - * * SPDX-License-Identifier: Apache-2.0 - * - */ - -package com.rabbitmq.client.impl; - -import com.newrelic.agent.bridge.AgentBridge; -import com.newrelic.api.agent.Trace; -import com.newrelic.api.agent.weaver.MatchType; -import com.newrelic.api.agent.weaver.Weave; -import com.newrelic.api.agent.weaver.Weaver; -import com.nr.agent.instrumentation.rabbitamqp172.RabbitAMQPMetricUtil; -import com.rabbitmq.client.AMQP.BasicProperties; -import com.rabbitmq.client.GetResponse; -import com.rabbitmq.client.MessageProperties; -import com.rabbitmq.client.Connection; - -import java.util.HashMap; - -@Weave(type = MatchType.ExactClass, originalName = "com.rabbitmq.client.impl.ChannelN") -public abstract class ChannelN_Instrumentation { - - public abstract Connection getConnection(); - - @Trace - public void basicPublish(String exchange, String routingKey, boolean mandatory, boolean immediate, - BasicProperties props, byte[] body) { - - if (props == null) { - props = MessageProperties.MINIMAL_BASIC; - } - - // Property headers is an Unmodifiable map. - // Create new map to hold new outbound and existing headers. - HashMap headers = new HashMap<>(); - if (props.getHeaders() != null) { - headers.putAll(props.getHeaders()); - } - RabbitAMQPMetricUtil.processSendMessage(exchange, routingKey, headers, props, - AgentBridge.getAgent().getTracedMethod(), getConnection()); - props.setHeaders(headers); - Weaver.callOriginal(); - } - - /* - * basicGet retrieves messages individually. - */ - @Trace - public GetResponse basicGet(String queue, boolean autoAck) { - GetResponse response = Weaver.callOriginal(); - if (response != null) { - RabbitAMQPMetricUtil.processGetMessage(queue, response.getEnvelope().getRoutingKey(), - response.getEnvelope().getExchange(), response.getProps(), - AgentBridge.getAgent().getTracedMethod(), getConnection()); - } - return response; - } - - @Trace - public AMQImpl.Queue.PurgeOk queuePurge(String queue) { - RabbitAMQPMetricUtil.queuePurge(queue, AgentBridge.getAgent().getTracedMethod()); - return Weaver.callOriginal(); - } -} diff --git a/instrumentation/rabbit-amqp-1.7.2/src/test/java/com/nr/agent/instrumentation/rabbitamqp172/RabbitMQTest.java b/instrumentation/rabbit-amqp-1.7.2/src/test/java/com/nr/agent/instrumentation/rabbitamqp172/RabbitMQTest.java deleted file mode 100644 index 67a50fc0d9..0000000000 --- a/instrumentation/rabbit-amqp-1.7.2/src/test/java/com/nr/agent/instrumentation/rabbitamqp172/RabbitMQTest.java +++ /dev/null @@ -1,341 +0,0 @@ -/* - * - * * Copyright 2020 New Relic Corporation. All rights reserved. - * * SPDX-License-Identifier: Apache-2.0 - * - */ - -package com.nr.agent.instrumentation.rabbitamqp172; - -import com.newrelic.agent.introspec.InstrumentationTestConfig; -import com.newrelic.agent.introspec.InstrumentationTestRunner; -import com.newrelic.agent.introspec.Introspector; -import com.newrelic.agent.introspec.TraceSegment; -import com.newrelic.agent.introspec.TracedMetricData; -import com.newrelic.agent.introspec.TransactionEvent; -import com.newrelic.agent.introspec.TransactionTrace; -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Trace; -import com.newrelic.api.agent.TransactionNamePriority; -import com.rabbitmq.client.AMQP; -import com.rabbitmq.client.Address; -import com.rabbitmq.client.Channel; -import com.rabbitmq.client.Connection; -import com.rabbitmq.client.ConnectionFactory; -import com.rabbitmq.client.DefaultConsumer; -import com.rabbitmq.client.Envelope; -import com.rabbitmq.client.GetResponse; -import com.rabbitmq.client.QueueingConsumer; -import io.arivera.oss.embedded.rabbitmq.EmbeddedRabbitMq; -import io.arivera.oss.embedded.rabbitmq.EmbeddedRabbitMqConfig; -import io.arivera.oss.embedded.rabbitmq.PredefinedVersion; -import io.arivera.oss.embedded.rabbitmq.util.RandomPortSupplier; -import org.junit.After; -import org.junit.AfterClass; -import org.junit.Before; -import org.junit.BeforeClass; -import org.junit.ClassRule; -import org.junit.Test; -import org.junit.rules.TemporaryFolder; -import org.junit.runner.RunWith; - -import java.io.IOException; -import java.text.MessageFormat; -import java.util.Collection; -import java.util.Collections; -import java.util.HashMap; -import java.util.LinkedList; -import java.util.Map; -import java.util.Queue; -import java.util.UUID; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertTrue; - -@RunWith(InstrumentationTestRunner.class) -@InstrumentationTestConfig(includePrefixes = { "com.rabbitmq.client", "com.rabbitmq.client.impl" }) -public class RabbitMQTest { - private static final String DEFAULT_EXCHANGE = ""; - - @ClassRule - public static TemporaryFolder folder = new TemporaryFolder(); - - private Channel channel; - - private static int port; - - private static EmbeddedRabbitMq rabbitMq; - - @BeforeClass - public static void beforeClass() throws IOException { - port = new RandomPortSupplier().get(); - // Server - EmbeddedRabbitMqConfig config = new EmbeddedRabbitMqConfig.Builder() - .version(PredefinedVersion.V3_6_9) - .downloadFolder(folder.newFolder("download")) - .extractionFolder(folder.newFolder("extraction")) - .rabbitMqServerInitializationTimeoutInMillis(60 * 1000) - .defaultRabbitMqCtlTimeoutInMillis(60 * 1000) - .envVar("RABBITMQ_NODENAME", "RabbitMQ" + port) - .erlangCheckTimeoutInMillis(5000) - .port(port) - .build(); - - rabbitMq = new EmbeddedRabbitMq(config); - rabbitMq.start(); - } - - @AfterClass - public static void afterClass() { - rabbitMq.stop(); - } - - @Before - public void setUp() throws IOException { - ConnectionFactory factory = new ConnectionFactory(); - Connection connection = factory.newConnection(new Address[] { new Address("localhost", port) }); - channel = connection.createChannel(); - } - - @After - public void tearDown() throws IOException { - channel.getConnection().close(); - } - - @Test - public void testProduceConsumePurge() throws IOException { - Introspector introspector = InstrumentationTestRunner.getIntrospector(); - - Map headers = new HashMap<>(); - headers.put("keyOne", 1); - headers.put("keyTwo", 2); - - String queueOne = UUID.randomUUID().toString(); - putGetAndPurge(DEFAULT_EXCHANGE, "direct", queueOne, null, null, null); - String queueOneTxn = MessageFormat.format("OtherTransaction/Test/{0}", queueOne); - assertTrue(introspector.getTransactionNames().contains(queueOneTxn)); - assertProduceConsumePurgeMetrics("Default", queueOne, introspector.getMetricsForTransaction(queueOneTxn)); - assertProduceConsumeTraceAttrs(introspector.getTransactionTracesForTransaction(queueOneTxn).iterator().next(), - "Default", null, null, Collections.emptyMap()); - - String queueTwo = UUID.randomUUID().toString(); - putGetAndPurge("MyExchange", "direct", queueTwo, "replyTo", "correlation-id", headers); - String queueTwoTxn = MessageFormat.format("OtherTransaction/Test/{0}", queueTwo); - assertTrue(introspector.getTransactionNames().contains(queueTwoTxn)); - assertProduceConsumePurgeMetrics("MyExchange", queueTwo, introspector.getMetricsForTransaction(queueTwoTxn)); - assertProduceConsumeTraceAttrs(introspector.getTransactionTracesForTransaction(queueTwoTxn).iterator().next(), - "MyExchange", "replyTo", "correlation-id", Collections.emptyMap()); - - String queueThree = UUID.randomUUID().toString(); - putGetAndPurge("direct", "direct", queueThree, null, null, null); - String queueThreeTxn = MessageFormat.format("OtherTransaction/Test/{0}", queueThree); - assertTrue(introspector.getTransactionNames().contains(queueThreeTxn)); - assertProduceConsumePurgeMetrics("direct", queueThree, introspector.getMetricsForTransaction(queueThreeTxn)); - assertProduceConsumeTraceAttrs(introspector.getTransactionTracesForTransaction(queueThreeTxn).iterator().next(), - "direct", null, null, Collections.emptyMap()); - - String queueFour = UUID.randomUUID().toString(); - putGetAndPurge("TopicExchange", "topic", queueFour, "replyTo", null, headers); - String queueFourTxn = MessageFormat.format("OtherTransaction/Test/{0}", queueFour); - assertTrue(introspector.getTransactionNames().contains(queueFourTxn)); - assertProduceConsumePurgeMetrics("TopicExchange", queueFour, - introspector.getMetricsForTransaction(queueFourTxn)); - assertProduceConsumeTraceAttrs(introspector.getTransactionTracesForTransaction(queueFourTxn).iterator().next(), - "TopicExchange", "replyTo", null, Collections.emptyMap()); - - String queueFive = UUID.randomUUID().toString(); - putGetAndPurge("headers", "headers", queueFive, null, "correlation-id", headers); - String queueFiveTxn = MessageFormat.format("OtherTransaction/Test/{0}", queueFive); - assertTrue(introspector.getTransactionNames().contains(queueFiveTxn)); - assertProduceConsumePurgeMetrics("headers", queueFive, introspector.getMetricsForTransaction(queueFiveTxn)); - assertProduceConsumeTraceAttrs(introspector.getTransactionTracesForTransaction(queueFiveTxn).iterator().next(), - "headers", null, "correlation-id", Collections.emptyMap()); - } - - @Test - public void testMessageListener() throws IOException, InterruptedException { - final String queueName = UUID.randomUUID().toString(); - final String messageForListener = "Hello message listener!"; - - channel.queueDeclare(queueName, false, false, false, true, Collections.emptyMap()); - channel.basicPublish(DEFAULT_EXCHANGE, queueName, new AMQP.BasicProperties(), messageForListener.getBytes()); - channel.basicConsume(queueName, new DefaultConsumer(channel) { - @Override - public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, - byte[] body) throws IOException { - assertEquals(messageForListener, new String(body)); - } - }); - - // Let handleDelivery Transaction to finish. - Thread.sleep(1000); - - Introspector introspector = InstrumentationTestRunner.getIntrospector(); - - String expectedTransactionName = "OtherTransaction/Message/RabbitMQ/Exchange/Named/Default"; - final Collection transactionNames = introspector.getTransactionNames(); - assertTrue(transactionNames.contains(expectedTransactionName)); - - //Do not record consume metric, message has already been delivered - Map metrics = introspector.getMetricsForTransaction(expectedTransactionName); - assertFalse(metrics.containsKey("MessageBroker/RabbitMQ/Exchange/Consume/Named/Default")); - } - - @Test - public void testCat() throws IOException, InterruptedException { - final Map deliveryHeaders = new HashMap<>(); - final Map consumerHeaders = new HashMap<>(); - - final String queueName = UUID.randomUUID().toString(); - final String replyMessage = "reply"; - final String exchangeName = "MyFavoriteExchange"; - - channel.exchangeDeclare(exchangeName, "topic"); - channel.queueDeclare(queueName, false, false, false, true, Collections.emptyMap()); - channel.queueBind(queueName, exchangeName, queueName); - System.out.println("Queue name is " + queueName); - - channel.basicConsume(queueName, new DefaultConsumer(channel) { - @Override - public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, - byte[] body) throws IOException { - channel.basicPublish(DEFAULT_EXCHANGE, properties.getReplyTo(), new AMQP.BasicProperties(), - replyMessage.getBytes()); - consumerHeaders.putAll(properties.getHeaders()); - } - }); - - Thread thread = new Thread(new Runnable() { - @Override - @Trace(dispatcher = true) - public void run() { - NewRelic.setTransactionName("Category", "Sender"); - try { - String tempQueue = channel.queueDeclare().getQueue(); - AMQP.BasicProperties basicProperties = new AMQP.BasicProperties(); - basicProperties.setReplyTo(tempQueue); - channel.basicPublish(exchangeName, queueName, basicProperties, "message".getBytes()); - - QueueingConsumer queueingConsumer = new QueueingConsumer(channel); - channel.basicConsume(tempQueue, true, queueingConsumer); - - // block - QueueingConsumer.Delivery delivery = queueingConsumer.nextDelivery(); - deliveryHeaders.putAll(delivery.getProperties().getHeaders()); - assertEquals(replyMessage, new String(delivery.getBody())); - } catch (IOException | InterruptedException ignored) { - } - } - }); - - thread.start(); - thread.join(2000); - - Introspector introspector = InstrumentationTestRunner.getIntrospector(); - - String senderTransactioName = "OtherTransaction/Category/Sender"; - String messageListenerTransactionName = "OtherTransaction/Message/RabbitMQ/Exchange/Named/MyFavoriteExchange"; - - Collection transactionNames = introspector.getTransactionNames(); - assertTrue(transactionNames.contains(senderTransactioName)); - assertTrue(transactionNames.contains(messageListenerTransactionName)); - - Map senderMetrics = introspector.getMetricsForTransaction(senderTransactioName); - assertTrue(senderMetrics.containsKey("MessageBroker/RabbitMQ/Exchange/Produce/Named/MyFavoriteExchange")); - assertTrue(senderMetrics.containsKey("MessageBroker/RabbitMQ/Exchange/Consume/Named/Default")); - - Map messageListenerMetrics = introspector.getMetricsForTransaction( - messageListenerTransactionName); - //Do not record consume metric in listener - assertFalse(messageListenerMetrics.containsKey("MessageBroker/RabbitMQ/Exchange/Consume/Named/MyFavoriteExchange")); - assertTrue(messageListenerMetrics.containsKey("MessageBroker/RabbitMQ/Exchange/Produce/Named/Default")); - - // Test one-way CAT. Both transactions do a publish/consume - assertTrue(consumerHeaders.containsKey("NewRelicTransaction")); - assertTrue(consumerHeaders.containsKey("NewRelicID")); - assertTrue(deliveryHeaders.containsKey("NewRelicTransaction")); - assertTrue(deliveryHeaders.containsKey("NewRelicID")); - - TransactionEvent senderEvent = introspector.getTransactionEvents(senderTransactioName).iterator().next(); - TransactionEvent messageListenerEvent = introspector.getTransactionEvents( - messageListenerTransactionName).iterator().next(); - assertEquals(senderEvent.getMyGuid(), messageListenerEvent.getReferrerGuid()); - assertEquals(senderEvent.getMyPathHash(), messageListenerEvent.getReferringPathHash()); - } - - @Trace(dispatcher = true) - public void putGetAndPurge(String exchangeName, String exchangeType, String queueName, String replyTo, - String correlationId, Map headers) - throws IOException { - channel.queueDeclare(queueName, false, false, false, true, Collections.emptyMap()); - - if (!exchangeName.equals(DEFAULT_EXCHANGE)) { - channel.exchangeDeclare(exchangeName, exchangeType); - channel.queueBind(queueName, exchangeName, queueName); - } - - AMQP.BasicProperties properties = new AMQP.BasicProperties(); - properties.setReplyTo(replyTo); - properties.setCorrelationId(correlationId); - properties.setHeaders(headers); - channel.basicPublish(exchangeName, queueName, properties, "message".getBytes()); - - GetResponse response = channel.basicGet(queueName, true); - assertEquals("message", new String(response.getBody())); - - NewRelic.getAgent() - .getTransaction() - .setTransactionName(TransactionNamePriority.CUSTOM_HIGH, true, "Test", queueName); - - channel.queuePurge(queueName); - } - - private void assertProduceConsumePurgeMetrics(String exchangeName, String queueName, - Map metrics) { - String consumeMetric = "MessageBroker/RabbitMQ/Exchange/Consume/Named/" + exchangeName; - assertTrue(metrics.containsKey(consumeMetric)); - assertEquals(1, metrics.get(consumeMetric).getCallCount()); - - String produceMetric = "MessageBroker/RabbitMQ/Exchange/Produce/Named/" + exchangeName; - assertTrue(metrics.containsKey(produceMetric)); - assertEquals(1, metrics.get(produceMetric).getCallCount()); - - String purgeMetric = "MessageBroker/RabbitMQ/Queue/Purge/Named/" + queueName; - assertTrue(metrics.containsKey(purgeMetric)); - assertEquals(1, metrics.get(purgeMetric).getCallCount()); - } - - private void assertProduceConsumeTraceAttrs(TransactionTrace trace, String exchangeName, String replyTo, - String correlationId, Map headers) { - // Collect all segments - Map segments = new HashMap<>(); - Queue queue = new LinkedList<>(); - queue.offer(trace.getInitialTraceSegment()); - while (!queue.isEmpty()) { - TraceSegment segment = queue.poll(); - segments.put(segment.getName(), segment); - queue.addAll(segment.getChildren()); - } - - TraceSegment produceSegment = segments.get("MessageBroker/RabbitMQ/Exchange/Consume/Named/" + exchangeName); - assertTrue(produceSegment.getTracerAttributes().containsKey("message.routingKey")); - assertEquals(replyTo, produceSegment.getTracerAttributes().get("message.replyTo")); - assertEquals(correlationId, produceSegment.getTracerAttributes().get("message.correlationId")); - - for (String key : headers.keySet()) { - assertNotNull(produceSegment.getTracerAttributes().get("message." + key)); - } - - TraceSegment consumeSegment = segments.get("MessageBroker/RabbitMQ/Exchange/Consume/Named/" + exchangeName); - assertTrue(consumeSegment.getTracerAttributes().containsKey("message.routingKey")); - assertTrue(consumeSegment.getTracerAttributes().containsKey("message.queueName")); - assertEquals(replyTo, consumeSegment.getTracerAttributes().get("message.replyTo")); - - for (String key : headers.keySet()) { - assertNotNull(consumeSegment.getTracerAttributes().get("message." + key)); - } - } - -} diff --git a/instrumentation/rabbit-amqp-2.4.1/build.gradle b/instrumentation/rabbit-amqp-2.4.1/build.gradle deleted file mode 100644 index 0320c9b086..0000000000 --- a/instrumentation/rabbit-amqp-2.4.1/build.gradle +++ /dev/null @@ -1,19 +0,0 @@ -dependencies { - implementation(project(":agent-bridge")) - implementation("com.rabbitmq:amqp-client:2.4.1") - testImplementation("io.arivera.oss:embedded-rabbitmq:1.4.0") - testImplementation("org.slf4j:slf4j-simple:1.7.30") -} - -jar { - manifest { attributes 'Implementation-Title': 'com.newrelic.instrumentation.rabbit-amqp-2.4.1' } -} - -verifyInstrumentation { - passesOnly 'com.rabbitmq:amqp-client:[2.4.1,2.5.0)' -} - -site { - title 'RabbitAMQP' - type 'Messaging' -} \ No newline at end of file diff --git a/instrumentation/rabbit-amqp-2.4.1/src/integration-test/java/RabbitMQTest_Integration.java b/instrumentation/rabbit-amqp-2.4.1/src/integration-test/java/RabbitMQTest_Integration.java deleted file mode 100644 index 6ee5ef19c0..0000000000 --- a/instrumentation/rabbit-amqp-2.4.1/src/integration-test/java/RabbitMQTest_Integration.java +++ /dev/null @@ -1,225 +0,0 @@ -/* - * - * * Copyright 2024 New Relic Corporation. All rights reserved. - * * SPDX-License-Identifier: Apache-2.0 - * - */ -import com.newrelic.agent.introspec.InstrumentationTestConfig; -import com.newrelic.agent.introspec.InstrumentationTestRunner; -import com.newrelic.agent.introspec.Introspector; -import com.newrelic.agent.introspec.TraceSegment; -import com.newrelic.agent.introspec.TracedMetricData; -import com.newrelic.agent.introspec.TransactionEvent; -import com.newrelic.agent.introspec.TransactionTrace; -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Trace; -import com.rabbitmq.client.AMQP; -import com.rabbitmq.client.Channel; -import com.rabbitmq.client.Connection; -import com.rabbitmq.client.ConnectionFactory; -import com.rabbitmq.client.DefaultConsumer; -import com.rabbitmq.client.Envelope; -import com.rabbitmq.client.GetResponse; -import com.rabbitmq.client.QueueingConsumer; -import org.junit.After; -import org.junit.Before; -import org.junit.Ignore; -import org.junit.Test; -import org.junit.runner.RunWith; - -import java.io.IOException; -import java.util.Collection; -import java.util.Collections; -import java.util.LinkedList; -import java.util.Map; -import java.util.Queue; -import java.util.UUID; - -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertTrue; - -@Ignore -@RunWith(InstrumentationTestRunner.class) -@InstrumentationTestConfig(includePrefixes = { "com.rabbitmq.client", "com.rabbitmq.client.impl"}) -public class RabbitMQTest_Integration { - private Channel channel; - private String DEFAULT_EXCHANGE = ""; - - @Before - public void setUp() throws IOException { - ConnectionFactory factory = new ConnectionFactory(); - Connection connection = factory.newConnection("localhost"); - channel = connection.createChannel(); - } - - @After - public void tearDown() throws IOException { - channel.getConnection().close(); - } - - @Test - public void testProduceConsume() throws IOException { - final String queueName = UUID.randomUUID().toString(); - putAndGetInTransaction(queueName); - - Introspector introspector = InstrumentationTestRunner.getIntrospector(); - - String expectedTransactionName = String.format("OtherTransaction/Message/RabbitMQ/Queue/Named/%s", queueName); - final Collection transactionNames = introspector.getTransactionNames(); - assertTrue(transactionNames.contains(expectedTransactionName)); - - Map metrics = introspector.getMetricsForTransaction(expectedTransactionName); - assertTrue(metrics.containsKey(String.format("MessageBroker/RabbitMQ/Queue/Consume/Named/%s", queueName))); - assertTrue(metrics.containsKey(String.format("MessageBroker/RabbitMQ/Queue/Produce/Named/%s", queueName))); - } - - @Test - public void testMessageListener() throws IOException, InterruptedException { - final String queueName = UUID.randomUUID().toString(); - final String messageForListener = "Hello message listener!"; - - channel.queueDeclare(queueName, false, false, true, Collections.emptyMap()); - channel.basicPublish(DEFAULT_EXCHANGE, queueName, new AMQP.BasicProperties(), messageForListener.getBytes()); - channel.basicConsume(queueName, new DefaultConsumer(channel) { - @Override - public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, - byte[] body) throws IOException { - assertEquals(messageForListener, new String(body)); - } - }); - - // Let handleDelivery Transaction to finish. - Thread.sleep(1000); - - Introspector introspector = InstrumentationTestRunner.getIntrospector(); - - String expectedTransactionName = String.format("OtherTransaction/Message/RabbitMQ/Queue/Named/%s", queueName); - final Collection transactionNames = introspector.getTransactionNames(); - assertTrue(transactionNames.contains(expectedTransactionName)); - - Map metrics = introspector.getMetricsForTransaction(expectedTransactionName); - assertTrue(metrics.containsKey(String.format("MessageBroker/RabbitMQ/Queue/Consume/Named/%s", queueName))); - } - - @Test - public void testCat() throws IOException, InterruptedException { - final String queueName = UUID.randomUUID().toString(); - channel.queueDeclare(queueName, false, false, true, Collections.emptyMap()); - final String replyMessage = "reply"; - - channel.basicConsume(queueName, new DefaultConsumer(channel) { - @Override - public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, - byte[] body) throws IOException { - channel.basicPublish(DEFAULT_EXCHANGE, properties.getReplyTo(), new AMQP.BasicProperties(), - replyMessage.getBytes()); - } - }); - - Thread thread = new Thread(new Runnable() { - @Override - @Trace(dispatcher = true) - public void run() { - NewRelic.setTransactionName("Category", "Sender"); - - try { - String tempQueue = channel.queueDeclare().getQueue(); - AMQP.BasicProperties properties = new AMQP.BasicProperties(); - properties.setReplyTo(tempQueue); - channel.basicPublish(DEFAULT_EXCHANGE, queueName, properties, "message".getBytes()); - - QueueingConsumer queueingConsumer = new QueueingConsumer(channel); - channel.basicConsume(tempQueue, true, queueingConsumer); - - // block - QueueingConsumer.Delivery delivery = queueingConsumer.nextDelivery(); - assertEquals(replyMessage, new String(delivery.getBody())); - - } catch (IOException e) { - } catch (InterruptedException e) { - } - } - }); - - thread.start(); - thread.join(2000); - - Introspector introspector = InstrumentationTestRunner.getIntrospector(); - - String senderTransactioName = "OtherTransaction/Category/Sender"; - String messageListenerTransactionName = String.format("OtherTransaction/Message/RabbitMQ/Queue/Named/%s", - queueName); - - final Collection transactionNames = introspector.getTransactionNames(); - assertTrue(transactionNames.contains(senderTransactioName)); - assertTrue(transactionNames.contains(messageListenerTransactionName)); - - Map senderMetrics = introspector.getMetricsForTransaction(senderTransactioName); - Map messageListenerMetrics = introspector.getMetricsForTransaction( - messageListenerTransactionName); - - assertTrue(senderMetrics.containsKey(String.format("MessageBroker/RabbitMQ/Queue/Produce/Named/%s", - queueName))); - assertTrue(senderMetrics.containsKey("MessageBroker/RabbitMQ/Queue/Consume/Temp")); - - assertTrue(messageListenerMetrics.containsKey(String.format("MessageBroker/RabbitMQ/Queue/Consume/Named/%s", - queueName))); - assertTrue(messageListenerMetrics.containsKey("MessageBroker/RabbitMQ/Queue/Produce/Temp")); - - // Ideally, the block below could be replaced with the following line: - // CatHelper.verifyOneSuccessfulCat(introspector, senderTransactioName, messageListenerTransactionName); - { - TransactionTrace senderTT = introspector.getTransactionTracesForTransaction( - senderTransactioName).iterator().next(); - TransactionTrace messageListenerTT = introspector.getTransactionTracesForTransaction( - messageListenerTransactionName).iterator().next(); - - Map senderTTIntrinsics = senderTT.getIntrinsicAttributes(); - Map messageListenerTTIntrinsics = messageListenerTT.getIntrinsicAttributes(); - - assertNotNull(senderTTIntrinsics.get("trip_id")); - assertNotNull(senderTTIntrinsics.get("path_hash")); - assertNotNull(getAttribute(senderTT, "transaction_guid")); - assertNotNull(messageListenerTTIntrinsics.get("referring_transaction_guid")); - assertNotNull(messageListenerTTIntrinsics.get("client_cross_process_id")); - - TransactionEvent senderEvent = introspector.getTransactionEvents(senderTransactioName).iterator().next(); - TransactionEvent messageListenerEvent = introspector.getTransactionEvents(messageListenerTransactionName).iterator().next(); - - assertEquals(senderEvent.getMyGuid(), messageListenerEvent.getReferrerGuid()); - } - - } - - private String getAttribute(TransactionTrace senderTT, String attributeName) { - Queue queue = new LinkedList(); - queue.offer(senderTT.getInitialTraceSegment()); - - while (!queue.isEmpty()) { - TraceSegment segment = queue.poll(); - if (segment.getTracerAttributes().containsKey(attributeName)) { - return (String) segment.getTracerAttributes().get(attributeName); - } - - for (TraceSegment childSegment : segment.getChildren()) { - queue.offer(childSegment); - } - } - - return null; - } - - - @Trace(dispatcher = true) - public void putAndGetInTransaction(String queueName) throws IOException { - channel.queueDeclare(queueName, false, false, true, Collections.emptyMap()); - - AMQP.BasicProperties properties = new AMQP.BasicProperties(); - channel.basicPublish(DEFAULT_EXCHANGE, queueName, properties, "message".getBytes()); - - GetResponse response = channel.basicGet(queueName, true); - assertEquals("message", new String(response.getBody())); - } - -} \ No newline at end of file diff --git a/instrumentation/rabbit-amqp-2.4.1/src/main/java/com/nr/agent/instrumentation/rabbitamqp241/InboundWrapper.java b/instrumentation/rabbit-amqp-2.4.1/src/main/java/com/nr/agent/instrumentation/rabbitamqp241/InboundWrapper.java deleted file mode 100644 index fea4da8cb1..0000000000 --- a/instrumentation/rabbit-amqp-2.4.1/src/main/java/com/nr/agent/instrumentation/rabbitamqp241/InboundWrapper.java +++ /dev/null @@ -1,48 +0,0 @@ -/* - * - * * Copyright 2020 New Relic Corporation. All rights reserved. - * * SPDX-License-Identifier: Apache-2.0 - * - */ - -package com.nr.agent.instrumentation.rabbitamqp241; - -import java.util.Collections; -import java.util.List; -import java.util.Map; - -import com.newrelic.api.agent.HeaderType; -import com.newrelic.api.agent.ExtendedInboundHeaders; - -public class InboundWrapper extends ExtendedInboundHeaders { - private final Map delegate; - - public InboundWrapper(Map arguments) { - super(); - this.delegate = arguments; - } - - @Override - public String getHeader(String name) { - Object property = delegate.get(name); - if (property == null) { - return null; - } - return property.toString(); - } - - @Override - public List getHeaders(String name) { - String result = getHeader(name); - if (result == null) { - return null; - } - return Collections.singletonList(result); - } - - @Override - public HeaderType getHeaderType() { - return HeaderType.MESSAGE; - } - -} diff --git a/instrumentation/rabbit-amqp-2.4.1/src/main/java/com/nr/agent/instrumentation/rabbitamqp241/OutboundWrapper.java b/instrumentation/rabbit-amqp-2.4.1/src/main/java/com/nr/agent/instrumentation/rabbitamqp241/OutboundWrapper.java deleted file mode 100644 index 6e23a04f42..0000000000 --- a/instrumentation/rabbit-amqp-2.4.1/src/main/java/com/nr/agent/instrumentation/rabbitamqp241/OutboundWrapper.java +++ /dev/null @@ -1,32 +0,0 @@ -/* - * - * * Copyright 2020 New Relic Corporation. All rights reserved. - * * SPDX-License-Identifier: Apache-2.0 - * - */ - -package com.nr.agent.instrumentation.rabbitamqp241; - -import java.util.Map; - -import com.newrelic.api.agent.HeaderType; -import com.newrelic.api.agent.OutboundHeaders; - -public class OutboundWrapper implements OutboundHeaders { - - private final Map delegate; - - public OutboundWrapper(Map headers) { - this.delegate = headers; - } - - @Override - public void setHeader(String name, String value) { - delegate.put(name, value); - } - - @Override - public HeaderType getHeaderType() { - return HeaderType.MESSAGE; - } -} diff --git a/instrumentation/rabbit-amqp-2.4.1/src/main/java/com/nr/agent/instrumentation/rabbitamqp241/RabbitAMQPMetricUtil.java b/instrumentation/rabbit-amqp-2.4.1/src/main/java/com/nr/agent/instrumentation/rabbitamqp241/RabbitAMQPMetricUtil.java deleted file mode 100644 index 461c2e446e..0000000000 --- a/instrumentation/rabbit-amqp-2.4.1/src/main/java/com/nr/agent/instrumentation/rabbitamqp241/RabbitAMQPMetricUtil.java +++ /dev/null @@ -1,144 +0,0 @@ -/* - * - * * Copyright 2020 New Relic Corporation. All rights reserved. - * * SPDX-License-Identifier: Apache-2.0 - * - */ - -package com.nr.agent.instrumentation.rabbitamqp241; - -import com.newrelic.agent.bridge.AgentBridge; -import com.newrelic.agent.bridge.TracedMethod; -import com.newrelic.agent.bridge.TransactionNamePriority; -import com.newrelic.api.agent.DestinationType; -import com.newrelic.api.agent.MessageConsumeParameters; -import com.newrelic.api.agent.MessageProduceParameters; -import com.rabbitmq.client.AMQP; -import com.rabbitmq.client.Connection; - -import java.net.InetAddress; -import java.text.MessageFormat; -import java.util.HashMap; -import java.util.Map; - -public abstract class RabbitAMQPMetricUtil { - private static final String RABBITMQ = "RabbitMQ"; - - private static final String MESSAGE_BROKER_TRANSACTION_EXCHANGE_NAMED = "RabbitMQ/Exchange/Named/{0}"; - - private static final String MESSAGE = "Message"; - private static final String DEFAULT = "Default"; - - private static final boolean captureSegmentParameters = AgentBridge.getAgent() - .getConfig() - .getValue("message_tracer.segment_parameters.enabled", Boolean.TRUE); - - public static void nameTransaction(String exchangeName) { - String transactionName = MessageFormat.format(MESSAGE_BROKER_TRANSACTION_EXCHANGE_NAMED, - exchangeName.isEmpty() ? DEFAULT : exchangeName); - AgentBridge.getAgent() - .getTransaction() - .setTransactionName(TransactionNamePriority.FRAMEWORK, false, MESSAGE, transactionName); - } - - public static void processSendMessage(String exchangeName, String routingKey, - HashMap headers, - AMQP.BasicProperties props, TracedMethod tracedMethod, Connection connection) { - String host = getHost(connection); - Integer port = getPort(connection); - tracedMethod.reportAsExternal(MessageProduceParameters - .library(RABBITMQ) - .destinationType(DestinationType.EXCHANGE) - .destinationName(wrapExchange(exchangeName)) - .outboundHeaders(new OutboundWrapper(headers)) - .instance(host, port) - .build()); - - addProduceAttributes(exchangeName, routingKey, props); - } - - public static void processGetMessage(String queueName, String routingKey, String exchangeName, - AMQP.BasicProperties properties, TracedMethod tracedMethod, Connection connection) { - String host = getHost(connection); - Integer port = getPort(connection); - tracedMethod.reportAsExternal(MessageConsumeParameters - .library(RABBITMQ) - .destinationType(DestinationType.EXCHANGE) - .destinationName(wrapExchange(exchangeName)) - .inboundHeaders(new InboundWrapper(properties.getHeaders())) - .instance(host, port) - .build()); - - addConsumeAttributes(exchangeName, queueName, routingKey, properties); - } - - public static void addConsumeAttributes(String exchangeName, String queueName, String routingKey, AMQP.BasicProperties properties) { - if (queueName != null && captureSegmentParameters) { - AgentBridge.privateApi.addTracerParameter("message.queueName", queueName, true); - // OTel attributes - AgentBridge.privateApi.addTracerParameter("messaging.destination.name", queueName, true); - if (exchangeName != null) { - AgentBridge.privateApi.addTracerParameter("messaging.destination_publish.name", exchangeName, true); - } - } - addAttributes(routingKey, properties); - } - - public static void addProduceAttributes(String exchangeName, String routingKey, AMQP.BasicProperties properties) { - if (exchangeName != null && captureSegmentParameters) { - // OTel attributes - AgentBridge.privateApi.addTracerParameter("messaging.destination.name", wrapExchange(exchangeName), true); - } - addAttributes(routingKey, properties); - } - - public static String wrapExchange(String exchangeName) { - return exchangeName.isEmpty() ? DEFAULT : exchangeName; - } - - public static void queuePurge(String queue, TracedMethod tracedMethod) { - tracedMethod.setMetricName(MessageFormat.format("MessageBroker/{0}/Queue/Purge/Named/{1}", - RABBITMQ, queue.isEmpty() ? DEFAULT : queue)); - } - - private static String getHost(Connection connection) { - String host = null; - if (connection != null) { - InetAddress address = connection.getAddress(); - if (address != null) { - host = address.getHostName(); - } - } - return host; - } - - private static Integer getPort(Connection connection) { - return (connection != null) ? connection.getPort() : null; - } - - private static void addAttributes(String routingKey, AMQP.BasicProperties properties) { - if (!captureSegmentParameters) { - return; - } - - AgentBridge.privateApi.addTracerParameter("message.routingKey", routingKey, true); - // Add Open Telemetry attribute for routing key to be added to spans - AgentBridge.privateApi.addTracerParameter("messaging.rabbitmq.destination.routing_key", routingKey, true); - if (properties.getReplyTo() != null) { - AgentBridge.privateApi.addTracerParameter("message.replyTo", properties.getReplyTo()); - } - if (properties.getCorrelationId() != null) { - AgentBridge.privateApi.addTracerParameter("message.correlationId", properties.getCorrelationId()); - } - if (properties.getHeaders() != null) { - for (Map.Entry entry : properties.getHeaders().entrySet()) { - if (entry.getKey().equals("NewRelicTransaction") || entry.getKey().equals("NewRelicID")) { - continue; - } - - AgentBridge.privateApi.addTracerParameter("message.headers." + entry.getKey(), entry.toString()); - } - } - } - -} diff --git a/instrumentation/rabbit-amqp-2.4.1/src/main/java/com/rabbitmq/client/Consumer_Instrumentation.java b/instrumentation/rabbit-amqp-2.4.1/src/main/java/com/rabbitmq/client/Consumer_Instrumentation.java deleted file mode 100644 index 146d39ab20..0000000000 --- a/instrumentation/rabbit-amqp-2.4.1/src/main/java/com/rabbitmq/client/Consumer_Instrumentation.java +++ /dev/null @@ -1,33 +0,0 @@ -/* - * - * * Copyright 2020 New Relic Corporation. All rights reserved. - * * SPDX-License-Identifier: Apache-2.0 - * - */ - -package com.rabbitmq.client; - -import java.io.IOException; - -import com.newrelic.agent.bridge.AgentBridge; -import com.newrelic.api.agent.TransportType; -import com.newrelic.api.agent.Trace; -import com.newrelic.api.agent.weaver.MatchType; -import com.newrelic.api.agent.weaver.Weave; -import com.newrelic.api.agent.weaver.Weaver; -import com.nr.agent.instrumentation.rabbitamqp241.InboundWrapper; -import com.nr.agent.instrumentation.rabbitamqp241.RabbitAMQPMetricUtil; - -@Weave(type = MatchType.Interface, originalName = "com.rabbitmq.client.Consumer") -public abstract class Consumer_Instrumentation { - - @Trace(dispatcher = true) - public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) - throws IOException { - RabbitAMQPMetricUtil.nameTransaction(envelope.getExchange()); - AgentBridge.getAgent().getTransaction().provideHeaders(new InboundWrapper(properties.getHeaders())); - AgentBridge.getAgent().getTransaction(false).setTransportType(TransportType.AMQP); - RabbitAMQPMetricUtil.addConsumeAttributes(envelope.getExchange(), null, envelope.getRoutingKey(), properties); - Weaver.callOriginal(); - } -} diff --git a/instrumentation/rabbit-amqp-2.4.1/src/main/java/com/rabbitmq/client/FileProperties_Instrumentation.java b/instrumentation/rabbit-amqp-2.4.1/src/main/java/com/rabbitmq/client/FileProperties_Instrumentation.java deleted file mode 100644 index 213cf2d111..0000000000 --- a/instrumentation/rabbit-amqp-2.4.1/src/main/java/com/rabbitmq/client/FileProperties_Instrumentation.java +++ /dev/null @@ -1,17 +0,0 @@ -/* - * - * * Copyright 2020 New Relic Corporation. All rights reserved. - * * SPDX-License-Identifier: Apache-2.0 - * - */ - -package com.rabbitmq.client; - -import com.newrelic.api.agent.weaver.Weave; - -/** - * This class is weaved only to foce this module to fail in rabbitmq 2.5.0 and above. - */ -@Weave(originalName = "com.rabbitmq.client.FileProperties") -public class FileProperties_Instrumentation { -} diff --git a/instrumentation/rabbit-amqp-2.4.1/src/main/java/com/rabbitmq/client/QueueingConsumer_Instrumentation.java b/instrumentation/rabbit-amqp-2.4.1/src/main/java/com/rabbitmq/client/QueueingConsumer_Instrumentation.java deleted file mode 100644 index fb7e38bb11..0000000000 --- a/instrumentation/rabbit-amqp-2.4.1/src/main/java/com/rabbitmq/client/QueueingConsumer_Instrumentation.java +++ /dev/null @@ -1,50 +0,0 @@ -/* - * - * * Copyright 2020 New Relic Corporation. All rights reserved. - * * SPDX-License-Identifier: Apache-2.0 - * - */ - -package com.rabbitmq.client; - -import com.nr.agent.instrumentation.rabbitamqp241.RabbitAMQPMetricUtil; -import com.newrelic.agent.bridge.AgentBridge; -import com.newrelic.api.agent.Trace; -import com.newrelic.api.agent.weaver.MatchType; -import com.newrelic.api.agent.weaver.Weave; -import com.newrelic.api.agent.weaver.Weaver; -import com.rabbitmq.client.AMQP.BasicProperties; - -@Weave(type = MatchType.BaseClass, originalName = "com.rabbitmq.client.QueueingConsumer") -public abstract class QueueingConsumer_Instrumentation { - - public abstract Channel getChannel(); - - @Weave(originalName = "com.rabbitmq.client.QueueingConsumer$Delivery") - public static class Delivery_Instrumentation { - public BasicProperties getProperties() { - return Weaver.callOriginal(); - } - - public Envelope getEnvelope() { - return Weaver.callOriginal(); - } - } - - @Trace - public QueueingConsumer.Delivery nextDelivery() { - QueueingConsumer.Delivery delivery = Weaver.callOriginal(); - Envelope envelope = delivery.getEnvelope(); - BasicProperties props = delivery.getProperties(); - Connection connection = null; - Channel channel = getChannel(); - if (channel != null) { - connection = channel.getConnection(); - } - RabbitAMQPMetricUtil.processGetMessage(null, envelope.getRoutingKey(), - envelope.getExchange(), props, AgentBridge.getAgent().getTracedMethod(), connection); - RabbitAMQPMetricUtil.nameTransaction(envelope.getExchange()); - return delivery; - } - -} diff --git a/instrumentation/rabbit-amqp-2.4.1/src/main/java/com/rabbitmq/client/impl/ChannelN_Instrumentation.java b/instrumentation/rabbit-amqp-2.4.1/src/main/java/com/rabbitmq/client/impl/ChannelN_Instrumentation.java deleted file mode 100644 index 2be940ab63..0000000000 --- a/instrumentation/rabbit-amqp-2.4.1/src/main/java/com/rabbitmq/client/impl/ChannelN_Instrumentation.java +++ /dev/null @@ -1,67 +0,0 @@ -/* - * - * * Copyright 2020 New Relic Corporation. All rights reserved. - * * SPDX-License-Identifier: Apache-2.0 - * - */ - -package com.rabbitmq.client.impl; - -import com.newrelic.agent.bridge.AgentBridge; -import com.newrelic.api.agent.Trace; -import com.newrelic.api.agent.weaver.MatchType; -import com.newrelic.api.agent.weaver.Weave; -import com.newrelic.api.agent.weaver.Weaver; -import com.nr.agent.instrumentation.rabbitamqp241.RabbitAMQPMetricUtil; -import com.rabbitmq.client.AMQP.BasicProperties; -import com.rabbitmq.client.GetResponse; -import com.rabbitmq.client.MessageProperties; -import com.rabbitmq.client.Connection; - -import java.util.HashMap; - -@Weave(type = MatchType.ExactClass, originalName = "com.rabbitmq.client.impl.ChannelN") -public abstract class ChannelN_Instrumentation { - - public abstract Connection getConnection(); - - @Trace - public void basicPublish(String exchange, String routingKey, boolean mandatory, boolean immediate, - BasicProperties props, byte[] body) { - - if (props == null) { - props = MessageProperties.MINIMAL_BASIC; - } - - // Property headers is an Unmodifiable map. - // Create new map to hold new outbound and existing headers. - HashMap headers = new HashMap<>(); - if (props.getHeaders() != null) { - headers.putAll(props.getHeaders()); - } - RabbitAMQPMetricUtil.processSendMessage(exchange, routingKey, headers, props, - AgentBridge.getAgent().getTracedMethod(), getConnection()); - props.setHeaders(headers); - Weaver.callOriginal(); - } - - /* - * basicGet retrieves messages individually. - */ - @Trace - public GetResponse basicGet(String queue, boolean autoAck) { - GetResponse response = Weaver.callOriginal(); - if (response != null) { - RabbitAMQPMetricUtil.processGetMessage(queue, response.getEnvelope().getRoutingKey(), - response.getEnvelope().getExchange(), response.getProps(), - AgentBridge.getAgent().getTracedMethod(), getConnection()); - } - return response; - } - - @Trace - public AMQImpl.Queue.PurgeOk queuePurge(String queue) { - RabbitAMQPMetricUtil.queuePurge(queue, AgentBridge.getAgent().getTracedMethod()); - return Weaver.callOriginal(); - } -} diff --git a/instrumentation/rabbit-amqp-2.4.1/src/test/java/com/nr/agent/instrumentation/rabbitamqp241/RabbitMQTest.java b/instrumentation/rabbit-amqp-2.4.1/src/test/java/com/nr/agent/instrumentation/rabbitamqp241/RabbitMQTest.java deleted file mode 100644 index 9ea884d4c4..0000000000 --- a/instrumentation/rabbit-amqp-2.4.1/src/test/java/com/nr/agent/instrumentation/rabbitamqp241/RabbitMQTest.java +++ /dev/null @@ -1,341 +0,0 @@ -/* - * - * * Copyright 2020 New Relic Corporation. All rights reserved. - * * SPDX-License-Identifier: Apache-2.0 - * - */ - -package com.nr.agent.instrumentation.rabbitamqp241; - -import com.newrelic.agent.introspec.InstrumentationTestConfig; -import com.newrelic.agent.introspec.InstrumentationTestRunner; -import com.newrelic.agent.introspec.Introspector; -import com.newrelic.agent.introspec.TraceSegment; -import com.newrelic.agent.introspec.TracedMetricData; -import com.newrelic.agent.introspec.TransactionEvent; -import com.newrelic.agent.introspec.TransactionTrace; -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Trace; -import com.newrelic.api.agent.TransactionNamePriority; -import com.rabbitmq.client.AMQP; -import com.rabbitmq.client.Address; -import com.rabbitmq.client.Channel; -import com.rabbitmq.client.Connection; -import com.rabbitmq.client.ConnectionFactory; -import com.rabbitmq.client.DefaultConsumer; -import com.rabbitmq.client.Envelope; -import com.rabbitmq.client.GetResponse; -import com.rabbitmq.client.QueueingConsumer; -import io.arivera.oss.embedded.rabbitmq.EmbeddedRabbitMq; -import io.arivera.oss.embedded.rabbitmq.EmbeddedRabbitMqConfig; -import io.arivera.oss.embedded.rabbitmq.PredefinedVersion; -import io.arivera.oss.embedded.rabbitmq.util.RandomPortSupplier; -import org.junit.After; -import org.junit.AfterClass; -import org.junit.Before; -import org.junit.BeforeClass; -import org.junit.ClassRule; -import org.junit.Test; -import org.junit.rules.TemporaryFolder; -import org.junit.runner.RunWith; - -import java.io.IOException; -import java.text.MessageFormat; -import java.util.Collection; -import java.util.Collections; -import java.util.HashMap; -import java.util.LinkedList; -import java.util.Map; -import java.util.Queue; -import java.util.UUID; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertTrue; - -@RunWith(InstrumentationTestRunner.class) -@InstrumentationTestConfig(includePrefixes = { "com.rabbitmq.client", "com.rabbitmq.client.impl" }) -public class RabbitMQTest { - private static final String DEFAULT_EXCHANGE = ""; - - @ClassRule - public static TemporaryFolder folder = new TemporaryFolder(); - - private Channel channel; - - private static int port; - - private static EmbeddedRabbitMq rabbitMq; - - @BeforeClass - public static void beforeClass() throws IOException { - port = new RandomPortSupplier().get(); - // Server - EmbeddedRabbitMqConfig config = new EmbeddedRabbitMqConfig.Builder() - .version(PredefinedVersion.V3_6_9) - .downloadFolder(folder.newFolder("download")) - .extractionFolder(folder.newFolder("extraction")) - .rabbitMqServerInitializationTimeoutInMillis(60 * 1000) - .defaultRabbitMqCtlTimeoutInMillis(60 * 1000) - .envVar("RABBITMQ_NODENAME", "RabbitMQ" + port) - .erlangCheckTimeoutInMillis(5000) - .port(port) - .build(); - - rabbitMq = new EmbeddedRabbitMq(config); - rabbitMq.start(); - } - - @AfterClass - public static void afterClass() { - rabbitMq.stop(); - } - - @Before - public void setUp() throws IOException { - ConnectionFactory factory = new ConnectionFactory(); - Connection connection = factory.newConnection(new Address[] { new Address("localhost", port) }); - channel = connection.createChannel(); - } - - @After - public void tearDown() throws IOException { - channel.getConnection().close(); - } - - @Test - public void testProduceConsumePurge() throws IOException { - Introspector introspector = InstrumentationTestRunner.getIntrospector(); - - Map headers = new HashMap<>(); - headers.put("keyOne", 1); - headers.put("keyTwo", 2); - - String queueOne = UUID.randomUUID().toString(); - putGetAndPurge(DEFAULT_EXCHANGE, "direct", queueOne, null, null, null); - String queueOneTxn = MessageFormat.format("OtherTransaction/Test/{0}", queueOne); - assertTrue(introspector.getTransactionNames().contains(queueOneTxn)); - assertProduceConsumePurgeMetrics("Default", queueOne, introspector.getMetricsForTransaction(queueOneTxn)); - assertProduceConsumeTraceAttrs(introspector.getTransactionTracesForTransaction(queueOneTxn).iterator().next(), - "Default", null, null, Collections.emptyMap()); - - String queueTwo = UUID.randomUUID().toString(); - putGetAndPurge("MyExchange", "direct", queueTwo, "replyTo", "correlation-id", headers); - String queueTwoTxn = MessageFormat.format("OtherTransaction/Test/{0}", queueTwo); - assertTrue(introspector.getTransactionNames().contains(queueTwoTxn)); - assertProduceConsumePurgeMetrics("MyExchange", queueTwo, introspector.getMetricsForTransaction(queueTwoTxn)); - assertProduceConsumeTraceAttrs(introspector.getTransactionTracesForTransaction(queueTwoTxn).iterator().next(), - "MyExchange", "replyTo", "correlation-id", Collections.emptyMap()); - - String queueThree = UUID.randomUUID().toString(); - putGetAndPurge("direct", "direct", queueThree, null, null, null); - String queueThreeTxn = MessageFormat.format("OtherTransaction/Test/{0}", queueThree); - assertTrue(introspector.getTransactionNames().contains(queueThreeTxn)); - assertProduceConsumePurgeMetrics("direct", queueThree, introspector.getMetricsForTransaction(queueThreeTxn)); - assertProduceConsumeTraceAttrs(introspector.getTransactionTracesForTransaction(queueThreeTxn).iterator().next(), - "direct", null, null, Collections.emptyMap()); - - String queueFour = UUID.randomUUID().toString(); - putGetAndPurge("TopicExchange", "topic", queueFour, "replyTo", null, headers); - String queueFourTxn = MessageFormat.format("OtherTransaction/Test/{0}", queueFour); - assertTrue(introspector.getTransactionNames().contains(queueFourTxn)); - assertProduceConsumePurgeMetrics("TopicExchange", queueFour, - introspector.getMetricsForTransaction(queueFourTxn)); - assertProduceConsumeTraceAttrs(introspector.getTransactionTracesForTransaction(queueFourTxn).iterator().next(), - "TopicExchange", "replyTo", null, Collections.emptyMap()); - - String queueFive = UUID.randomUUID().toString(); - putGetAndPurge("headers", "headers", queueFive, null, "correlation-id", headers); - String queueFiveTxn = MessageFormat.format("OtherTransaction/Test/{0}", queueFive); - assertTrue(introspector.getTransactionNames().contains(queueFiveTxn)); - assertProduceConsumePurgeMetrics("headers", queueFive, introspector.getMetricsForTransaction(queueFiveTxn)); - assertProduceConsumeTraceAttrs(introspector.getTransactionTracesForTransaction(queueFiveTxn).iterator().next(), - "headers", null, "correlation-id", Collections.emptyMap()); - } - - @Test - public void testMessageListener() throws IOException, InterruptedException { - final String queueName = UUID.randomUUID().toString(); - final String messageForListener = "Hello message listener!"; - - channel.queueDeclare(queueName, false, false, true, Collections.emptyMap()); - channel.basicPublish(DEFAULT_EXCHANGE, queueName, new AMQP.BasicProperties(), messageForListener.getBytes()); - channel.basicConsume(queueName, new DefaultConsumer(channel) { - @Override - public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, - byte[] body) throws IOException { - assertEquals(messageForListener, new String(body)); - } - }); - - // Let handleDelivery Transaction to finish. - Thread.sleep(1000); - - Introspector introspector = InstrumentationTestRunner.getIntrospector(); - - String expectedTransactionName = "OtherTransaction/Message/RabbitMQ/Exchange/Named/Default"; - final Collection transactionNames = introspector.getTransactionNames(); - assertTrue(transactionNames.contains(expectedTransactionName)); - - //Do not record consume metric, message has already been delivered - Map metrics = introspector.getMetricsForTransaction(expectedTransactionName); - assertFalse(metrics.containsKey("MessageBroker/RabbitMQ/Exchange/Consume/Named/Default")); - } - - @Test - public void testCat() throws IOException, InterruptedException { - final Map deliveryHeaders = new HashMap<>(); - final Map consumerHeaders = new HashMap<>(); - - final String queueName = UUID.randomUUID().toString(); - final String replyMessage = "reply"; - final String exchangeName = "MyFavoriteExchange"; - - channel.exchangeDeclare(exchangeName, "topic"); - channel.queueDeclare(queueName, false, false, true, Collections.emptyMap()); - channel.queueBind(queueName, exchangeName, queueName); - System.out.println("Queue name is " + queueName); - - channel.basicConsume(queueName, new DefaultConsumer(channel) { - @Override - public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, - byte[] body) throws IOException { - channel.basicPublish(DEFAULT_EXCHANGE, properties.getReplyTo(), new AMQP.BasicProperties(), - replyMessage.getBytes()); - consumerHeaders.putAll(properties.getHeaders()); - } - }); - - Thread thread = new Thread(new Runnable() { - @Override - @Trace(dispatcher = true) - public void run() { - NewRelic.setTransactionName("Category", "Sender"); - try { - String tempQueue = channel.queueDeclare().getQueue(); - AMQP.BasicProperties basicProperties = new AMQP.BasicProperties(); - basicProperties.setReplyTo(tempQueue); - channel.basicPublish(exchangeName, queueName, basicProperties, "message".getBytes()); - - QueueingConsumer queueingConsumer = new QueueingConsumer(channel); - channel.basicConsume(tempQueue, true, queueingConsumer); - - // block - QueueingConsumer.Delivery delivery = queueingConsumer.nextDelivery(); - deliveryHeaders.putAll(delivery.getProperties().getHeaders()); - assertEquals(replyMessage, new String(delivery.getBody())); - } catch (IOException | InterruptedException ignored) { - } - } - }); - - thread.start(); - thread.join(2000); - - Introspector introspector = InstrumentationTestRunner.getIntrospector(); - - String senderTransactioName = "OtherTransaction/Category/Sender"; - String messageListenerTransactionName = "OtherTransaction/Message/RabbitMQ/Exchange/Named/MyFavoriteExchange"; - - Collection transactionNames = introspector.getTransactionNames(); - assertTrue(transactionNames.contains(senderTransactioName)); - assertTrue(transactionNames.contains(messageListenerTransactionName)); - - Map senderMetrics = introspector.getMetricsForTransaction(senderTransactioName); - assertTrue(senderMetrics.containsKey("MessageBroker/RabbitMQ/Exchange/Produce/Named/MyFavoriteExchange")); - assertTrue(senderMetrics.containsKey("MessageBroker/RabbitMQ/Exchange/Consume/Named/Default")); - - Map messageListenerMetrics = introspector.getMetricsForTransaction( - messageListenerTransactionName); - //Do not record consume metric in listener - assertFalse(messageListenerMetrics.containsKey("MessageBroker/RabbitMQ/Exchange/Consume/Named/MyFavoriteExchange")); - assertTrue(messageListenerMetrics.containsKey("MessageBroker/RabbitMQ/Exchange/Produce/Named/Default")); - - // Test one-way CAT. Both transactions do a publish/consume - assertTrue(consumerHeaders.containsKey("NewRelicTransaction")); - assertTrue(consumerHeaders.containsKey("NewRelicID")); - assertTrue(deliveryHeaders.containsKey("NewRelicTransaction")); - assertTrue(deliveryHeaders.containsKey("NewRelicID")); - - TransactionEvent senderEvent = introspector.getTransactionEvents(senderTransactioName).iterator().next(); - TransactionEvent messageListenerEvent = introspector.getTransactionEvents( - messageListenerTransactionName).iterator().next(); - assertEquals(senderEvent.getMyGuid(), messageListenerEvent.getReferrerGuid()); - assertEquals(senderEvent.getMyPathHash(), messageListenerEvent.getReferringPathHash()); - } - - @Trace(dispatcher = true) - public void putGetAndPurge(String exchangeName, String exchangeType, String queueName, String replyTo, - String correlationId, Map headers) - throws IOException { - channel.queueDeclare(queueName, false, false, true, Collections.emptyMap()); - - if (!exchangeName.equals(DEFAULT_EXCHANGE)) { - channel.exchangeDeclare(exchangeName, exchangeType); - channel.queueBind(queueName, exchangeName, queueName); - } - - AMQP.BasicProperties properties = new AMQP.BasicProperties(); - properties.setReplyTo(replyTo); - properties.setCorrelationId(correlationId); - properties.setHeaders(headers); - channel.basicPublish(exchangeName, queueName, properties, "message".getBytes()); - - GetResponse response = channel.basicGet(queueName, true); - assertEquals("message", new String(response.getBody())); - - NewRelic.getAgent() - .getTransaction() - .setTransactionName(TransactionNamePriority.CUSTOM_HIGH, true, "Test", queueName); - - channel.queuePurge(queueName); - } - - private void assertProduceConsumePurgeMetrics(String exchangeName, String queueName, - Map metrics) { - String consumeMetric = "MessageBroker/RabbitMQ/Exchange/Consume/Named/" + exchangeName; - assertTrue(metrics.containsKey(consumeMetric)); - assertEquals(1, metrics.get(consumeMetric).getCallCount()); - - String produceMetric = "MessageBroker/RabbitMQ/Exchange/Produce/Named/" + exchangeName; - assertTrue(metrics.containsKey(produceMetric)); - assertEquals(1, metrics.get(produceMetric).getCallCount()); - - String purgeMetric = "MessageBroker/RabbitMQ/Queue/Purge/Named/" + queueName; - assertTrue(metrics.containsKey(purgeMetric)); - assertEquals(1, metrics.get(purgeMetric).getCallCount()); - } - - private void assertProduceConsumeTraceAttrs(TransactionTrace trace, String exchangeName, String replyTo, - String correlationId, Map headers) { - // Collect all segments - Map segments = new HashMap<>(); - Queue queue = new LinkedList<>(); - queue.offer(trace.getInitialTraceSegment()); - while (!queue.isEmpty()) { - TraceSegment segment = queue.poll(); - segments.put(segment.getName(), segment); - queue.addAll(segment.getChildren()); - } - - TraceSegment produceSegment = segments.get("MessageBroker/RabbitMQ/Exchange/Consume/Named/" + exchangeName); - assertTrue(produceSegment.getTracerAttributes().containsKey("message.routingKey")); - assertEquals(replyTo, produceSegment.getTracerAttributes().get("message.replyTo")); - assertEquals(correlationId, produceSegment.getTracerAttributes().get("message.correlationId")); - - for (String key : headers.keySet()) { - assertNotNull(produceSegment.getTracerAttributes().get("message." + key)); - } - - TraceSegment consumeSegment = segments.get("MessageBroker/RabbitMQ/Exchange/Consume/Named/" + exchangeName); - assertTrue(consumeSegment.getTracerAttributes().containsKey("message.routingKey")); - assertTrue(consumeSegment.getTracerAttributes().containsKey("message.queueName")); - assertEquals(replyTo, consumeSegment.getTracerAttributes().get("message.replyTo")); - - for (String key : headers.keySet()) { - assertNotNull(consumeSegment.getTracerAttributes().get("message." + key)); - } - } - -} diff --git a/instrumentation/rabbit-amqp-2.5.0/build.gradle b/instrumentation/rabbit-amqp-2.5.0/build.gradle deleted file mode 100644 index 98276e56e6..0000000000 --- a/instrumentation/rabbit-amqp-2.5.0/build.gradle +++ /dev/null @@ -1,20 +0,0 @@ -dependencies { - implementation(project(":agent-bridge")) - implementation("com.rabbitmq:amqp-client:2.6.0") - - testImplementation("io.arivera.oss:embedded-rabbitmq:1.4.0") - testImplementation("org.slf4j:slf4j-simple:1.7.30") -} - -jar { - manifest { attributes 'Implementation-Title': 'com.newrelic.instrumentation.rabbit-amqp-2.5.0' } -} - -verifyInstrumentation { - passesOnly 'com.rabbitmq:amqp-client:[2.5.0,2.7.0)' -} - -site { - title 'RabbitAMQP' - type 'Messaging' -} \ No newline at end of file diff --git a/instrumentation/rabbit-amqp-2.5.0/src/main/java/com/nr/agent/instrumentation/rabbitamqp250/InboundWrapper.java b/instrumentation/rabbit-amqp-2.5.0/src/main/java/com/nr/agent/instrumentation/rabbitamqp250/InboundWrapper.java deleted file mode 100644 index f16801e77a..0000000000 --- a/instrumentation/rabbit-amqp-2.5.0/src/main/java/com/nr/agent/instrumentation/rabbitamqp250/InboundWrapper.java +++ /dev/null @@ -1,48 +0,0 @@ -/* - * - * * Copyright 2020 New Relic Corporation. All rights reserved. - * * SPDX-License-Identifier: Apache-2.0 - * - */ - -package com.nr.agent.instrumentation.rabbitamqp250; - -import java.util.Collections; -import java.util.List; -import java.util.Map; - -import com.newrelic.api.agent.HeaderType; -import com.newrelic.api.agent.ExtendedInboundHeaders; - -public class InboundWrapper extends ExtendedInboundHeaders { - private final Map delegate; - - public InboundWrapper(Map arguments) { - super(); - this.delegate = arguments; - } - - @Override - public String getHeader(String name) { - Object property = delegate.get(name); - if (property == null) { - return null; - } - return property.toString(); - } - - @Override - public List getHeaders(String name) { - String result = getHeader(name); - if (result == null) { - return null; - } - return Collections.singletonList(result); - } - - @Override - public HeaderType getHeaderType() { - return HeaderType.MESSAGE; - } - -} diff --git a/instrumentation/rabbit-amqp-2.5.0/src/main/java/com/nr/agent/instrumentation/rabbitamqp250/OutboundWrapper.java b/instrumentation/rabbit-amqp-2.5.0/src/main/java/com/nr/agent/instrumentation/rabbitamqp250/OutboundWrapper.java deleted file mode 100644 index 97c5b8d885..0000000000 --- a/instrumentation/rabbit-amqp-2.5.0/src/main/java/com/nr/agent/instrumentation/rabbitamqp250/OutboundWrapper.java +++ /dev/null @@ -1,32 +0,0 @@ -/* - * - * * Copyright 2020 New Relic Corporation. All rights reserved. - * * SPDX-License-Identifier: Apache-2.0 - * - */ - -package com.nr.agent.instrumentation.rabbitamqp250; - -import java.util.Map; - -import com.newrelic.api.agent.HeaderType; -import com.newrelic.api.agent.OutboundHeaders; - -public class OutboundWrapper implements OutboundHeaders { - - private final Map delegate; - - public OutboundWrapper(Map headers) { - this.delegate = headers; - } - - @Override - public void setHeader(String name, String value) { - delegate.put(name, value); - } - - @Override - public HeaderType getHeaderType() { - return HeaderType.MESSAGE; - } -} diff --git a/instrumentation/rabbit-amqp-2.5.0/src/main/java/com/nr/agent/instrumentation/rabbitamqp250/RabbitAMQPMetricUtil.java b/instrumentation/rabbit-amqp-2.5.0/src/main/java/com/nr/agent/instrumentation/rabbitamqp250/RabbitAMQPMetricUtil.java deleted file mode 100644 index 7af3851496..0000000000 --- a/instrumentation/rabbit-amqp-2.5.0/src/main/java/com/nr/agent/instrumentation/rabbitamqp250/RabbitAMQPMetricUtil.java +++ /dev/null @@ -1,144 +0,0 @@ -/* - * - * * Copyright 2020 New Relic Corporation. All rights reserved. - * * SPDX-License-Identifier: Apache-2.0 - * - */ - -package com.nr.agent.instrumentation.rabbitamqp250; - -import com.newrelic.agent.bridge.AgentBridge; -import com.newrelic.agent.bridge.TracedMethod; -import com.newrelic.agent.bridge.TransactionNamePriority; -import com.newrelic.api.agent.DestinationType; -import com.newrelic.api.agent.MessageConsumeParameters; -import com.newrelic.api.agent.MessageProduceParameters; -import com.rabbitmq.client.AMQP; -import com.rabbitmq.client.Connection; - -import java.net.InetAddress; -import java.text.MessageFormat; -import java.util.HashMap; -import java.util.Map; - -public abstract class RabbitAMQPMetricUtil { - private static final String RABBITMQ = "RabbitMQ"; - - private static final String MESSAGE_BROKER_TRANSACTION_EXCHANGE_NAMED = "RabbitMQ/Exchange/Named/{0}"; - - private static final String MESSAGE = "Message"; - private static final String DEFAULT = "Default"; - - private static final boolean captureSegmentParameters = AgentBridge.getAgent() - .getConfig() - .getValue("message_tracer.segment_parameters.enabled", Boolean.TRUE); - - public static void nameTransaction(String exchangeName) { - String transactionName = MessageFormat.format(MESSAGE_BROKER_TRANSACTION_EXCHANGE_NAMED, - exchangeName.isEmpty() ? DEFAULT : exchangeName); - AgentBridge.getAgent() - .getTransaction() - .setTransactionName(TransactionNamePriority.FRAMEWORK, false, MESSAGE, transactionName); - } - - public static void processSendMessage(String exchangeName, String routingKey, - HashMap headers, - AMQP.BasicProperties props, TracedMethod tracedMethod, Connection connection) { - String host = getHost(connection); - Integer port = getPort(connection); - tracedMethod.reportAsExternal(MessageProduceParameters - .library(RABBITMQ) - .destinationType(DestinationType.EXCHANGE) - .destinationName(wrapExchange(exchangeName)) - .outboundHeaders(new OutboundWrapper(headers)) - .instance(host, port) - .build()); - - addProduceAttributes(exchangeName, routingKey, props); - } - - public static void processGetMessage(String queueName, String routingKey, String exchangeName, - AMQP.BasicProperties properties, TracedMethod tracedMethod, Connection connection) { - String host = getHost(connection); - Integer port = getPort(connection); - tracedMethod.reportAsExternal(MessageConsumeParameters - .library(RABBITMQ) - .destinationType(DestinationType.EXCHANGE) - .destinationName(wrapExchange(exchangeName)) - .inboundHeaders(new InboundWrapper(properties.getHeaders())) - .instance(host, port) - .build()); - - addConsumeAttributes(exchangeName, queueName, routingKey, properties); - } - - public static void addConsumeAttributes(String exchangeName, String queueName, String routingKey, AMQP.BasicProperties properties) { - if (queueName != null && captureSegmentParameters) { - AgentBridge.privateApi.addTracerParameter("message.queueName", queueName, true); - // OTel attributes - AgentBridge.privateApi.addTracerParameter("messaging.destination.name", queueName, true); - if (exchangeName != null) { - AgentBridge.privateApi.addTracerParameter("messaging.destination_publish.name", exchangeName, true); - } - } - addAttributes(routingKey, properties); - } - - public static void addProduceAttributes(String exchangeName, String routingKey, AMQP.BasicProperties properties) { - if (exchangeName != null && captureSegmentParameters) { - // OTel attributes - AgentBridge.privateApi.addTracerParameter("messaging.destination.name", wrapExchange(exchangeName), true); - } - addAttributes(routingKey, properties); - } - - public static String wrapExchange(String exchangeName) { - return exchangeName.isEmpty() ? DEFAULT : exchangeName; - } - - public static void queuePurge(String queue, TracedMethod tracedMethod) { - tracedMethod.setMetricName(MessageFormat.format("MessageBroker/{0}/Queue/Purge/Named/{1}", - RABBITMQ, queue.isEmpty() ? DEFAULT : queue)); - } - - private static String getHost(Connection connection) { - String host = null; - if (connection != null) { - InetAddress address = connection.getAddress(); - if (address != null) { - host = address.getHostName(); - } - } - return host; - } - - private static Integer getPort(Connection connection) { - return (connection != null) ? connection.getPort() : null; - } - - private static void addAttributes(String routingKey, AMQP.BasicProperties properties) { - if (!captureSegmentParameters) { - return; - } - - AgentBridge.privateApi.addTracerParameter("message.routingKey", routingKey, true); - // Add Open Telemetry attribute for routing key to be added to spans - AgentBridge.privateApi.addTracerParameter("messaging.rabbitmq.destination.routing_key", routingKey, true); - if (properties.getReplyTo() != null) { - AgentBridge.privateApi.addTracerParameter("message.replyTo", properties.getReplyTo()); - } - if (properties.getCorrelationId() != null) { - AgentBridge.privateApi.addTracerParameter("message.correlationId", properties.getCorrelationId()); - } - if (properties.getHeaders() != null) { - for (Map.Entry entry : properties.getHeaders().entrySet()) { - if (entry.getKey().equals("NewRelicTransaction") || entry.getKey().equals("NewRelicID")) { - continue; - } - - AgentBridge.privateApi.addTracerParameter("message.headers." + entry.getKey(), entry.toString()); - } - } - } - -} diff --git a/instrumentation/rabbit-amqp-2.5.0/src/main/java/com/rabbitmq/client/Consumer_Instrumentation.java b/instrumentation/rabbit-amqp-2.5.0/src/main/java/com/rabbitmq/client/Consumer_Instrumentation.java deleted file mode 100644 index a1e1e7a034..0000000000 --- a/instrumentation/rabbit-amqp-2.5.0/src/main/java/com/rabbitmq/client/Consumer_Instrumentation.java +++ /dev/null @@ -1,33 +0,0 @@ -/* - * - * * Copyright 2020 New Relic Corporation. All rights reserved. - * * SPDX-License-Identifier: Apache-2.0 - * - */ - -package com.rabbitmq.client; - -import java.io.IOException; - -import com.newrelic.api.agent.TransportType; -import com.nr.agent.instrumentation.rabbitamqp250.InboundWrapper; -import com.nr.agent.instrumentation.rabbitamqp250.RabbitAMQPMetricUtil; -import com.newrelic.agent.bridge.AgentBridge; -import com.newrelic.api.agent.Trace; -import com.newrelic.api.agent.weaver.MatchType; -import com.newrelic.api.agent.weaver.Weave; -import com.newrelic.api.agent.weaver.Weaver; - -@Weave(type = MatchType.Interface, originalName = "com.rabbitmq.client.Consumer") -public abstract class Consumer_Instrumentation { - - @Trace(dispatcher = true) - public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) - throws IOException { - RabbitAMQPMetricUtil.nameTransaction(envelope.getExchange()); - AgentBridge.getAgent().getTransaction().provideHeaders(new InboundWrapper(properties.getHeaders())); - AgentBridge.getAgent().getTransaction(false).setTransportType(TransportType.AMQP); - RabbitAMQPMetricUtil.addConsumeAttributes(envelope.getExchange(), null, envelope.getRoutingKey(), properties); - Weaver.callOriginal(); - } -} diff --git a/instrumentation/rabbit-amqp-2.5.0/src/main/java/com/rabbitmq/client/QueueingConsumer_Instrumentation.java b/instrumentation/rabbit-amqp-2.5.0/src/main/java/com/rabbitmq/client/QueueingConsumer_Instrumentation.java deleted file mode 100644 index c48c0c42f0..0000000000 --- a/instrumentation/rabbit-amqp-2.5.0/src/main/java/com/rabbitmq/client/QueueingConsumer_Instrumentation.java +++ /dev/null @@ -1,50 +0,0 @@ -/* - * - * * Copyright 2020 New Relic Corporation. All rights reserved. - * * SPDX-License-Identifier: Apache-2.0 - * - */ - -package com.rabbitmq.client; - -import com.nr.agent.instrumentation.rabbitamqp250.RabbitAMQPMetricUtil; -import com.newrelic.agent.bridge.AgentBridge; -import com.newrelic.api.agent.Trace; -import com.newrelic.api.agent.weaver.MatchType; -import com.newrelic.api.agent.weaver.Weave; -import com.newrelic.api.agent.weaver.Weaver; -import com.rabbitmq.client.AMQP.BasicProperties; - -@Weave(type = MatchType.BaseClass, originalName = "com.rabbitmq.client.QueueingConsumer") -public abstract class QueueingConsumer_Instrumentation { - - public abstract Channel getChannel(); - - @Weave(originalName = "com.rabbitmq.client.QueueingConsumer$Delivery") - public static class Delivery_Instrumentation { - public BasicProperties getProperties() { - return Weaver.callOriginal(); - } - - public Envelope getEnvelope() { - return Weaver.callOriginal(); - } - } - - @Trace - public QueueingConsumer.Delivery nextDelivery() { - QueueingConsumer.Delivery delivery = Weaver.callOriginal(); - Envelope envelope = delivery.getEnvelope(); - BasicProperties props = delivery.getProperties(); - Connection connection = null; - Channel channel = getChannel(); - if (channel != null) { - connection = channel.getConnection(); - } - RabbitAMQPMetricUtil.processGetMessage(null, envelope.getRoutingKey(), - envelope.getExchange(), props, AgentBridge.getAgent().getTracedMethod(), connection); - RabbitAMQPMetricUtil.nameTransaction(envelope.getExchange()); - return delivery; - } - -} diff --git a/instrumentation/rabbit-amqp-2.5.0/src/main/java/com/rabbitmq/client/impl/ChannelN_Instrumentation.java b/instrumentation/rabbit-amqp-2.5.0/src/main/java/com/rabbitmq/client/impl/ChannelN_Instrumentation.java deleted file mode 100644 index f880755c96..0000000000 --- a/instrumentation/rabbit-amqp-2.5.0/src/main/java/com/rabbitmq/client/impl/ChannelN_Instrumentation.java +++ /dev/null @@ -1,67 +0,0 @@ -/* - * - * * Copyright 2020 New Relic Corporation. All rights reserved. - * * SPDX-License-Identifier: Apache-2.0 - * - */ - -package com.rabbitmq.client.impl; - -import com.newrelic.agent.bridge.AgentBridge; -import com.newrelic.api.agent.Trace; -import com.newrelic.api.agent.weaver.MatchType; -import com.newrelic.api.agent.weaver.Weave; -import com.newrelic.api.agent.weaver.Weaver; -import com.nr.agent.instrumentation.rabbitamqp250.RabbitAMQPMetricUtil; -import com.rabbitmq.client.AMQP.BasicProperties; -import com.rabbitmq.client.Connection; -import com.rabbitmq.client.GetResponse; -import com.rabbitmq.client.MessageProperties; - -import java.util.HashMap; - -@Weave(type = MatchType.ExactClass, originalName = "com.rabbitmq.client.impl.ChannelN") -public abstract class ChannelN_Instrumentation { - - public abstract Connection getConnection(); - - @Trace - public void basicPublish(String exchange, String routingKey, boolean mandatory, boolean immediate, - BasicProperties props, byte[] body) { - - if (props == null) { - props = MessageProperties.MINIMAL_BASIC; - } - - // Property headers is an Unmodifiable map. - // Create new map to hold new outbound and existing headers. - HashMap headers = new HashMap<>(); - if (props.getHeaders() != null) { - headers.putAll(props.getHeaders()); - } - RabbitAMQPMetricUtil.processSendMessage(exchange, routingKey, headers, props, - AgentBridge.getAgent().getTracedMethod(), getConnection()); - props = props.builder().headers(headers).build(); - Weaver.callOriginal(); - } - - /* - * basicGet retrieves messages individually. - */ - @Trace - public GetResponse basicGet(String queue, boolean autoAck) { - GetResponse response = Weaver.callOriginal(); - if (response != null) { - RabbitAMQPMetricUtil.processGetMessage(queue, response.getEnvelope().getRoutingKey(), - response.getEnvelope().getExchange(), response.getProps(), - AgentBridge.getAgent().getTracedMethod(), getConnection()); - } - return response; - } - - @Trace - public AMQImpl.Queue.PurgeOk queuePurge(String queue) { - RabbitAMQPMetricUtil.queuePurge(queue, AgentBridge.getAgent().getTracedMethod()); - return Weaver.callOriginal(); - } -} diff --git a/instrumentation/rabbit-amqp-2.5.0/src/test/java/com/nr/agent/instrumentation/rabbitamqp250/RabbitMQTest.java b/instrumentation/rabbit-amqp-2.5.0/src/test/java/com/nr/agent/instrumentation/rabbitamqp250/RabbitMQTest.java deleted file mode 100644 index 52d6cb3034..0000000000 --- a/instrumentation/rabbit-amqp-2.5.0/src/test/java/com/nr/agent/instrumentation/rabbitamqp250/RabbitMQTest.java +++ /dev/null @@ -1,342 +0,0 @@ -/* - * - * * Copyright 2020 New Relic Corporation. All rights reserved. - * * SPDX-License-Identifier: Apache-2.0 - * - */ - -package com.nr.agent.instrumentation.rabbitamqp250; - -import com.newrelic.agent.introspec.InstrumentationTestConfig; -import com.newrelic.agent.introspec.InstrumentationTestRunner; -import com.newrelic.agent.introspec.Introspector; -import com.newrelic.agent.introspec.TraceSegment; -import com.newrelic.agent.introspec.TracedMetricData; -import com.newrelic.agent.introspec.TransactionEvent; -import com.newrelic.agent.introspec.TransactionTrace; -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Trace; -import com.newrelic.api.agent.TransactionNamePriority; -import com.rabbitmq.client.AMQP; -import com.rabbitmq.client.Channel; -import com.rabbitmq.client.Connection; -import com.rabbitmq.client.ConnectionFactory; -import com.rabbitmq.client.DefaultConsumer; -import com.rabbitmq.client.Envelope; -import com.rabbitmq.client.GetResponse; -import com.rabbitmq.client.QueueingConsumer; -import io.arivera.oss.embedded.rabbitmq.EmbeddedRabbitMq; -import io.arivera.oss.embedded.rabbitmq.EmbeddedRabbitMqConfig; -import io.arivera.oss.embedded.rabbitmq.PredefinedVersion; -import io.arivera.oss.embedded.rabbitmq.apache.commons.lang3.SystemUtils; -import io.arivera.oss.embedded.rabbitmq.util.RandomPortSupplier; -import org.junit.After; -import org.junit.AfterClass; -import org.junit.Before; -import org.junit.BeforeClass; -import org.junit.ClassRule; -import org.junit.Test; -import org.junit.rules.TemporaryFolder; -import org.junit.runner.RunWith; - -import java.io.File; -import java.io.IOException; -import java.text.MessageFormat; -import java.util.Collection; -import java.util.Collections; -import java.util.HashMap; -import java.util.LinkedList; -import java.util.Map; -import java.util.Queue; -import java.util.UUID; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertTrue; - -@RunWith(InstrumentationTestRunner.class) -@InstrumentationTestConfig(includePrefixes = { "com.rabbitmq.client", "com.rabbitmq.client.impl" }) -public class RabbitMQTest { - private static final String DEFAULT_EXCHANGE = ""; - - @ClassRule - public static TemporaryFolder folder = new TemporaryFolder(); - - private static EmbeddedRabbitMq rabbitMq; - - private Channel channel; - - private static int port; - - @BeforeClass - public static void beforeClass() throws IOException { - port = new RandomPortSupplier().get(); - // Server - EmbeddedRabbitMqConfig config = new EmbeddedRabbitMqConfig.Builder() - .version(PredefinedVersion.V3_6_9) - .downloadFolder(folder.newFolder("download")) - .extractionFolder(folder.newFolder("extraction")) - .rabbitMqServerInitializationTimeoutInMillis(60 * 1000) - .defaultRabbitMqCtlTimeoutInMillis(60 * 1000) - .envVar("RABBITMQ_NODENAME", "RabbitMQ" + port) - .erlangCheckTimeoutInMillis(5000) - .port(port) - .build(); - - rabbitMq = new EmbeddedRabbitMq(config); - rabbitMq.start(); - } - - @AfterClass - public static void afterClass() { - rabbitMq.stop(); - } - - @Before - public void setUp() throws IOException { - ConnectionFactory factory = new ConnectionFactory(); - factory.setPort(port); - factory.setHost("localhost"); - Connection connection = factory.newConnection(); - channel = connection.createChannel(); - } - - @After - public void tearDown() throws IOException { - channel.getConnection().close(); - } - - @Test - public void testProduceConsumePurge() throws IOException { - Introspector introspector = InstrumentationTestRunner.getIntrospector(); - - Map headers = new HashMap<>(); - headers.put("keyOne", 1); - headers.put("keyTwo", 2); - - String queueOne = UUID.randomUUID().toString(); - putGetAndPurge(DEFAULT_EXCHANGE, "direct", queueOne, null, null, null); - String queueOneTxn = MessageFormat.format("OtherTransaction/Test/{0}", queueOne); - assertTrue(introspector.getTransactionNames().contains(queueOneTxn)); - assertProduceConsumePurgeMetrics("Default", queueOne, introspector.getMetricsForTransaction(queueOneTxn)); - assertProduceConsumeTraceAttrs(introspector.getTransactionTracesForTransaction(queueOneTxn).iterator().next(), - "Default", null, null, Collections.emptyMap()); - - String queueTwo = UUID.randomUUID().toString(); - putGetAndPurge("MyExchange", "direct", queueTwo, "replyTo", "correlation-id", headers); - String queueTwoTxn = MessageFormat.format("OtherTransaction/Test/{0}", queueTwo); - assertTrue(introspector.getTransactionNames().contains(queueTwoTxn)); - assertProduceConsumePurgeMetrics("MyExchange", queueTwo, introspector.getMetricsForTransaction(queueTwoTxn)); - assertProduceConsumeTraceAttrs(introspector.getTransactionTracesForTransaction(queueTwoTxn).iterator().next(), - "MyExchange", "replyTo", "correlation-id", Collections.emptyMap()); - - String queueThree = UUID.randomUUID().toString(); - putGetAndPurge("direct", "direct", queueThree, null, null, null); - String queueThreeTxn = MessageFormat.format("OtherTransaction/Test/{0}", queueThree); - assertTrue(introspector.getTransactionNames().contains(queueThreeTxn)); - assertProduceConsumePurgeMetrics("direct", queueThree, introspector.getMetricsForTransaction(queueThreeTxn)); - assertProduceConsumeTraceAttrs(introspector.getTransactionTracesForTransaction(queueThreeTxn).iterator().next(), - "direct", null, null, Collections.emptyMap()); - - String queueFour = UUID.randomUUID().toString(); - putGetAndPurge("TopicExchange", "topic", queueFour, "replyTo", null, headers); - String queueFourTxn = MessageFormat.format("OtherTransaction/Test/{0}", queueFour); - assertTrue(introspector.getTransactionNames().contains(queueFourTxn)); - assertProduceConsumePurgeMetrics("TopicExchange", queueFour, - introspector.getMetricsForTransaction(queueFourTxn)); - assertProduceConsumeTraceAttrs(introspector.getTransactionTracesForTransaction(queueFourTxn).iterator().next(), - "TopicExchange", "replyTo", null, Collections.emptyMap()); - - String queueFive = UUID.randomUUID().toString(); - putGetAndPurge("headers", "headers", queueFive, null, "correlation-id", headers); - String queueFiveTxn = MessageFormat.format("OtherTransaction/Test/{0}", queueFive); - assertTrue(introspector.getTransactionNames().contains(queueFiveTxn)); - assertProduceConsumePurgeMetrics("headers", queueFive, introspector.getMetricsForTransaction(queueFiveTxn)); - assertProduceConsumeTraceAttrs(introspector.getTransactionTracesForTransaction(queueFiveTxn).iterator().next(), - "headers", null, "correlation-id", Collections.emptyMap()); - } - - @Test - public void testMessageListener() throws IOException, InterruptedException { - final String queueName = UUID.randomUUID().toString(); - final String messageForListener = "Hello message listener!"; - - channel.queueDeclare(queueName, false, false, true, Collections.emptyMap()); - channel.basicPublish(DEFAULT_EXCHANGE, queueName, new AMQP.BasicProperties(), messageForListener.getBytes()); - channel.basicConsume(queueName, new DefaultConsumer(channel) { - @Override - public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, - byte[] body) throws IOException { - assertEquals(messageForListener, new String(body)); - } - }); - - // Let handleDelivery Transaction to finish. - Thread.sleep(1000); - - Introspector introspector = InstrumentationTestRunner.getIntrospector(); - - String expectedTransactionName = "OtherTransaction/Message/RabbitMQ/Exchange/Named/Default"; - final Collection transactionNames = introspector.getTransactionNames(); - assertTrue(transactionNames.contains(expectedTransactionName)); - - Map metrics = introspector.getMetricsForTransaction(expectedTransactionName); - //Do not record consume metric, message has already been delivered - assertFalse(metrics.containsKey("MessageBroker/RabbitMQ/Exchange/Consume/Named/Default")); - } - - @Test - public void testCat() throws IOException, InterruptedException { - final Map deliveryHeaders = new HashMap<>(); - final Map consumerHeaders = new HashMap<>(); - - final String queueName = UUID.randomUUID().toString(); - final String replyMessage = "reply"; - final String exchangeName = "MyFavoriteExchange"; - - channel.exchangeDeclare(exchangeName, "topic"); - channel.queueDeclare(queueName, false, false, true, Collections.emptyMap()); - channel.queueBind(queueName, exchangeName, queueName); - - channel.basicConsume(queueName, new DefaultConsumer(channel) { - @Override - public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, - byte[] body) throws IOException { - channel.basicPublish(DEFAULT_EXCHANGE, properties.getReplyTo(), new AMQP.BasicProperties(), - replyMessage.getBytes()); - consumerHeaders.putAll(properties.getHeaders()); - } - }); - - Thread thread = new Thread(new Runnable() { - @Override - @Trace(dispatcher = true) - public void run() { - NewRelic.setTransactionName("Category", "Sender"); - try { - String tempQueue = channel.queueDeclare().getQueue(); - AMQP.BasicProperties.Builder builder = new AMQP.BasicProperties().builder(); - builder.replyTo(tempQueue); - channel.basicPublish(exchangeName, queueName, builder.build(), "message".getBytes()); - - QueueingConsumer queueingConsumer = new QueueingConsumer(channel); - channel.basicConsume(tempQueue, true, queueingConsumer); - - // block - QueueingConsumer.Delivery delivery = queueingConsumer.nextDelivery(); - deliveryHeaders.putAll(delivery.getProperties().getHeaders()); - assertEquals(replyMessage, new String(delivery.getBody())); - } catch (IOException | InterruptedException ignored) { - } - } - }); - - thread.start(); - thread.join(2000); - - Introspector introspector = InstrumentationTestRunner.getIntrospector(); - - String senderTransactioName = "OtherTransaction/Category/Sender"; - String messageListenerTransactionName = "OtherTransaction/Message/RabbitMQ/Exchange/Named/MyFavoriteExchange"; - - Collection transactionNames = introspector.getTransactionNames(); - assertTrue(transactionNames.contains(senderTransactioName)); - assertTrue(transactionNames.contains(messageListenerTransactionName)); - - Map senderMetrics = introspector.getMetricsForTransaction(senderTransactioName); - assertTrue(senderMetrics.containsKey("MessageBroker/RabbitMQ/Exchange/Produce/Named/MyFavoriteExchange")); - assertTrue(senderMetrics.containsKey("MessageBroker/RabbitMQ/Exchange/Consume/Named/Default")); - - Map messageListenerMetrics = introspector.getMetricsForTransaction(messageListenerTransactionName); - //Do not record consume metric in listener - assertFalse(messageListenerMetrics.containsKey("MessageBroker/RabbitMQ/Exchange/Consume/Named/MyFavoriteExchange")); - assertTrue(messageListenerMetrics.containsKey("MessageBroker/RabbitMQ/Exchange/Produce/Named/Default")); - - // Test one-way CAT. Both transactions do a publish/consume - assertTrue(consumerHeaders.containsKey("NewRelicTransaction")); - assertTrue(consumerHeaders.containsKey("NewRelicID")); - assertTrue(deliveryHeaders.containsKey("NewRelicTransaction")); - assertTrue(deliveryHeaders.containsKey("NewRelicID")); - - TransactionEvent senderEvent = introspector.getTransactionEvents(senderTransactioName).iterator().next(); - TransactionEvent messageListenerEvent = introspector.getTransactionEvents( - messageListenerTransactionName).iterator().next(); - assertEquals(senderEvent.getMyGuid(), messageListenerEvent.getReferrerGuid()); - assertEquals(senderEvent.getMyPathHash(), messageListenerEvent.getReferringPathHash()); - } - - @Trace(dispatcher = true) - public void putGetAndPurge(String exchangeName, String exchangeType, String queueName, String replyTo, - String correlationId, Map headers) - throws IOException { - channel.queueDeclare(queueName, false, false, true, Collections.emptyMap()); - - if (!exchangeName.equals(DEFAULT_EXCHANGE)) { - channel.exchangeDeclare(exchangeName, exchangeType); - channel.queueBind(queueName, exchangeName, queueName); - } - - AMQP.BasicProperties.Builder builder = new AMQP.BasicProperties.Builder(); - builder.replyTo(replyTo); - builder.correlationId(correlationId); - builder.headers(headers); - channel.basicPublish(exchangeName, queueName, builder.build(), "message".getBytes()); - - GetResponse response = channel.basicGet(queueName, true); - assertEquals("message", new String(response.getBody())); - - NewRelic.getAgent() - .getTransaction() - .setTransactionName(TransactionNamePriority.CUSTOM_HIGH, true, "Test", queueName); - - channel.queuePurge(queueName); - } - - private void assertProduceConsumePurgeMetrics(String exchangeName, String queueName, - Map metrics) { - String consumeMetric = "MessageBroker/RabbitMQ/Exchange/Consume/Named/" + exchangeName; - assertTrue(metrics.containsKey(consumeMetric)); - assertEquals(1, metrics.get(consumeMetric).getCallCount()); - - String produceMetric = "MessageBroker/RabbitMQ/Exchange/Produce/Named/" + exchangeName; - assertTrue(metrics.containsKey(produceMetric)); - assertEquals(1, metrics.get(produceMetric).getCallCount()); - - String purgeMetric = "MessageBroker/RabbitMQ/Queue/Purge/Named/" + queueName; - assertTrue(metrics.containsKey(purgeMetric)); - assertEquals(1, metrics.get(purgeMetric).getCallCount()); - } - - private void assertProduceConsumeTraceAttrs(TransactionTrace trace, String exchangeName, String replyTo, - String correlationId, Map headers) { - // Collect all segments - Map segments = new HashMap<>(); - Queue queue = new LinkedList<>(); - queue.offer(trace.getInitialTraceSegment()); - while (!queue.isEmpty()) { - TraceSegment segment = queue.poll(); - segments.put(segment.getName(), segment); - queue.addAll(segment.getChildren()); - } - - TraceSegment produceSegment = segments.get("MessageBroker/RabbitMQ/Exchange/Consume/Named/" + exchangeName); - assertTrue(produceSegment.getTracerAttributes().containsKey("message.routingKey")); - assertEquals(replyTo, produceSegment.getTracerAttributes().get("message.replyTo")); - assertEquals(correlationId, produceSegment.getTracerAttributes().get("message.correlationId")); - - for (String key : headers.keySet()) { - assertNotNull(produceSegment.getTracerAttributes().get("message." + key)); - } - - TraceSegment consumeSegment = segments.get("MessageBroker/RabbitMQ/Exchange/Consume/Named/" + exchangeName); - assertTrue(consumeSegment.getTracerAttributes().containsKey("message.routingKey")); - assertTrue(consumeSegment.getTracerAttributes().containsKey("message.queueName")); - assertEquals(replyTo, consumeSegment.getTracerAttributes().get("message.replyTo")); - - for (String key : headers.keySet()) { - assertNotNull(consumeSegment.getTracerAttributes().get("message." + key)); - } - } - -} diff --git a/settings.gradle b/settings.gradle index 98de464c6d..6565ad5b49 100644 --- a/settings.gradle +++ b/settings.gradle @@ -358,9 +358,6 @@ include 'instrumentation:r2dbc-mysql-1.1.3' include 'instrumentation:r2dbc-postgresql-0.9.0' include 'instrumentation:r2dbc-postgresql-0.9.2' include 'instrumentation:r2dbc-mssql' -include 'instrumentation:rabbit-amqp-1.7.2' -include 'instrumentation:rabbit-amqp-2.4.1' -include 'instrumentation:rabbit-amqp-2.5.0' include 'instrumentation:rabbit-amqp-2.7.0' include 'instrumentation:rabbit-amqp-5.0.0' include 'instrumentation:reactor-3.3.0'