Skip to content

Commit

Permalink
Add optional span context container to consumer to retrieve child span (
Browse files Browse the repository at this point in the history
  • Loading branch information
malafeev committed Jun 4, 2019
1 parent e4e815b commit 18aa97c
Show file tree
Hide file tree
Showing 14 changed files with 143 additions and 78 deletions.
2 changes: 0 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -71,8 +71,6 @@ You most likely need to exclude spring-jms and spring-context dependencies and a
// Instantiate tracer
Tracer tracer = ...

// Optionally register tracer with GlobalTracer:
GlobalTracer.register(tracer);
```

### JMS API
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,6 @@
import io.opentracing.Tracer;
import io.opentracing.contrib.jms.common.SpanJmsDecorator;
import io.opentracing.contrib.jms.common.TracingMessageUtils;
import io.opentracing.util.GlobalTracer;
import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.Message;
Expand All @@ -32,13 +31,6 @@ public class TracingMessageProducer implements MessageProducer {
private final MessageProducer messageProducer;
private final Tracer tracer;

/**
* GlobalTracer is used to get tracer
*/
public TracingMessageProducer(MessageProducer messageProducer) {
this(messageProducer, GlobalTracer.get());
}

public TracingMessageProducer(MessageProducer messageProducer, Tracer tracer) {
this.messageProducer = messageProducer;
this.tracer = tracer;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;

import io.opentracing.contrib.jms.common.SpanContextContainer;
import io.opentracing.contrib.jms.common.TracingMessageConsumer;
import io.opentracing.contrib.jms.common.TracingMessageListener;
import io.opentracing.contrib.jms.common.TracingMessageUtils;
Expand Down Expand Up @@ -99,6 +100,39 @@ public void sendAndReceive() throws Exception {
assertNull(mockTracer.activeSpan());
}

@Test
public void sendAndReceiveWithProxyMessage() throws Exception {
Destination destination = session.createQueue("TEST.FOO");

MessageProducer messageProducer = session.createProducer(destination);
messageProducer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);

// Instrument MessageProducer with TracingMessageProducer
TracingMessageProducer producer =
new TracingMessageProducer(messageProducer, mockTracer);

MessageConsumer messageConsumer = session.createConsumer(destination);

// Instrument MessageConsumer with TracingMessageConsumer
TracingMessageConsumer consumer = new TracingMessageConsumer(messageConsumer, mockTracer, true);

TextMessage message = session.createTextMessage("Hello world");
producer.send(message);

TextMessage received = (TextMessage) consumer.receive(5000);
assertEquals("Hello world", received.getText());

assertTrue(received instanceof SpanContextContainer);
SpanContextContainer spanContextContainer = (SpanContextContainer) received;
assertNotNull(spanContextContainer.getSpanContext());

List<MockSpan> mockSpans = mockTracer.finishedSpans();
assertEquals(2, mockSpans.size());

checkSpans(mockSpans);
assertNull(mockTracer.activeSpan());
}

@Test
public void sendAndReceiveInExplicitTracingListener() throws Exception {
Destination destination = session.createQueue("TEST.FOO");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,6 @@
import io.opentracing.Tracer;
import io.opentracing.contrib.jms.common.SpanJmsDecorator;
import io.opentracing.contrib.jms.common.TracingMessageUtils;
import io.opentracing.util.GlobalTracer;
import java.io.Serializable;
import java.util.Map;
import java.util.Set;
Expand All @@ -44,26 +43,12 @@ public class TracingJMSProducer implements JMSProducer {
private Session jmsSession = null;
private final Tracer tracer;

/**
* GlobalTracer is used to get tracer
*/
public TracingJMSProducer(JMSProducer jmsProducer, JMSContext jmsContext) {
this(jmsProducer, jmsContext, GlobalTracer.get());
}

public TracingJMSProducer(JMSProducer jmsProducer, JMSContext jmsContext, Tracer tracer) {
this.jmsProducer = jmsProducer;
this.jmsContext = jmsContext;
this.tracer = tracer;
}

/**
* GlobalTracer is used to get tracer
*/
public TracingJMSProducer(JMSProducer jmsProducer, Session jmsSession) {
this(jmsProducer, jmsSession, GlobalTracer.get());
}

public TracingJMSProducer(JMSProducer jmsProducer, Session jmsSession, Tracer tracer) {
this.jmsProducer = jmsProducer;
this.jmsSession = jmsSession;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,6 @@
import io.opentracing.Tracer;
import io.opentracing.contrib.jms.common.SpanJmsDecorator;
import io.opentracing.contrib.jms.common.TracingMessageUtils;
import io.opentracing.util.GlobalTracer;
import javax.jms.CompletionListener;
import javax.jms.Destination;
import javax.jms.JMSException;
Expand All @@ -33,13 +32,6 @@ public class TracingMessageProducer implements MessageProducer {
private final MessageProducer messageProducer;
private final Tracer tracer;

/**
* GlobalTracer is used to get tracer
*/
public TracingMessageProducer(MessageProducer messageProducer) {
this(messageProducer, GlobalTracer.get());
}

public TracingMessageProducer(MessageProducer messageProducer, Tracer tracer) {
this.messageProducer = messageProducer;
this.tracer = tracer;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,9 +16,11 @@
import static org.awaitility.Awaitility.await;
import static org.hamcrest.core.IsEqual.equalTo;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;

import io.opentracing.contrib.jms.common.SpanContextContainer;
import io.opentracing.contrib.jms.common.TracingMessageConsumer;
import io.opentracing.contrib.jms.common.TracingMessageListener;
import io.opentracing.contrib.jms.common.TracingMessageUtils;
Expand Down Expand Up @@ -126,6 +128,39 @@ public void sendAndReceive() throws Exception {
assertNull(mockTracer.activeSpan());
}

@Test
public void sendAndReceiveWithProxyMessage() throws Exception {
Queue queue = session.createQueue("TEST.FOO");

MessageProducer messageProducer = session.createProducer(queue);

// Instrument MessageProducer with TracingMessageProducer
TracingMessageProducer producer =
new TracingMessageProducer(messageProducer, mockTracer);

MessageConsumer messageConsumer = session.createConsumer(queue);

// Instrument MessageConsumer with TracingMessageConsumer
TracingMessageConsumer consumer = new TracingMessageConsumer(messageConsumer, mockTracer, true);

TextMessage message = session.createTextMessage("Hello world");

producer.send(message);

TextMessage received = (TextMessage) consumer.receive(5000);
assertEquals("Hello world", received.getText());

assertTrue(received instanceof SpanContextContainer);
SpanContextContainer spanContextContainer = (SpanContextContainer) received;
assertNotNull(spanContextContainer.getSpanContext());

List<MockSpan> mockSpans = mockTracer.finishedSpans();
assertEquals(2, mockSpans.size());

checkSpans(mockSpans);
assertNull(mockTracer.activeSpan());
}

@Test
public void sendAndReceiveJMSProducer() throws Exception {
Destination destination = session.createQueue("TEST.FOO");
Expand Down
6 changes: 4 additions & 2 deletions opentracing-jms-common/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,9 @@
the License.
-->
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>io.opentracing.contrib</groupId>
Expand All @@ -36,7 +38,7 @@

<dependency>
<groupId>io.opentracing</groupId>
<artifactId>opentracing-util</artifactId>
<artifactId>opentracing-api</artifactId>
</dependency>

<dependency>
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
/*
* Copyright 2017-2019 The OpenTracing Authors
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
* in compliance with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software distributed under the License
* is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
* or implied. See the License for the specific language governing permissions and limitations under
* the License.
*/
package io.opentracing.contrib.jms.common;

import io.opentracing.SpanContext;

public interface SpanContextContainer {
SpanContext getSpanContext();
}
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,11 @@
*/
package io.opentracing.contrib.jms.common;

import io.opentracing.SpanContext;
import io.opentracing.Tracer;
import io.opentracing.util.GlobalTracer;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageConsumer;
Expand All @@ -27,17 +30,17 @@ public class TracingMessageConsumer implements MessageConsumer {

private final MessageConsumer messageConsumer;
private final Tracer tracer;
private final boolean proxyMessage;

/**
* GlobalTracer is used to get tracer
*/
public TracingMessageConsumer(MessageConsumer messageConsumer) {
this(messageConsumer, GlobalTracer.get());
public TracingMessageConsumer(MessageConsumer messageConsumer, Tracer tracer) {
this(messageConsumer, tracer, false);
}

public TracingMessageConsumer(MessageConsumer messageConsumer, Tracer tracer) {
public TracingMessageConsumer(MessageConsumer messageConsumer, Tracer tracer,
boolean proxyMessage) {
this.messageConsumer = messageConsumer;
this.tracer = tracer;
this.proxyMessage = proxyMessage;
}

@Override
Expand All @@ -62,20 +65,29 @@ public void setMessageListener(MessageListener listener) throws JMSException {
@Override
public Message receive() throws JMSException {
Message message = messageConsumer.receive();
if (proxyMessage) {
return proxy(message, finishSpan(message));
}
finishSpan(message);
return message;
}

@Override
public Message receive(long timeout) throws JMSException {
Message message = messageConsumer.receive(timeout);
if (proxyMessage) {
return proxy(message, finishSpan(message));
}
finishSpan(message);
return message;
}

@Override
public Message receiveNoWait() throws JMSException {
Message message = messageConsumer.receiveNoWait();
if (proxyMessage) {
return proxy(message, finishSpan(message));
}
finishSpan(message);
return message;
}
Expand All @@ -85,7 +97,26 @@ public void close() throws JMSException {
messageConsumer.close();
}

private void finishSpan(Message message) {
TracingMessageUtils.buildAndFinishChildSpan(message, tracer);
private SpanContext finishSpan(Message message) {
return TracingMessageUtils.buildAndFinishChildSpan(message, tracer);
}

public Message proxy(final Message message, final SpanContext spanContext) {
final Class<?>[] interfaces = message.getClass().getInterfaces();
Class<?>[] allInterfaces = new Class<?>[interfaces.length + 1];
System.arraycopy(interfaces, 0, allInterfaces, 0, interfaces.length);
allInterfaces[interfaces.length] = SpanContextContainer.class;

return (Message) Proxy.newProxyInstance(message.getClass().getClassLoader(),
allInterfaces,
new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
if (method.getName().equals("getSpanContext")) {
return spanContext;
}
return method.invoke(message, args);
}
});
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,6 @@
import io.opentracing.Scope;
import io.opentracing.Span;
import io.opentracing.Tracer;
import io.opentracing.util.GlobalTracer;
import javax.jms.Message;
import javax.jms.MessageListener;

Expand All @@ -29,13 +28,6 @@ public class TracingMessageListener implements MessageListener {
private final MessageListener messageListener;
private final Tracer tracer;

/**
* GlobalTracer is used to get tracer
*/
public TracingMessageListener(MessageListener messageListener) {
this(messageListener, GlobalTracer.get());
}

public TracingMessageListener(MessageListener messageListener, Tracer tracer) {
this.messageListener = messageListener;
this.tracer = tracer;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,15 +34,12 @@ public class TracingMessageUtils {
*
* @param message JMS message
* @param tracer Tracer
* @return child span
* @return child span context
*/
public static Span buildAndFinishChildSpan(Message message, Tracer tracer) {

public static SpanContext buildAndFinishChildSpan(Message message, Tracer tracer) {
Span child = buildFollowingSpan(message, tracer);
if (child != null) {
child.finish();
}
return child;
child.finish();
return child.context();
}

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -73,9 +73,9 @@ public void extractContextFromProperties() {
public void buildAndFinishChildSpan() {
MockSpan span = mockTracer.buildSpan("test").start();
mockTracer.scopeManager().activate(span);
Span span2 = TracingMessageUtils
SpanContext childContext = TracingMessageUtils
.buildAndFinishChildSpan(new ActiveMQTextMessage(), mockTracer);
assertNotNull(span2);
assertNotNull(childContext);

assertNotNull(mockTracer.activeSpan());

Expand Down

0 comments on commit 18aa97c

Please sign in to comment.