Skip to content

Commit ba32a8d

Browse files
committed
kafka
1 parent 38d6dc4 commit ba32a8d

File tree

10 files changed

+158
-61
lines changed

10 files changed

+158
-61
lines changed

instrumentation/spring/spring-boot-autoconfigure/build.gradle.kts

Lines changed: 9 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -120,27 +120,18 @@ dependencies {
120120

121121
// Spring Boot 4
122122
add("javaSpring4CompileOnly", files(sourceSets.main.get().output.classesDirs))
123-
add("javaSpring4CompileOnly", "org.springframework.boot:spring-boot-starter-web:4.0.0")
124-
add("javaSpring4CompileOnly", "org.springframework.boot:spring-boot-starter-data-jdbc:4.0.0")
123+
// add("javaSpring4CompileOnly", "org.springframework.boot:spring-boot-starter-web:4.0.0")
125124
add("javaSpring4CompileOnly", "org.springframework.boot:spring-boot-starter-kafka:4.0.0")
126-
add("javaSpring4CompileOnly", "org.springframework.boot:spring-boot-starter-micrometer:4.0.0")
127-
add("javaSpring4CompileOnly", "io.opentelemetry:opentelemetry-sdk-extension-autoconfigure")
128-
add("javaSpring4CompileOnly", "jakarta.servlet:jakarta.servlet-api:6.1.0")
129-
add("javaSpring4CompileOnly", project(":instrumentation:spring:spring-web:spring-web-3.1:library"))
130-
add("javaSpring4CompileOnly", project(":instrumentation:spring:spring-webmvc:spring-webmvc-6.0:library"))
125+
// add("javaSpring4CompileOnly", "org.springframework.boot:spring-boot-autoconfigure:4.0.0")
126+
// add("javaSpring4CompileOnly", "org.springframework.boot:spring-boot-jdbc:4.0.0")
127+
add("javaSpring4CompileOnly", "org.springframework.boot:spring-boot-starter-jdbc:4.0.0")
128+
add("javaSpring4CompileOnly", "org.springframework.boot:spring-boot-restclient:4.0.0")
129+
// add("javaSpring4CompileOnly", "io.opentelemetry:opentelemetry-sdk-extension-autoconfigure")
130+
// add("javaSpring4CompileOnly", project(":instrumentation:spring:spring-web:spring-web-3.1:library"))
131+
// add("javaSpring4CompileOnly", project(":instrumentation:spring:spring-webmvc:spring-webmvc-6.0:library"))
131132
add("javaSpring4CompileOnly", project(":instrumentation:kafka:kafka-clients:kafka-clients-2.6:library"))
132-
add("javaSpring4CompileOnly", project(":instrumentation:micrometer:micrometer-1.5:library"))
133133
add("javaSpring4CompileOnly", project(":instrumentation:spring:spring-kafka-2.7:library"))
134-
135-
// tests don't work with spring boot 4 yet
136-
latestDepTestLibrary("org.springframework.boot:spring-boot-starter-test:3.+") // documented limitation
137-
latestDepTestLibrary("org.springframework.boot:spring-boot-starter-actuator:3.+") // documented limitation
138-
latestDepTestLibrary("org.springframework.boot:spring-boot-starter-aop:3.+") // documented limitation
139-
latestDepTestLibrary("org.springframework.boot:spring-boot-starter-web:3.+") // documented limitation
140-
latestDepTestLibrary("org.springframework.boot:spring-boot-starter-webflux:3.+") // documented limitation
141-
latestDepTestLibrary("org.springframework.boot:spring-boot-starter-data-mongodb:3.+") // documented limitation
142-
latestDepTestLibrary("org.springframework.boot:spring-boot-starter-data-r2dbc:3.+") // documented limitation
143-
latestDepTestLibrary("org.springframework.boot:spring-boot-starter-data-jdbc:3.+") // documented limitation
134+
// add("javaSpring4CompileOnly", project(":instrumentation:micrometer:micrometer-1.5:library"))
144135
}
145136

146137
val latestDepTest = findProperty("testLatestDeps") as Boolean

instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/web/SpringWebInstrumentationAutoConfiguration.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
import io.opentelemetry.instrumentation.spring.autoconfigure.internal.ConditionalOnEnabledInstrumentation;
1111
import org.springframework.beans.factory.ObjectProvider;
1212
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
13+
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingClass;
1314
import org.springframework.boot.web.client.RestTemplateCustomizer;
1415
import org.springframework.context.annotation.Bean;
1516
import org.springframework.context.annotation.Configuration;
@@ -25,6 +26,7 @@
2526
*/
2627
@ConditionalOnEnabledInstrumentation(module = "spring-web")
2728
@ConditionalOnClass({RestTemplate.class, RestTemplateCustomizer.class})
29+
@ConditionalOnMissingClass("org.springframework.boot.restclient.RestTemplateCustomizer")
2830
@Configuration
2931
public class SpringWebInstrumentationAutoConfiguration {
3032

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

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@
1212
import org.springframework.beans.factory.ObjectProvider;
1313
import org.springframework.boot.autoconfigure.AutoConfiguration;
1414
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
15-
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingClass;
1615
import org.springframework.boot.jdbc.autoconfigure.DataSourceAutoConfiguration;
1716
import org.springframework.context.annotation.Bean;
1817
import org.springframework.context.annotation.Configuration;
@@ -24,8 +23,6 @@
2423
@ConditionalOnEnabledInstrumentation(module = "jdbc")
2524
@AutoConfiguration(after = DataSourceAutoConfiguration.class)
2625
@ConditionalOnBean({DataSource.class})
27-
@ConditionalOnMissingClass(
28-
"org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration")
2926
@Configuration(proxyBeanMethods = false)
3027
public class JdbcInstrumentationSpringBoot4AutoConfiguration {
3128

instrumentation/spring/spring-boot-autoconfigure/src/main/javaSpring4/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/micrometer/MicrometerBridgeAutoConfiguration.java

Lines changed: 0 additions & 39 deletions
This file was deleted.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
/*
2+
* Copyright The OpenTelemetry Authors
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
package io.opentelemetry.instrumentation.spring.autoconfigure.internal.instrumentation.web;
7+
8+
import io.opentelemetry.api.OpenTelemetry;
9+
import io.opentelemetry.instrumentation.api.incubator.config.internal.InstrumentationConfig;
10+
import io.opentelemetry.instrumentation.spring.autoconfigure.internal.ConditionalOnEnabledInstrumentation;
11+
import org.springframework.beans.factory.ObjectProvider;
12+
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
13+
import org.springframework.boot.restclient.RestTemplateCustomizer;
14+
import org.springframework.context.annotation.Bean;
15+
import org.springframework.context.annotation.Configuration;
16+
import org.springframework.web.client.RestTemplate;
17+
18+
/**
19+
* Configures {@link RestTemplate} for tracing.
20+
*
21+
* <p>Adds OpenTelemetry instrumentation to RestTemplate beans after initialization.
22+
*
23+
* <p>This class is internal and is hence not for public use. Its APIs are unstable and can change
24+
* at any time.
25+
*/
26+
@ConditionalOnEnabledInstrumentation(module = "spring-web")
27+
@ConditionalOnClass({RestTemplate.class, RestTemplateCustomizer.class})
28+
@Configuration
29+
public class SpringWebInstrumentationSpringBoot4AutoConfiguration {
30+
31+
public SpringWebInstrumentationSpringBoot4AutoConfiguration() {}
32+
33+
// static to avoid "is not eligible for getting processed by all BeanPostProcessors" warning
34+
@Bean
35+
static RestTemplateBeanPostProcessor otelRestTemplateBeanPostProcessor(
36+
ObjectProvider<OpenTelemetry> openTelemetryProvider,
37+
ObjectProvider<InstrumentationConfig> configProvider) {
38+
return new RestTemplateBeanPostProcessor(openTelemetryProvider, configProvider);
39+
}
40+
41+
@Bean
42+
RestTemplateCustomizer otelRestTemplateCustomizer(
43+
ObjectProvider<OpenTelemetry> openTelemetryProvider,
44+
ObjectProvider<InstrumentationConfig> configProvider) {
45+
return restTemplate ->
46+
RestTemplateInstrumentation.addIfNotPresent(
47+
restTemplate, openTelemetryProvider.getObject(), configProvider.getObject());
48+
}
49+
}

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ io.opentelemetry.instrumentation.spring.autoconfigure.internal.instrumentation.j
99
io.opentelemetry.instrumentation.spring.autoconfigure.internal.instrumentation.micrometer.MicrometerBridgeAutoConfiguration
1010
io.opentelemetry.instrumentation.spring.autoconfigure.internal.instrumentation.r2dbc.R2dbcInstrumentationAutoConfiguration
1111
io.opentelemetry.instrumentation.spring.autoconfigure.internal.instrumentation.web.SpringWebInstrumentationAutoConfiguration
12+
io.opentelemetry.instrumentation.spring.autoconfigure.internal.instrumentation.web.SpringWebInstrumentationSpringBoot4AutoConfiguration
1213
io.opentelemetry.instrumentation.spring.autoconfigure.internal.instrumentation.webflux.SpringWebfluxInstrumentationAutoConfiguration
1314
io.opentelemetry.instrumentation.spring.autoconfigure.internal.instrumentation.web.RestClientInstrumentationAutoConfiguration
1415
io.opentelemetry.instrumentation.spring.autoconfigure.internal.instrumentation.webmvc.SpringWebMvc6InstrumentationAutoConfiguration

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

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,14 +15,19 @@ dependencies {
1515
implementation("org.springframework.boot:spring-boot-starter-web")
1616
implementation("org.springframework.boot:spring-boot-starter-data-jdbc")
1717
implementation("org.springframework.boot:spring-boot-starter-kafka")
18+
testImplementation("org.springframework:spring-aop")
19+
testImplementation("org.aspectj:aspectjweaver")
1820
runtimeOnly("com.h2database:h2")
1921

2022
implementation(project(":smoke-tests-otel-starter:spring-boot-common"))
23+
2124
testImplementation("org.springframework.boot:spring-boot-starter-test")
2225
testImplementation("org.springframework.boot:spring-boot-resttestclient")
23-
testImplementation("org.awaitility:awaitility")
2426
testImplementation(project(":instrumentation:spring:starters:spring-boot-starter"))
2527
testImplementation(project(":smoke-tests-otel-starter:spring-smoke-testing"))
28+
testImplementation("org.springframework.boot:spring-boot-starter-kafka")
29+
testImplementation("org.testcontainers:testcontainers-junit-jupiter")
30+
testImplementation("org.testcontainers:testcontainers-kafka")
2631
}
2732

2833
springBoot {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
/*
2+
* Copyright The OpenTelemetry Authors
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
package io.opentelemetry.spring.smoketest;
7+
8+
import io.opentelemetry.api.OpenTelemetry;
9+
import io.opentelemetry.instrumentation.spring.autoconfigure.OpenTelemetryAutoConfiguration;
10+
import io.opentelemetry.instrumentation.spring.autoconfigure.internal.instrumentation.kafka.KafkaInstrumentationAutoConfiguration;
11+
import io.opentelemetry.instrumentation.spring.autoconfigure.internal.instrumentation.thread.ThreadDetailsAutoConfiguration;
12+
import java.time.Duration;
13+
import org.junit.jupiter.api.AfterAll;
14+
import org.junit.jupiter.api.BeforeAll;
15+
import org.junit.jupiter.api.BeforeEach;
16+
import org.junit.jupiter.api.Test;
17+
import org.springframework.boot.autoconfigure.AutoConfigurations;
18+
import org.springframework.boot.kafka.autoconfigure.KafkaAutoConfiguration;
19+
import org.springframework.boot.test.context.runner.ApplicationContextRunner;
20+
import org.springframework.kafka.core.KafkaTemplate;
21+
import org.testcontainers.containers.wait.strategy.Wait;
22+
import org.testcontainers.kafka.KafkaContainer;
23+
import org.testcontainers.utility.DockerImageName;
24+
25+
/** Spring has a test container integration, but that doesn't work for Spring Boot 2 */
26+
public class AbstractJvmKafkaSpringStarterSmokeTest extends AbstractKafkaSpringStarterSmokeTest {
27+
static KafkaContainer kafka;
28+
29+
private ApplicationContextRunner contextRunner;
30+
31+
@BeforeAll
32+
static void setUpKafka() {
33+
kafka =
34+
new KafkaContainer(DockerImageName.parse("apache/kafka:3.8.0"))
35+
.withEnv("KAFKA_HEAP_OPTS", "-Xmx256m")
36+
.waitingFor(Wait.forLogMessage(".*started \\(kafka.server.Kafka.*Server\\).*", 1))
37+
.withStartupTimeout(Duration.ofMinutes(1));
38+
kafka.start();
39+
}
40+
41+
@AfterAll
42+
static void tearDownKafka() {
43+
kafka.stop();
44+
}
45+
46+
@BeforeEach
47+
void setUpContext() {
48+
contextRunner =
49+
new ApplicationContextRunner()
50+
.withAllowBeanDefinitionOverriding(true)
51+
.withConfiguration(
52+
AutoConfigurations.of(
53+
OpenTelemetryAutoConfiguration.class,
54+
ThreadDetailsAutoConfiguration.class,
55+
SpringSmokeOtelConfiguration.class,
56+
KafkaAutoConfiguration.class,
57+
KafkaInstrumentationAutoConfiguration.class,
58+
KafkaConfig.class))
59+
.withPropertyValues(
60+
"otel.instrumentation.kafka.experimental-span-attributes=true",
61+
"spring.kafka.bootstrap-servers=" + kafka.getBootstrapServers(),
62+
"spring.kafka.consumer.auto-offset-reset=earliest",
63+
"spring.kafka.consumer.linger-ms=10",
64+
"spring.kafka.listener.idle-between-polls=1000",
65+
"spring.kafka.producer.transaction-id-prefix=test-");
66+
}
67+
68+
@SuppressWarnings("unchecked") // we lose parameter types for the KafkaTemplate
69+
@Override
70+
@Test
71+
void shouldInstrumentProducerAndConsumer() {
72+
contextRunner.run(
73+
applicationContext -> {
74+
testing = new SpringSmokeTestRunner(applicationContext.getBean(OpenTelemetry.class));
75+
kafkaTemplate = applicationContext.getBean(KafkaTemplate.class);
76+
super.shouldInstrumentProducerAndConsumer();
77+
});
78+
}
79+
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
/*
2+
* Copyright The OpenTelemetry Authors
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
package io.opentelemetry.spring.smoketest;
7+
8+
import org.junit.jupiter.api.condition.DisabledInNativeImage;
9+
10+
@DisabledInNativeImage // See GraalVmNativeKafkaSpringStarterSmokeTest for the GraalVM native test
11+
class KafkaSpringStarterSmokeTest extends AbstractJvmKafkaSpringStarterSmokeTest {}

smoke-tests-otel-starter/spring-boot-4/src/test/java/io/opentelemetry/spring/smoketest/OtelSpringStarterSmokeTest.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
"otel.instrumentation.runtime-telemetry.emit-experimental-telemetry=true",
2424
"otel.instrumentation.runtime-telemetry-java17.enable-all=true",
2525
"otel.instrumentation.common.thread_details.enabled=true",
26+
"logging.level.org.springframework.boot.autoconfigure=DEBUG",
2627
})
2728
@AutoConfigureTestRestTemplate
2829
class OtelSpringStarterSmokeTest extends AbstractOtelSpringStarterSmokeTest {

0 commit comments

Comments
 (0)