Skip to content

Commit a9a97c0

Browse files
authored
Add automatic JDBC instrumentation to the OTel Spring starter (#11258)
1 parent 7aca36f commit a9a97c0

File tree

12 files changed

+618
-76
lines changed

12 files changed

+618
-76
lines changed

instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/OpenTelemetryAutoConfiguration.java

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@
2222
import java.util.List;
2323
import java.util.Optional;
2424
import java.util.stream.Collectors;
25-
import org.springframework.beans.factory.ObjectProvider;
2625
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
2726
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
2827
import org.springframework.boot.context.properties.ConfigurationPropertiesBinding;
@@ -86,8 +85,7 @@ public OpenTelemetry openTelemetry(
8685
OtlpExporterProperties otlpExporterProperties,
8786
OtelResourceProperties resourceProperties,
8887
PropagationProperties propagationProperties,
89-
OpenTelemetrySdkComponentLoader componentLoader,
90-
ObjectProvider<OpenTelemetryInjector> openTelemetryConsumerProvider) {
88+
OpenTelemetrySdkComponentLoader componentLoader) {
9189

9290
OpenTelemetry openTelemetry =
9391
AutoConfigureUtil.setComponentLoader(
@@ -104,8 +102,6 @@ public OpenTelemetry openTelemetry(
104102
.build()
105103
.getOpenTelemetrySdk();
106104

107-
openTelemetryConsumerProvider.forEach(consumer -> consumer.accept(openTelemetry));
108-
109105
return openTelemetry;
110106
}
111107
}

instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/OpenTelemetryInjector.java

Lines changed: 0 additions & 12 deletions
This file was deleted.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
/*
2+
* Copyright The OpenTelemetry Authors
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
package io.opentelemetry.instrumentation.spring.autoconfigure.instrumentation.jdbc;
7+
8+
import com.google.errorprone.annotations.CanIgnoreReturnValue;
9+
import io.opentelemetry.api.OpenTelemetry;
10+
import io.opentelemetry.instrumentation.jdbc.datasource.JdbcTelemetry;
11+
import javax.sql.DataSource;
12+
import org.springframework.aop.scope.ScopedProxyUtils;
13+
import org.springframework.beans.factory.ObjectProvider;
14+
import org.springframework.beans.factory.config.BeanPostProcessor;
15+
import org.springframework.core.Ordered;
16+
17+
final class DataSourcePostProcessor implements BeanPostProcessor, Ordered {
18+
19+
private final ObjectProvider<OpenTelemetry> openTelemetryProvider;
20+
21+
DataSourcePostProcessor(ObjectProvider<OpenTelemetry> openTelemetryProvider) {
22+
this.openTelemetryProvider = openTelemetryProvider;
23+
}
24+
25+
@CanIgnoreReturnValue
26+
@Override
27+
public Object postProcessAfterInitialization(Object bean, String beanName) {
28+
// Exclude scoped proxy beans to avoid double wrapping
29+
if (bean instanceof DataSource && !ScopedProxyUtils.isScopedTarget(beanName)) {
30+
DataSource dataSource = (DataSource) bean;
31+
return JdbcTelemetry.create(openTelemetryProvider.getObject()).wrap(dataSource);
32+
}
33+
return bean;
34+
}
35+
36+
// To be one of the first bean post-processors to be executed
37+
@Override
38+
public int getOrder() {
39+
return Ordered.LOWEST_PRECEDENCE - 20;
40+
}
41+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
/*
2+
* Copyright The OpenTelemetry Authors
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
package io.opentelemetry.instrumentation.spring.autoconfigure.instrumentation.jdbc;
7+
8+
import io.opentelemetry.api.OpenTelemetry;
9+
import io.opentelemetry.instrumentation.spring.autoconfigure.internal.SdkEnabled;
10+
import javax.sql.DataSource;
11+
import org.springframework.beans.factory.ObjectProvider;
12+
import org.springframework.boot.autoconfigure.AutoConfiguration;
13+
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
14+
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
15+
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
16+
import org.springframework.context.annotation.Bean;
17+
import org.springframework.context.annotation.Conditional;
18+
import org.springframework.context.annotation.Configuration;
19+
20+
@ConditionalOnProperty(name = "otel.instrumentation.jdbc.enabled", matchIfMissing = true)
21+
@AutoConfiguration(after = DataSourceAutoConfiguration.class)
22+
@ConditionalOnBean({DataSource.class})
23+
@Conditional(SdkEnabled.class)
24+
@Configuration(proxyBeanMethods = false)
25+
public class JdbcInstrumentationAutoconfiguration {
26+
27+
// For error prone
28+
public JdbcInstrumentationAutoconfiguration() {}
29+
30+
@Bean
31+
// static to avoid "is not eligible for getting processed by all BeanPostProcessors" warning
32+
static DataSourcePostProcessor dataSourcePostProcessor(
33+
ObjectProvider<OpenTelemetry> openTelemetryProvider) {
34+
return new DataSourcePostProcessor(openTelemetryProvider);
35+
}
36+
}

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

Lines changed: 0 additions & 47 deletions
This file was deleted.

instrumentation/spring/spring-boot-autoconfigure/src/main/resources/META-INF/spring.factories

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ io.opentelemetry.instrumentation.spring.autoconfigure.OpenTelemetryAutoConfigura
33
io.opentelemetry.instrumentation.spring.autoconfigure.instrumentation.annotations.InstrumentationAnnotationsAutoConfiguration,\
44
io.opentelemetry.instrumentation.spring.autoconfigure.instrumentation.kafka.KafkaInstrumentationAutoConfiguration,\
55
io.opentelemetry.instrumentation.spring.autoconfigure.instrumentation.logging.OpenTelemetryAppenderAutoConfiguration,\
6-
io.opentelemetry.instrumentation.spring.autoconfigure.instrumentation.jdbc.OpenTelemetryJdbcDriverAutoConfiguration,\
6+
io.opentelemetry.instrumentation.spring.autoconfigure.instrumentation.jdbc.JdbcInstrumentationAutoconfiguration,\
77
io.opentelemetry.instrumentation.spring.autoconfigure.instrumentation.micrometer.MicrometerBridgeAutoConfiguration,\
88
io.opentelemetry.instrumentation.spring.autoconfigure.instrumentation.web.SpringWebInstrumentationAutoConfiguration,\
99
io.opentelemetry.instrumentation.spring.autoconfigure.instrumentation.webflux.SpringWebfluxInstrumentationAutoConfiguration,\

instrumentation/spring/spring-boot-autoconfigure/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ io.opentelemetry.instrumentation.spring.autoconfigure.OpenTelemetryAutoConfigura
22
io.opentelemetry.instrumentation.spring.autoconfigure.instrumentation.annotations.InstrumentationAnnotationsAutoConfiguration
33
io.opentelemetry.instrumentation.spring.autoconfigure.instrumentation.kafka.KafkaInstrumentationAutoConfiguration
44
io.opentelemetry.instrumentation.spring.autoconfigure.instrumentation.logging.OpenTelemetryAppenderAutoConfiguration
5-
io.opentelemetry.instrumentation.spring.autoconfigure.instrumentation.jdbc.OpenTelemetryJdbcDriverAutoConfiguration
5+
io.opentelemetry.instrumentation.spring.autoconfigure.instrumentation.jdbc.JdbcInstrumentationAutoconfiguration
66
io.opentelemetry.instrumentation.spring.autoconfigure.instrumentation.micrometer.MicrometerBridgeAutoConfiguration
77
io.opentelemetry.instrumentation.spring.autoconfigure.instrumentation.web.SpringWebInstrumentationAutoConfiguration
88
io.opentelemetry.instrumentation.spring.autoconfigure.instrumentation.webflux.SpringWebfluxInstrumentationAutoConfiguration

smoke-tests-otel-starter/spring-boot-3/build.gradle.kts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@ dependencies {
1515
implementation("org.springframework.boot:spring-boot-starter-data-jdbc")
1616
runtimeOnly("com.h2database:h2")
1717
implementation("org.apache.commons:commons-dbcp2")
18-
implementation(project(":instrumentation:jdbc:library"))
1918
implementation("org.springframework.kafka:spring-kafka") // not tested here, just make sure there are no warnings when it's included
2019
implementation("io.opentelemetry:opentelemetry-extension-trace-propagators")
2120
implementation(project(":instrumentation:spring:starters:spring-boot-starter"))

smoke-tests-otel-starter/spring-boot-3/src/main/java/io/opentelemetry/spring/smoketest/DatasourceConfig.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,15 +6,14 @@
66
package io.opentelemetry.spring.smoketest;
77

88
import io.opentelemetry.api.OpenTelemetry;
9-
import io.opentelemetry.instrumentation.jdbc.datasource.JdbcTelemetry;
109
import javax.sql.DataSource;
1110
import org.apache.commons.dbcp2.BasicDataSource;
1211
import org.springframework.context.annotation.Bean;
1312
import org.springframework.context.annotation.Configuration;
1413
import org.springframework.context.annotation.Profile;
1514

1615
@Configuration
17-
@Profile("!jdbc-driver-config")
16+
@Profile("user-has-defined-datasource-bean")
1817
public class DatasourceConfig {
1918

2019
@Bean
@@ -24,6 +23,6 @@ public DataSource dataSource(OpenTelemetry openTelemetry) {
2423
dataSource.setUrl("jdbc:h2:mem:db");
2524
dataSource.setUsername("username");
2625
dataSource.setPassword("pwd");
27-
return JdbcTelemetry.create(openTelemetry).wrap(dataSource);
26+
return dataSource;
2827
}
2928
}

0 commit comments

Comments
 (0)