2222import com .rabbitmq .client .observation .micrometer .MicrometerObservationCollectorBuilder ;
2323import com .rabbitmq .client .test .BrokerTestCase ;
2424import com .rabbitmq .client .test .TestUtils ;
25+ import io .micrometer .observation .Observation ;
2526import io .micrometer .observation .ObservationRegistry ;
27+ import io .micrometer .tracing .Tracer ;
28+ import io .micrometer .tracing .exporter .FinishedSpan ;
2629import io .micrometer .tracing .test .SampleTestRunner ;
2730import io .micrometer .tracing .test .simple .SpanAssert ;
2831import io .micrometer .tracing .test .simple .SpansAssert ;
2932import java .io .IOException ;
3033import java .nio .charset .StandardCharsets ;
34+ import java .util .Collection ;
35+ import java .util .Comparator ;
36+ import java .util .List ;
37+ import java .util .Map ;
3138import java .util .Objects ;
3239import java .util .concurrent .CountDownLatch ;
3340import java .util .concurrent .TimeUnit ;
3441import java .util .stream .Collectors ;
42+
43+ import org .assertj .core .api .BDDAssertions ;
3544import org .junit .jupiter .api .Nested ;
3645
3746public class MicrometerObservationCollectorMetrics extends BrokerTestCase {
@@ -111,6 +120,17 @@ private abstract static class IntegrationTest extends SampleTestRunner {
111120 public TracingSetup [] getTracingSetup () {
112121 return new TracingSetup [] {TracingSetup .IN_MEMORY_BRAVE , TracingSetup .ZIPKIN_BRAVE };
113122 }
123+
124+ void runWithNullingObservation (ObservationRegistry registry , Tracer tracer , Observation .CheckedRunnable <?> runnable ) {
125+ Observation noParentObservation = Observation .createNotStarted ("null_observation" , registry );
126+ noParentObservation .parentObservation (null );
127+ try (Tracer .SpanInScope ws = tracer .withSpan (null )) {
128+ noParentObservation .observeChecked (runnable );
129+ }
130+ catch (Throwable e ) {
131+ throw new RuntimeException (e );
132+ }
133+ }
114134 }
115135
116136 @ Nested
@@ -186,7 +206,7 @@ public SampleTestRunnerConsumer yourCode() {
186206 publishConnection = connectionFactory .newConnection ();
187207 Channel channel = publishConnection .createChannel ();
188208
189- sendMessage (channel );
209+ runWithNullingObservation ( getObservationRegistry (), buildingBlocks . getTracer (), () -> sendMessage (channel ) );
190210
191211 consumeConnection = connectionFactory .newConnection ();
192212 Channel basicGetChannel = consumeConnection .createChannel ();
@@ -196,8 +216,14 @@ public SampleTestRunnerConsumer yourCode() {
196216 buildingBlocks .getFinishedSpans ().stream ()
197217 .map (Objects ::toString )
198218 .collect (Collectors .joining ("\n " )));
199- SpansAssert .assertThat (buildingBlocks .getFinishedSpans ()).haveSameTraceId ();
200- SpanAssert .assertThat (buildingBlocks .getFinishedSpans ().get (0 ))
219+ Map <String , List <FinishedSpan >> finishedSpans = buildingBlocks .getFinishedSpans ().stream ()
220+ .collect (Collectors .groupingBy (FinishedSpan ::getTraceId ));
221+ BDDAssertions .then (finishedSpans ).as ("One trace id for sending, one for polling" ).hasSize (2 );
222+ Collection <List <FinishedSpan >> spans = finishedSpans .values ();
223+ List <FinishedSpan > sendAndReceiveSpans = spans .stream ().filter (f -> f .size () == 3 ).findFirst ().orElseThrow (() -> new AssertionError ("null_observation (fake nulling observation) -> produce -> consume" ));
224+ sendAndReceiveSpans .sort (Comparator .comparing (FinishedSpan ::getStartTimestamp ));
225+ SpanAssert .assertThat (sendAndReceiveSpans .get (0 )).hasNameEqualTo ("null_observation" );
226+ SpanAssert .assertThat (sendAndReceiveSpans .get (1 ))
201227 .hasNameEqualTo ("metrics.queue publish" )
202228 .hasTag ("messaging.rabbitmq.destination.routing_key" , "metrics.queue" )
203229 .hasTag ("messaging.destination.name" , "amq.default" )
@@ -206,12 +232,15 @@ public SampleTestRunnerConsumer yourCode() {
206232 .hasTag ("net.sock.peer.port" , "5672" )
207233 .hasTag ("net.protocol.name" , "amqp" )
208234 .hasTag ("net.protocol.version" , "0.9.1" );
209- SpanAssert .assertThat (buildingBlocks . getFinishedSpans (). get (1 ))
235+ SpanAssert .assertThat (sendAndReceiveSpans . get (2 ))
210236 .hasNameEqualTo ("metrics.queue receive" )
211237 .hasTag ("messaging.rabbitmq.destination.routing_key" , "metrics.queue" )
212238 .hasTag ("messaging.destination.name" , "amq.default" )
213239 .hasTag ("messaging.source.name" , "metrics.queue" )
214240 .hasTag ("messaging.message.payload_size_bytes" , String .valueOf (PAYLOAD .length ));
241+ List <FinishedSpan > pollingSpans = spans .stream ().filter (f -> f .size () == 1 ).findFirst ().orElseThrow (() -> new AssertionError ("rabbitmq.receive (child of test span)" ));
242+ SpanAssert .assertThat (pollingSpans .get (0 ))
243+ .hasNameEqualTo ("rabbitmq.receive" );
215244 waitAtMost (
216245 () ->
217246 getMeterRegistry ().find ("rabbitmq.publish" ).timer () != null
0 commit comments