-
Notifications
You must be signed in to change notification settings - Fork 827
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Add automatic MongoDB instrumentation to the OTel starter (#11211)
Co-authored-by: Jean Bisutti <jean.bisutti@gmail.com>
- Loading branch information
1 parent
39c373e
commit 6b66434
Showing
19 changed files
with
270 additions
and
29 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
40 changes: 40 additions & 0 deletions
40
...ring/autoconfigure/instrumentation/mongo/MongoClientInstrumentationAutoConfiguration.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,40 @@ | ||
/* | ||
* Copyright The OpenTelemetry Authors | ||
* SPDX-License-Identifier: Apache-2.0 | ||
*/ | ||
|
||
package io.opentelemetry.instrumentation.spring.autoconfigure.instrumentation.mongo; | ||
|
||
import com.mongodb.MongoClientSettings; | ||
import io.opentelemetry.api.OpenTelemetry; | ||
import io.opentelemetry.instrumentation.mongo.v3_1.MongoTelemetry; | ||
import io.opentelemetry.instrumentation.spring.autoconfigure.internal.SdkEnabled; | ||
import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties; | ||
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; | ||
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; | ||
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; | ||
import org.springframework.boot.autoconfigure.mongo.MongoClientSettingsBuilderCustomizer; | ||
import org.springframework.context.annotation.Bean; | ||
import org.springframework.context.annotation.Conditional; | ||
import org.springframework.context.annotation.Configuration; | ||
|
||
@ConditionalOnBean(OpenTelemetry.class) | ||
@ConditionalOnClass(MongoClientSettings.class) | ||
@ConditionalOnProperty(name = "otel.instrumentation.mongo.enabled", matchIfMissing = true) | ||
@Conditional(SdkEnabled.class) | ||
@Configuration | ||
public class MongoClientInstrumentationAutoConfiguration { | ||
|
||
@Bean | ||
public MongoClientSettingsBuilderCustomizer customizer( | ||
OpenTelemetry openTelemetry, ConfigProperties config) { | ||
return builder -> | ||
builder.addCommandListener( | ||
MongoTelemetry.builder(openTelemetry) | ||
.setStatementSanitizationEnabled( | ||
config.getBoolean( | ||
"otel.instrumentation.mongo.statement-sanitizer.enabled", true)) | ||
.build() | ||
.newCommandListener()); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
1 change: 1 addition & 0 deletions
1
...esources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
11 changes: 11 additions & 0 deletions
11
...g-boot-2/src/test/java/io/opentelemetry/spring/smoketest/MongoSpringStarterSmokeTest.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,11 @@ | ||
/* | ||
* Copyright The OpenTelemetry Authors | ||
* SPDX-License-Identifier: Apache-2.0 | ||
*/ | ||
|
||
package io.opentelemetry.spring.smoketest; | ||
|
||
import org.junit.jupiter.api.condition.DisabledInNativeImage; | ||
|
||
@DisabledInNativeImage // See GraalVmNativeMongodbSpringStarterSmokeTest for the GraalVM native test | ||
public class MongoSpringStarterSmokeTest extends AbstractJvmMongodbSpringStarterSmokeTest {} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
29 changes: 29 additions & 0 deletions
29
...st/java/io/opentelemetry/spring/smoketest/GraalVmNativeMongodbSpringStarterSmokeTest.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,29 @@ | ||
/* | ||
* Copyright The OpenTelemetry Authors | ||
* SPDX-License-Identifier: Apache-2.0 | ||
*/ | ||
|
||
package io.opentelemetry.spring.smoketest; | ||
|
||
import org.junit.jupiter.api.condition.EnabledInNativeImage; | ||
import org.springframework.boot.test.context.SpringBootTest; | ||
|
||
/** | ||
* GraalVM native image doesn't support Testcontainers in our case, so the docker container is | ||
* started manually before running the tests. | ||
* | ||
* <p>In other cases, it does work, e.g. <a | ||
* href="https://info.michael-simons.eu/2023/10/25/run-your-integration-tests-against-testcontainers-with-graalvm-native-image/">here</a>, | ||
* it's not yet clear why it doesn't work in our case. | ||
* | ||
* <p>In CI, this is done in reusable-native-tests.yml. If you want to run the tests locally, you | ||
* need to start the container manually: see .github/workflows/reusable-native-tests.yml for the | ||
* command. | ||
*/ | ||
@SpringBootTest( | ||
classes = {OtelSpringStarterSmokeTestApplication.class, SpringSmokeOtelConfiguration.class}, | ||
webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) | ||
@EnabledInNativeImage // see JvmMongodbSpringStarterSmokeTest for the JVM test | ||
@EnabledInGithubActions | ||
public class GraalVmNativeMongodbSpringStarterSmokeTest | ||
extends AbstractMongodbSpringStarterSmokeTest {} |
11 changes: 11 additions & 0 deletions
11
...g-boot-3/src/test/java/io/opentelemetry/spring/smoketest/MongoSpringStarterSmokeTest.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,11 @@ | ||
/* | ||
* Copyright The OpenTelemetry Authors | ||
* SPDX-License-Identifier: Apache-2.0 | ||
*/ | ||
|
||
package io.opentelemetry.spring.smoketest; | ||
|
||
import org.junit.jupiter.api.condition.DisabledInNativeImage; | ||
|
||
@DisabledInNativeImage // See GraalVmNativeMongodbSpringStarterSmokeTest for the GraalVM native test | ||
public class MongoSpringStarterSmokeTest extends AbstractJvmMongodbSpringStarterSmokeTest {} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
65 changes: 65 additions & 0 deletions
65
...main/java/io/opentelemetry/spring/smoketest/AbstractJvmMongodbSpringStarterSmokeTest.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,65 @@ | ||
/* | ||
* Copyright The OpenTelemetry Authors | ||
* SPDX-License-Identifier: Apache-2.0 | ||
*/ | ||
|
||
package io.opentelemetry.spring.smoketest; | ||
|
||
import com.mongodb.client.MongoClient; | ||
import io.opentelemetry.api.OpenTelemetry; | ||
import io.opentelemetry.instrumentation.spring.autoconfigure.OpenTelemetryAutoConfiguration; | ||
import io.opentelemetry.instrumentation.spring.autoconfigure.instrumentation.mongo.MongoClientInstrumentationAutoConfiguration; | ||
import org.junit.jupiter.api.AfterAll; | ||
import org.junit.jupiter.api.BeforeAll; | ||
import org.junit.jupiter.api.BeforeEach; | ||
import org.junit.jupiter.api.Test; | ||
import org.springframework.boot.autoconfigure.AutoConfigurations; | ||
import org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration; | ||
import org.springframework.boot.test.context.runner.ApplicationContextRunner; | ||
import org.testcontainers.containers.MongoDBContainer; | ||
import org.testcontainers.junit.jupiter.Container; | ||
|
||
/** Spring has a test container integration, but that doesn't work for Spring Boot 2 */ | ||
public class AbstractJvmMongodbSpringStarterSmokeTest | ||
extends AbstractMongodbSpringStarterSmokeTest { | ||
|
||
@Container static MongoDBContainer container; | ||
|
||
private ApplicationContextRunner contextRunner; | ||
|
||
@BeforeAll | ||
static void setUpContainer() { | ||
container = new MongoDBContainer("mongo:4.0"); | ||
container.start(); | ||
} | ||
|
||
@AfterAll | ||
static void tearDownContainer() { | ||
container.stop(); | ||
} | ||
|
||
@BeforeEach | ||
void setUpContext() { | ||
contextRunner = | ||
new ApplicationContextRunner() | ||
.withAllowBeanDefinitionOverriding(true) | ||
.withConfiguration( | ||
AutoConfigurations.of( | ||
OpenTelemetryAutoConfiguration.class, | ||
SpringSmokeOtelConfiguration.class, | ||
MongoAutoConfiguration.class, | ||
MongoClientInstrumentationAutoConfiguration.class)) | ||
.withPropertyValues("spring.data.mongodb.uri=" + container.getReplicaSetUrl()); | ||
} | ||
|
||
@Override | ||
@Test | ||
void mongodb() { | ||
contextRunner.run( | ||
applicationContext -> { | ||
testing = new SpringSmokeTestRunner(applicationContext.getBean(OpenTelemetry.class)); | ||
mongoClient = applicationContext.getBean(MongoClient.class); | ||
super.mongodb(); | ||
}); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
38 changes: 38 additions & 0 deletions
38
...rc/main/java/io/opentelemetry/spring/smoketest/AbstractMongodbSpringStarterSmokeTest.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,38 @@ | ||
/* | ||
* Copyright The OpenTelemetry Authors | ||
* SPDX-License-Identifier: Apache-2.0 | ||
*/ | ||
|
||
package io.opentelemetry.spring.smoketest; | ||
|
||
import com.mongodb.client.MongoClient; | ||
import io.opentelemetry.api.trace.SpanKind; | ||
import io.opentelemetry.semconv.incubating.DbIncubatingAttributes; | ||
import java.util.ArrayList; | ||
import org.junit.jupiter.api.Test; | ||
import org.springframework.beans.factory.annotation.Autowired; | ||
|
||
abstract class AbstractMongodbSpringStarterSmokeTest extends AbstractSpringStarterSmokeTest { | ||
|
||
@Autowired protected MongoClient mongoClient; | ||
|
||
@Test | ||
void mongodb() { | ||
testing.runWithSpan( | ||
"server", | ||
() -> { | ||
mongoClient.listDatabaseNames().into(new ArrayList<>()); | ||
}); | ||
|
||
testing.waitAndAssertTraces( | ||
trace -> | ||
trace.hasSpansSatisfyingExactly( | ||
span -> span.hasName("server"), | ||
span -> | ||
span.hasKind(SpanKind.CLIENT) | ||
.hasName("listDatabases admin") | ||
.hasAttribute( | ||
DbIncubatingAttributes.DB_SYSTEM, | ||
DbIncubatingAttributes.DbSystemValues.MONGODB))); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
26 changes: 0 additions & 26 deletions
26
...arter/spring-boot-common/src/main/java/io/opentelemetry/spring/smoketest/SqlExecutor.java
This file was deleted.
Oops, something went wrong.
Oops, something went wrong.