diff --git a/tracing/src/main/java/org/axonframework/extensions/tracing/TracingQueryGateway.java b/tracing/src/main/java/org/axonframework/extensions/tracing/TracingQueryGateway.java index 38f38f8..8b22da7 100644 --- a/tracing/src/main/java/org/axonframework/extensions/tracing/TracingQueryGateway.java +++ b/tracing/src/main/java/org/axonframework/extensions/tracing/TracingQueryGateway.java @@ -39,6 +39,7 @@ import java.util.stream.Stream; import static org.axonframework.common.BuilderUtils.assertNonNull; +import static org.axonframework.common.ObjectUtils.nullSafeTypeOf; import static org.axonframework.messaging.GenericMessage.asMessage; /** @@ -56,6 +57,21 @@ public class TracingQueryGateway implements QueryGateway { private final QueryGateway delegate; private final MessageTagBuilderService messageTagBuilderService; + /** + * Instantiate a {@link TracingQueryGateway} based on the fields contained in the {@link Builder}. + *

+ * Will assert that the {@link Tracer} and delegate {@link QueryGateway} are not {@code null}, and will throw an + * {@link AxonConfigurationException} if they are. + * + * @param builder the {@link Builder} used to instantiate a {@link TracingQueryGateway} instance + */ + protected TracingQueryGateway(Builder builder) { + builder.validate(); + this.tracer = builder.tracer; + this.delegate = builder.buildDelegateQueryGateway(); + this.messageTagBuilderService = builder.messageTagBuilderService; + } + /** * Instantiate a Builder to be able to create a {@link TracingQueryGateway}. *

@@ -72,26 +88,11 @@ public static Builder builder() { return new Builder(); } - /** - * Instantiate a {@link TracingQueryGateway} based on the fields contained in the {@link Builder}. - *

- * Will assert that the {@link Tracer} and delegate {@link QueryGateway} are not {@code null}, and will throw an - * {@link AxonConfigurationException} if they are. - * - * @param builder the {@link Builder} used to instantiate a {@link TracingQueryGateway} instance - */ - protected TracingQueryGateway(Builder builder) { - builder.validate(); - this.tracer = builder.tracer; - this.delegate = builder.buildDelegateQueryGateway(); - this.messageTagBuilderService = builder.messageTagBuilderService; - } - @Override public CompletableFuture query(String queryName, Q query, ResponseType responseType) { QueryMessage queryMessage = new GenericQueryMessage<>(asMessage(query), queryName, responseType); return getWithSpan( - "query_" + SpanUtils.messageName(query.getClass(), queryName), + "query_" + SpanUtils.messageName(nullSafeTypeOf(query), queryName), queryMessage, (childSpan) -> delegate.query(queryName, queryMessage, responseType) .whenComplete((r, e) -> { @@ -109,7 +110,7 @@ public Stream scatterGather(String queryName, TimeUnit timeUnit) { QueryMessage queryMessage = new GenericQueryMessage<>(asMessage(query), queryName, responseType); return getWithSpan( - "scatterGather_" + SpanUtils.messageName(query.getClass(), queryName), + "scatterGather_" + SpanUtils.messageName(nullSafeTypeOf(query), queryName), queryMessage, (childSpan) -> delegate.scatterGather(queryName, queryMessage, responseType, timeout, timeUnit) .onClose(() -> { @@ -129,7 +130,7 @@ public SubscriptionQueryResult subscriptionQuery(String queryNam asMessage(query), queryName, initialResponseType, updateResponseType ); return getWithSpan( - "subscriptionQuery_" + SpanUtils.messageName(query.getClass(), queryName), + "subscriptionQuery_" + SpanUtils.messageName(nullSafeTypeOf(query), queryName), queryMessage, (childSpan) -> { SubscriptionQueryResult subscriptionQueryResult = delegate.subscriptionQuery( diff --git a/tracing/src/test/java/org/axonframework/extensions/tracing/TracingQueryGatewayTest.java b/tracing/src/test/java/org/axonframework/extensions/tracing/TracingQueryGatewayTest.java index dbbbe40..76b6fb4 100644 --- a/tracing/src/test/java/org/axonframework/extensions/tracing/TracingQueryGatewayTest.java +++ b/tracing/src/test/java/org/axonframework/extensions/tracing/TracingQueryGatewayTest.java @@ -127,6 +127,14 @@ void testQuery_query() throws ExecutionException, InterruptedException { assertNull(scopeManager.activeSpan(), "There should be no activeSpan"); } + @Test + void testQuery_nullQuery() { + //noinspection unchecked + when(mockQueryBus.query(any(QueryMessage.class))) + .thenReturn(CompletableFuture.completedFuture(answer1)); + assertDoesNotThrow(() -> testSubject.query("query", null, String.class)); + } + @Test void testScatterGather() { //noinspection unchecked @@ -162,6 +170,15 @@ void testScatterGather() { assertNull(scopeManager.activeSpan(), "There should be no activeSpan"); } + @Test + void testScatterGather_nullQuery() { + assertDoesNotThrow(() -> testSubject.scatterGather("query", + null, + ResponseTypes.instanceOf(String.class), + 1L, + TimeUnit.MILLISECONDS)); + } + @Test void testSubscriptionQuery() { String initial = "initial"; @@ -237,6 +254,16 @@ void testSubscriptionQueryResults() { assertNull(scopeManager.activeSpan(), "There should be no activeSpan"); } + @Test + void testSubscriptionQuery_nullQuery() { + when(mockQueryBus.subscriptionQuery(any(), anyInt())) + .thenReturn(createSubscriptionQueryResult("initial", "update")); + assertDoesNotThrow(() -> testSubject.subscriptionQuery("query", + null, + instanceOf(String.class), + instanceOf(String.class))); + } + private SubscriptionQueryResult createSubscriptionQueryResult(I initial, U... updates) { return new DefaultSubscriptionQueryResult<>( Mono.just(GenericQueryResponseMessage.asResponseMessage(initial)),