diff --git a/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/jdbc/DataSourcePostProcessor.java b/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/jdbc/DataSourcePostProcessor.java index 875bfa3509b7..f29513d01bc5 100644 --- a/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/jdbc/DataSourcePostProcessor.java +++ b/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/jdbc/DataSourcePostProcessor.java @@ -18,6 +18,8 @@ final class DataSourcePostProcessor implements BeanPostProcessor, Ordered { + private static final Class ROUTING_DATA_SOURCE_CLASS = getRoutingDataSourceClass(); + private final ObjectProvider openTelemetryProvider; private final ObjectProvider configPropertiesProvider; @@ -28,11 +30,25 @@ final class DataSourcePostProcessor implements BeanPostProcessor, Ordered { this.configPropertiesProvider = configPropertiesProvider; } + private static Class getRoutingDataSourceClass() { + try { + return Class.forName("org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource"); + } catch (ClassNotFoundException exception) { + return null; + } + } + + private static boolean isRoutingDatasource(Object bean) { + return ROUTING_DATA_SOURCE_CLASS != null && ROUTING_DATA_SOURCE_CLASS.isInstance(bean); + } + @CanIgnoreReturnValue @Override public Object postProcessAfterInitialization(Object bean, String beanName) { // Exclude scoped proxy beans to avoid double wrapping - if (bean instanceof DataSource && !ScopedProxyUtils.isScopedTarget(beanName)) { + if (bean instanceof DataSource + && !isRoutingDatasource(bean) + && !ScopedProxyUtils.isScopedTarget(beanName)) { DataSource dataSource = (DataSource) bean; return JdbcTelemetry.builder(openTelemetryProvider.getObject()) .setStatementSanitizationEnabled(