Guard for Micrometer Core usage in JMS instrumentation

This commit ensures that the Observability instrumentation for
`@JmsListener` does not assume that micrometer-core is on the classpath
and guards against direct usage.

Closes gh-30335
This commit is contained in:
Brian Clozel
2023-08-14 16:27:45 +02:00
parent 20d27e4fb6
commit 94fe1f4c63

View File

@@ -37,6 +37,7 @@ import org.springframework.jms.support.JmsUtils;
import org.springframework.jms.support.QosSettings;
import org.springframework.jms.support.converter.MessageConverter;
import org.springframework.lang.Nullable;
import org.springframework.util.ClassUtils;
import org.springframework.util.ErrorHandler;
/**
@@ -149,7 +150,8 @@ import org.springframework.util.ErrorHandler;
public abstract class AbstractMessageListenerContainer extends AbstractJmsListeningContainer
implements MessageListenerContainer {
private static final JmsProcessObservationConvention DEFAULT_CONVENTION = new DefaultJmsProcessObservationConvention();
private static final boolean micrometerCorePresent = ClassUtils.isPresent(
"io.micrometer.core.instrument.binder.jms.JmsInstrumentation", AbstractMessageListenerContainer.class.getClassLoader());
@Nullable
private volatile Object destination;
@@ -703,8 +705,7 @@ public abstract class AbstractMessageListenerContainer extends AbstractJmsListen
}
try {
Observation observation = JmsObservationDocumentation.JMS_MESSAGE_PROCESS
.observation(null, DEFAULT_CONVENTION, () -> new JmsProcessObservationContext(message), this.observationRegistry);
Observation observation = createObservation(message);
observation.observeChecked(() -> invokeListener(session, message));
}
catch (JMSException | RuntimeException | Error ex) {
@@ -714,6 +715,15 @@ public abstract class AbstractMessageListenerContainer extends AbstractJmsListen
commitIfNecessary(session, message);
}
private Observation createObservation(Message message) {
if (micrometerCorePresent) {
return ObservationFactory.create(this.observationRegistry, message);
}
else {
return Observation.NOOP;
}
}
/**
* Invoke the specified listener: either as standard JMS MessageListener
* or (preferably) as Spring SessionAwareMessageListener.
@@ -758,8 +768,7 @@ public abstract class AbstractMessageListenerContainer extends AbstractJmsListen
Connection conToClose = null;
Session sessionToClose = null;
Observation observation = JmsObservationDocumentation.JMS_MESSAGE_PROCESS
.observation(null, DEFAULT_CONVENTION, () -> new JmsProcessObservationContext(message), this.observationRegistry);
Observation observation = createObservation(message);
try {
Session sessionToUse = session;
if (!isExposeListenerSession()) {
@@ -982,4 +991,14 @@ public abstract class AbstractMessageListenerContainer extends AbstractJmsListen
private static class MessageRejectedWhileStoppingException extends RuntimeException {
}
private static abstract class ObservationFactory {
private static final JmsProcessObservationConvention DEFAULT_CONVENTION = new DefaultJmsProcessObservationConvention();
static Observation create(@Nullable ObservationRegistry registry, Message message) {
return JmsObservationDocumentation.JMS_MESSAGE_PROCESS
.observation(null, DEFAULT_CONVENTION, () -> new JmsProcessObservationContext(message), registry);
}
}
}