diff --git a/spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/messaging/TraceFunctionAroundWrapper.java b/spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/messaging/TraceFunctionAroundWrapper.java index cdd9172a4..e6b41b317 100644 --- a/spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/messaging/TraceFunctionAroundWrapper.java +++ b/spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/messaging/TraceFunctionAroundWrapper.java @@ -96,6 +96,14 @@ public class TraceFunctionAroundWrapper extends FunctionAroundWrapper else if (targetFunction.isInputTypePublisher() || targetFunction.isOutputTypePublisher()) { return reactorStream((Publisher) message, targetFunction); } + else if (message != null && !(message instanceof Message)) { + if (log.isDebugEnabled()) { + String messageClass = message.getClass().getName(); + log.debug("We only support tracing for Message types. You need to wrap your function type [" + + messageClass + "] into [Message<" + messageClass + ">]"); + } + return targetFunction.apply(message); // no instrumentation + } return nonReactorStream((Message) message, targetFunction); } diff --git a/spring-cloud-sleuth-instrumentation/src/test/java/org/springframework/cloud/sleuth/instrument/messaging/TraceFunctionAroundWrapperTests.java b/spring-cloud-sleuth-instrumentation/src/test/java/org/springframework/cloud/sleuth/instrument/messaging/TraceFunctionAroundWrapperTests.java index 509dbf8fd..e8ba8bf0d 100644 --- a/spring-cloud-sleuth-instrumentation/src/test/java/org/springframework/cloud/sleuth/instrument/messaging/TraceFunctionAroundWrapperTests.java +++ b/spring-cloud-sleuth-instrumentation/src/test/java/org/springframework/cloud/sleuth/instrument/messaging/TraceFunctionAroundWrapperTests.java @@ -121,6 +121,19 @@ class TraceFunctionAroundWrapperTests { assertThatAllSpansAreStartedAndStopped(); } + @Test + void test_tracing_with_function_and_input_as_non_message() { + FunctionRegistration registration = new FunctionRegistration<>(new GreeterFunction(), + "greeter").type(FunctionType.of(GreeterFunction.class)); + catalog.register(registration); + FunctionInvocationWrapper function = catalog.lookup("greeter"); + + String result = (String) wrapper.apply("hello", function); + + assertThat(result).isEqualTo("HELLO"); + assertThat(tracer.spans).isEmpty(); + } + @Test void test_tracing_with_consumer() { GreeterConsumer consumer = new GreeterConsumer();