@ -21,9 +21,7 @@ import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicReference ;
import java.util.concurrent.atomic.AtomicReference ;
import java.util.stream.Stream ;
import java.util.stream.Stream ;
import io.micrometer.jakarta9.instrument.jms.JmsProcessObservationContext ;
import io.micrometer.observation.Observation ;
import io.micrometer.observation.Observation ;
import io.micrometer.observation.ObservationHandler ;
import io.micrometer.observation.tck.TestObservationRegistry ;
import io.micrometer.observation.tck.TestObservationRegistry ;
import jakarta.jms.MessageListener ;
import jakarta.jms.MessageListener ;
import org.apache.activemq.artemis.jms.client.ActiveMQConnectionFactory ;
import org.apache.activemq.artemis.jms.client.ActiveMQConnectionFactory ;
@ -65,8 +63,6 @@ class MessageListenerContainerObservationTests {
@ParameterizedTest ( name = "[{index}] {0}" )
@ParameterizedTest ( name = "[{index}] {0}" )
@MethodSource ( "listenerContainers" )
@MethodSource ( "listenerContainers" )
void shouldRecordJmsProcessObservations ( AbstractMessageListenerContainer listenerContainer ) throws Exception {
void shouldRecordJmsProcessObservations ( AbstractMessageListenerContainer listenerContainer ) throws Exception {
JmsTemplate jmsTemplate = new JmsTemplate ( connectionFactory ) ;
jmsTemplate . convertAndSend ( "spring.test.observation" , "message content" ) ;
CountDownLatch latch = new CountDownLatch ( 1 ) ;
CountDownLatch latch = new CountDownLatch ( 1 ) ;
listenerContainer . setConnectionFactory ( connectionFactory ) ;
listenerContainer . setConnectionFactory ( connectionFactory ) ;
listenerContainer . setObservationRegistry ( registry ) ;
listenerContainer . setObservationRegistry ( registry ) ;
@ -74,6 +70,8 @@ class MessageListenerContainerObservationTests {
listenerContainer . setMessageListener ( ( MessageListener ) message - > latch . countDown ( ) ) ;
listenerContainer . setMessageListener ( ( MessageListener ) message - > latch . countDown ( ) ) ;
listenerContainer . afterPropertiesSet ( ) ;
listenerContainer . afterPropertiesSet ( ) ;
listenerContainer . start ( ) ;
listenerContainer . start ( ) ;
JmsTemplate jmsTemplate = new JmsTemplate ( connectionFactory ) ;
jmsTemplate . convertAndSend ( "spring.test.observation" , "message content" ) ;
latch . await ( 2 , TimeUnit . SECONDS ) ;
latch . await ( 2 , TimeUnit . SECONDS ) ;
assertThat ( registry ) . hasObservationWithNameEqualTo ( "jms.message.process" )
assertThat ( registry ) . hasObservationWithNameEqualTo ( "jms.message.process" )
. that ( )
. that ( )
@ -86,8 +84,6 @@ class MessageListenerContainerObservationTests {
@ParameterizedTest ( name = "[{index}] {0}" )
@ParameterizedTest ( name = "[{index}] {0}" )
@MethodSource ( "listenerContainers" )
@MethodSource ( "listenerContainers" )
void shouldHaveObservationScopeInErrorHandler ( AbstractMessageListenerContainer listenerContainer ) throws Exception {
void shouldHaveObservationScopeInErrorHandler ( AbstractMessageListenerContainer listenerContainer ) throws Exception {
JmsTemplate jmsTemplate = new JmsTemplate ( connectionFactory ) ;
jmsTemplate . convertAndSend ( "spring.test.observation" , "message content" ) ;
CountDownLatch latch = new CountDownLatch ( 1 ) ;
CountDownLatch latch = new CountDownLatch ( 1 ) ;
AtomicReference < Observation > observationInErrorHandler = new AtomicReference < > ( ) ;
AtomicReference < Observation > observationInErrorHandler = new AtomicReference < > ( ) ;
listenerContainer . setConnectionFactory ( connectionFactory ) ;
listenerContainer . setConnectionFactory ( connectionFactory ) ;
@ -102,64 +98,19 @@ class MessageListenerContainerObservationTests {
} ) ;
} ) ;
listenerContainer . afterPropertiesSet ( ) ;
listenerContainer . afterPropertiesSet ( ) ;
listenerContainer . start ( ) ;
listenerContainer . start ( ) ;
latch . await ( 2 , TimeUnit . SECONDS ) ;
Assertions . assertThat ( observationInErrorHandler . get ( ) ) . isNotNull ( ) ;
assertThat ( registry ) . hasObservationWithNameEqualTo ( "jms.message.process" )
. that ( )
. hasHighCardinalityKeyValue ( "messaging.destination.name" , "spring.test.observation" )
. hasLowCardinalityKeyValue ( "exception" , "none" ) ;
assertThat ( registry ) . hasNumberOfObservationsEqualTo ( 1 ) ;
listenerContainer . stop ( ) ;
listenerContainer . shutdown ( ) ;
}
@ParameterizedTest ( name = "[{index}] {0}" )
@MethodSource ( "listenerContainers" )
void shouldHaveObservationErrorWhenRethrown ( AbstractMessageListenerContainer listenerContainer ) throws Exception {
JmsTemplate jmsTemplate = new JmsTemplate ( connectionFactory ) ;
JmsTemplate jmsTemplate = new JmsTemplate ( connectionFactory ) ;
jmsTemplate . convertAndSend ( "spring.test.observation" , "message content" ) ;
jmsTemplate . convertAndSend ( "spring.test.observation" , "message content" ) ;
CountDownLatch latch = new CountDownLatch ( 1 ) ;
registry . observationConfig ( ) . observationHandler ( new ErrorHandlerObservationHandler ( latch ) ) ;
listenerContainer . setConnectionFactory ( connectionFactory ) ;
listenerContainer . setObservationRegistry ( registry ) ;
listenerContainer . setDestinationName ( "spring.test.observation" ) ;
listenerContainer . setMessageListener ( ( MessageListener ) message - > {
throw new IllegalStateException ( "error" ) ;
} ) ;
listenerContainer . setErrorHandler ( error - > {
throw new IllegalStateException ( "not handled" ) ;
} ) ;
listenerContainer . afterPropertiesSet ( ) ;
listenerContainer . start ( ) ;
latch . await ( 2 , TimeUnit . SECONDS ) ;
latch . await ( 2 , TimeUnit . SECONDS ) ;
Assertions . assertThat ( observationInErrorHandler . get ( ) ) . isNotNull ( ) ;
assertThat ( registry ) . hasObservationWithNameEqualTo ( "jms.message.process" )
assertThat ( registry ) . hasObservationWithNameEqualTo ( "jms.message.process" )
. that ( )
. that ( )
. hasHighCardinalityKeyValue ( "messaging.destination.name" , "spring.test.observation" )
. hasHighCardinalityKeyValue ( "messaging.destination.name" , "spring.test.observation" )
. hasLowCardinalityKeyValue ( "exception" , "IllegalStateException " ) ;
. hasLowCardinalityKeyValue ( "exception" , "none" ) ;
assertThat ( registry ) . hasNumberOfObservationsEqualTo ( 1 ) ;
assertThat ( registry ) . hasNumberOfObservationsEqualTo ( 1 ) ;
listenerContainer . stop ( ) ;
listenerContainer . stop ( ) ;
listenerContainer . shutdown ( ) ;
listenerContainer . shutdown ( ) ;
}
}
static class ErrorHandlerObservationHandler implements ObservationHandler < JmsProcessObservationContext > {
private final CountDownLatch latch ;
ErrorHandlerObservationHandler ( CountDownLatch latch ) {
this . latch = latch ;
}
@Override
public boolean supportsContext ( Observation . Context context ) {
return context instanceof JmsProcessObservationContext ;
}
@Override
public void onError ( JmsProcessObservationContext context ) {
this . latch . countDown ( ) ;
}
}
static Stream < Arguments > listenerContainers ( ) {
static Stream < Arguments > listenerContainers ( ) {
return Stream . of (
return Stream . of (
arguments ( named ( DefaultMessageListenerContainer . class . getSimpleName ( ) , new DefaultMessageListenerContainer ( ) ) ) ,
arguments ( named ( DefaultMessageListenerContainer . class . getSimpleName ( ) , new DefaultMessageListenerContainer ( ) ) ) ,