Skip to content

Commit b701b26

Browse files
committed
Merge branch '6.1.x'
2 parents dcabddd + 0bb309f commit b701b26

File tree

3 files changed

+44
-0
lines changed

3 files changed

+44
-0
lines changed

framework-docs/modules/ROOT/pages/integration/observability.adoc

+2
Original file line numberDiff line numberDiff line change
@@ -162,6 +162,8 @@ include-code::./JmsTemplatePublish[]
162162

163163
It uses the `io.micrometer.jakarta9.instrument.jms.DefaultJmsPublishObservationConvention` by default, backed by the `io.micrometer.jakarta9.instrument.jms.JmsPublishObservationContext`.
164164

165+
Similar observations are recorded with `@JmsListener` annotated methods when response messages are returned from the listener method.
166+
165167
[[observability.jms.process]]
166168
=== JMS message Processing instrumentation
167169

spring-jms/src/main/java/org/springframework/jms/listener/AbstractMessageListenerContainer.java

+12
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
package org.springframework.jms.listener;
1818

1919
import io.micrometer.jakarta9.instrument.jms.DefaultJmsProcessObservationConvention;
20+
import io.micrometer.jakarta9.instrument.jms.JmsInstrumentation;
2021
import io.micrometer.jakarta9.instrument.jms.JmsObservationDocumentation;
2122
import io.micrometer.jakarta9.instrument.jms.JmsProcessObservationContext;
2223
import io.micrometer.jakarta9.instrument.jms.JmsProcessObservationConvention;
@@ -772,6 +773,9 @@ protected void doInvokeListener(SessionAwareMessageListener listener, Session se
772773
Observation observation = createObservation(message);
773774
try {
774775
Session sessionToUse = session;
776+
if (micrometerJakartaPresent && this.observationRegistry != null) {
777+
sessionToUse = MicrometerInstrumentation.instrumentSession(sessionToUse, this.observationRegistry);
778+
}
775779
if (!isExposeListenerSession()) {
776780
// We need to expose a separate Session.
777781
conToClose = createConnection();
@@ -992,6 +996,14 @@ protected void invokeErrorHandler(Throwable ex) {
992996
private static class MessageRejectedWhileStoppingException extends RuntimeException {
993997
}
994998

999+
private abstract static class MicrometerInstrumentation {
1000+
1001+
static Session instrumentSession(Session session, ObservationRegistry registry) {
1002+
return JmsInstrumentation.instrumentSession(session, registry);
1003+
}
1004+
1005+
}
1006+
9951007
private abstract static class ObservationFactory {
9961008

9971009
private static final JmsProcessObservationConvention DEFAULT_CONVENTION = new DefaultJmsProcessObservationConvention();

spring-jms/src/test/java/org/springframework/jms/listener/MessageListenerContainerObservationTests.java

+30
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,12 @@
2323

2424
import io.micrometer.observation.Observation;
2525
import io.micrometer.observation.tck.TestObservationRegistry;
26+
import jakarta.jms.Message;
2627
import jakarta.jms.MessageListener;
28+
import jakarta.jms.TextMessage;
2729
import org.apache.activemq.artemis.jms.client.ActiveMQConnectionFactory;
2830
import org.apache.activemq.artemis.junit.EmbeddedActiveMQExtension;
31+
import org.assertj.core.api.Assertions;
2932
import org.junit.jupiter.api.AfterEach;
3033
import org.junit.jupiter.api.BeforeEach;
3134
import org.junit.jupiter.api.extension.RegisterExtension;
@@ -81,6 +84,33 @@ void shouldRecordJmsProcessObservations(AbstractMessageListenerContainer listene
8184
listenerContainer.shutdown();
8285
}
8386

87+
@ParameterizedTest(name = "[{index}] {0}")
88+
@MethodSource("listenerContainers")
89+
void shouldRecordJmsPublishObservations(AbstractMessageListenerContainer listenerContainer) throws Exception {
90+
CountDownLatch latch = new CountDownLatch(1);
91+
listenerContainer.setConnectionFactory(connectionFactory);
92+
listenerContainer.setObservationRegistry(registry);
93+
listenerContainer.setDestinationName("spring.test.observation");
94+
listenerContainer.setMessageListener((SessionAwareMessageListener) (message, session) -> {
95+
Message response = session.createTextMessage("test response");
96+
session.createProducer(message.getJMSReplyTo()).send(response);
97+
});
98+
listenerContainer.afterPropertiesSet();
99+
listenerContainer.start();
100+
JmsTemplate jmsTemplate = new JmsTemplate(connectionFactory);
101+
TextMessage response = (TextMessage) jmsTemplate.sendAndReceive("spring.test.observation",
102+
session -> session.createTextMessage("test request"));
103+
104+
// request received by listener and response received by template
105+
assertThat(registry).hasNumberOfObservationsWithNameEqualTo("jms.message.process", 2);
106+
// response sent to the template
107+
assertThat(registry).hasNumberOfObservationsWithNameEqualTo("jms.message.publish", 1);
108+
109+
Assertions.assertThat(response.getText()).isEqualTo("test response");
110+
listenerContainer.stop();
111+
listenerContainer.shutdown();
112+
}
113+
84114
@ParameterizedTest(name = "[{index}] {0}")
85115
@MethodSource("listenerContainers")
86116
void shouldHaveObservationScopeInErrorHandler(AbstractMessageListenerContainer listenerContainer) throws Exception {

0 commit comments

Comments
 (0)