Skip to content

Commit 2114b27

Browse files
committed
Change DataSource wrapping from BeanPostProcessor to explicit @primary bean registration
1 parent c36eedd commit 2114b27

File tree

3 files changed

+61
-81
lines changed

3 files changed

+61
-81
lines changed

instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/jdbc/DataSourcePostProcessor.java

Lines changed: 0 additions & 78 deletions
This file was deleted.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
/*
2+
* Copyright The OpenTelemetry Authors
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
package io.opentelemetry.instrumentation.spring.autoconfigure.internal.instrumentation.jdbc;
7+
8+
import io.opentelemetry.api.OpenTelemetry;
9+
import io.opentelemetry.instrumentation.jdbc.datasource.JdbcTelemetry;
10+
import io.opentelemetry.instrumentation.spring.autoconfigure.internal.properties.InstrumentationConfigUtil;
11+
import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties;
12+
import javax.sql.DataSource;
13+
14+
final class JdbcDataSourceWrapper {
15+
private JdbcDataSourceWrapper() {}
16+
17+
private static final Class<?> ROUTING_DATA_SOURCE_CLASS = getRoutingDataSourceClass();
18+
19+
private static Class<?> getRoutingDataSourceClass() {
20+
try {
21+
return Class.forName("org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource");
22+
} catch (ClassNotFoundException exception) {
23+
return null;
24+
}
25+
}
26+
27+
static boolean isRoutingDatasource(Object bean) {
28+
return ROUTING_DATA_SOURCE_CLASS != null && ROUTING_DATA_SOURCE_CLASS.isInstance(bean);
29+
}
30+
31+
static DataSource wrapIfNecessary(
32+
DataSource dataSource,
33+
OpenTelemetry openTelemetry,
34+
ConfigProperties configProperties) {
35+
if (!isRoutingDatasource(dataSource)) {
36+
return JdbcTelemetry.builder(openTelemetry)
37+
.setStatementSanitizationEnabled(
38+
InstrumentationConfigUtil.isStatementSanitizationEnabled(
39+
configProperties,
40+
"otel.instrumentation.jdbc.statement-sanitizer.enabled"))
41+
.setCaptureQueryParameters(
42+
configProperties.getBoolean(
43+
"otel.instrumentation.jdbc.experimental.capture-query-parameters", false))
44+
.setTransactionInstrumenterEnabled(
45+
configProperties.getBoolean(
46+
"otel.instrumentation.jdbc.experimental.transaction.enabled", false))
47+
.build()
48+
.wrap(dataSource);
49+
}
50+
return dataSource;
51+
}
52+
}

instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/jdbc/JdbcInstrumentationAutoConfiguration.java

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,13 @@
1010
import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties;
1111
import javax.sql.DataSource;
1212
import org.springframework.beans.factory.ObjectProvider;
13+
import org.springframework.beans.factory.annotation.Qualifier;
1314
import org.springframework.boot.autoconfigure.AutoConfiguration;
1415
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
1516
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
1617
import org.springframework.context.annotation.Bean;
1718
import org.springframework.context.annotation.Configuration;
19+
import org.springframework.context.annotation.Primary;
1820

1921
/**
2022
* This class is internal and is hence not for public use. Its APIs are unstable and can change at
@@ -30,10 +32,14 @@ public class JdbcInstrumentationAutoConfiguration {
3032
public JdbcInstrumentationAutoConfiguration() {}
3133

3234
@Bean
33-
// static to avoid "is not eligible for getting processed by all BeanPostProcessors" warning
34-
static DataSourcePostProcessor dataSourcePostProcessor(
35+
@Primary
36+
public DataSource otelDataSource(
37+
@Qualifier("dataSource") DataSource originalDataSource,
3538
ObjectProvider<OpenTelemetry> openTelemetryProvider,
3639
ObjectProvider<ConfigProperties> configPropertiesProvider) {
37-
return new DataSourcePostProcessor(openTelemetryProvider, configPropertiesProvider);
40+
return JdbcDataSourceWrapper.wrapIfNecessary(
41+
originalDataSource,
42+
openTelemetryProvider.getObject(),
43+
configPropertiesProvider.getObject());
3844
}
3945
}

0 commit comments

Comments
 (0)