Skip to content

Commit 7562bba

Browse files
committed
fix: Use AOP proxy for DataSource telemetry to preserve bean type
1 parent 8604da3 commit 7562bba

File tree

1 file changed

+29
-16
lines changed
  • instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/jdbc

1 file changed

+29
-16
lines changed

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

Lines changed: 29 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,10 @@
1111
import io.opentelemetry.instrumentation.spring.autoconfigure.internal.properties.InstrumentationConfigUtil;
1212
import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties;
1313
import javax.sql.DataSource;
14+
import org.aopalliance.intercept.MethodInterceptor;
15+
import org.springframework.aop.framework.ProxyFactory;
1416
import org.springframework.aop.scope.ScopedProxyUtils;
17+
import org.springframework.aop.support.AopUtils;
1518
import org.springframework.beans.factory.ObjectProvider;
1619
import org.springframework.beans.factory.config.BeanPostProcessor;
1720
import org.springframework.core.Ordered;
@@ -50,22 +53,32 @@ public Object postProcessAfterInitialization(Object bean, String beanName) {
5053
&& !isRoutingDatasource(bean)
5154
&& !ScopedProxyUtils.isScopedTarget(beanName)) {
5255
DataSource dataSource = (DataSource) bean;
53-
return JdbcTelemetry.builder(openTelemetryProvider.getObject())
54-
.setStatementSanitizationEnabled(
55-
InstrumentationConfigUtil.isStatementSanitizationEnabled(
56-
configPropertiesProvider.getObject(),
57-
"otel.instrumentation.jdbc.statement-sanitizer.enabled"))
58-
.setCaptureQueryParameters(
59-
configPropertiesProvider
60-
.getObject()
61-
.getBoolean(
62-
"otel.instrumentation.jdbc.experimental.capture-query-parameters", false))
63-
.setTransactionInstrumenterEnabled(
64-
configPropertiesProvider
65-
.getObject()
66-
.getBoolean("otel.instrumentation.jdbc.experimental.transaction.enabled", false))
67-
.build()
68-
.wrap(dataSource);
56+
DataSource wrapped =
57+
JdbcTelemetry.builder(openTelemetryProvider.getObject())
58+
.setStatementSanitizationEnabled(
59+
InstrumentationConfigUtil.isStatementSanitizationEnabled(
60+
configPropertiesProvider.getObject(),
61+
"otel.instrumentation.jdbc.statement-sanitizer.enabled"))
62+
.setCaptureQueryParameters(
63+
configPropertiesProvider
64+
.getObject()
65+
.getBoolean(
66+
"otel.instrumentation.jdbc.experimental.capture-query-parameters", false))
67+
.setTransactionInstrumenterEnabled(
68+
configPropertiesProvider
69+
.getObject()
70+
.getBoolean(
71+
"otel.instrumentation.jdbc.experimental.transaction.enabled", false))
72+
.build()
73+
.wrap(dataSource);
74+
ProxyFactory proxyFactory = new ProxyFactory(new Class<?>[] {DataSource.class});
75+
proxyFactory.setTarget(bean);
76+
proxyFactory.addAdvice(
77+
(MethodInterceptor)
78+
invocation ->
79+
AopUtils.invokeJoinpointUsingReflection(
80+
wrapped, invocation.getMethod(), invocation.getArguments()));
81+
return proxyFactory.getProxy();
6982
}
7083
return bean;
7184
}

0 commit comments

Comments
 (0)