Skip to content

Commit ec0223d

Browse files
authored
Fix instrumentation for the latest version of ucp (#12052)
1 parent b450b16 commit ec0223d

File tree

5 files changed

+69
-18
lines changed

5 files changed

+69
-18
lines changed

instrumentation/oracle-ucp-11.2/javaagent/build.gradle.kts

+6-1
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,15 @@ muzzle {
1313

1414
dependencies {
1515
library("com.oracle.database.jdbc:ucp:11.2.0.4")
16+
library("com.oracle.database.jdbc:ojdbc8:12.2.0.1")
1617

1718
implementation(project(":instrumentation:oracle-ucp-11.2:library"))
1819

1920
testImplementation(project(":instrumentation:oracle-ucp-11.2:testing"))
21+
}
2022

21-
latestDepTestLibrary("com.oracle.database.jdbc:ucp:21.9.0.0")
23+
tasks {
24+
test {
25+
usesService(gradle.sharedServices.registrations["testcontainersBuildService"].service)
26+
}
2227
}

instrumentation/oracle-ucp-11.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/oracleucp/v11_2/UniversalConnectionPoolInstrumentation.java

+16-5
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,11 @@
88
import static io.opentelemetry.javaagent.extension.matcher.AgentElementMatchers.hasClassesNamed;
99
import static io.opentelemetry.javaagent.extension.matcher.AgentElementMatchers.implementsInterface;
1010
import static io.opentelemetry.javaagent.instrumentation.oracleucp.v11_2.OracleUcpSingletons.telemetry;
11+
import static net.bytebuddy.matcher.ElementMatchers.isPublic;
1112
import static net.bytebuddy.matcher.ElementMatchers.named;
12-
import static net.bytebuddy.matcher.ElementMatchers.takesArgument;
1313
import static net.bytebuddy.matcher.ElementMatchers.takesArguments;
1414

15+
import io.opentelemetry.javaagent.bootstrap.CallDepth;
1516
import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation;
1617
import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer;
1718
import net.bytebuddy.asm.Advice;
@@ -34,9 +35,7 @@ public ElementMatcher<TypeDescription> typeMatcher() {
3435
@Override
3536
public void transform(TypeTransformer transformer) {
3637
transformer.applyAdviceToMethod(
37-
named("start")
38-
.and(takesArguments(0).or(takesArguments(1).and(takesArgument(0, boolean.class)))),
39-
this.getClass().getName() + "$StartAdvice");
38+
named("start").and(isPublic()), this.getClass().getName() + "$StartAdvice");
4039
transformer.applyAdviceToMethod(
4140
named("stop").and(takesArguments(0)), this.getClass().getName() + "$StopAdvice");
4241
}
@@ -53,8 +52,20 @@ public static void onExit(@Advice.This UniversalConnectionPool connectionPool) {
5352
@SuppressWarnings("unused")
5453
public static class StopAdvice {
5554

55+
@Advice.OnMethodEnter(suppress = Throwable.class)
56+
public static void onEnter(@Advice.Local("otelCallDepth") CallDepth callDepth) {
57+
callDepth = CallDepth.forClass(UniversalConnectionPool.class);
58+
callDepth.getAndIncrement();
59+
}
60+
5661
@Advice.OnMethodExit(suppress = Throwable.class, onThrowable = Throwable.class)
57-
public static void onExit(@Advice.This UniversalConnectionPool connectionPool) {
62+
public static void onExit(
63+
@Advice.This UniversalConnectionPool connectionPool,
64+
@Advice.Local("otelCallDepth") CallDepth callDepth) {
65+
if (callDepth == null || callDepth.decrementAndGet() > 0) {
66+
return;
67+
}
68+
5869
telemetry().unregisterMetrics(connectionPool);
5970
}
6071
}

instrumentation/oracle-ucp-11.2/library/build.gradle.kts

+6-1
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,13 @@ plugins {
55

66
dependencies {
77
library("com.oracle.database.jdbc:ucp:11.2.0.4")
8+
library("com.oracle.database.jdbc:ojdbc8:12.2.0.1")
89

910
testImplementation(project(":instrumentation:oracle-ucp-11.2:testing"))
11+
}
1012

11-
latestDepTestLibrary("com.oracle.database.jdbc:ucp:21.9.0.0")
13+
tasks {
14+
test {
15+
usesService(gradle.sharedServices.registrations["testcontainersBuildService"].service)
16+
}
1217
}

instrumentation/oracle-ucp-11.2/testing/build.gradle.kts

+1-2
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,7 @@ plugins {
44

55
dependencies {
66
api(project(":testing-common"))
7-
api("org.mockito:mockito-core")
8-
api("org.mockito:mockito-junit-jupiter")
7+
implementation("org.testcontainers:oracle-free")
98

109
compileOnly("com.oracle.database.jdbc:ucp:11.2.0.4")
1110
}

instrumentation/oracle-ucp-11.2/testing/src/main/java/io/opentelemetry/instrumentation/oracleucp/AbstractOracleUcpInstrumentationTest.java

+40-9
Original file line numberDiff line numberDiff line change
@@ -9,25 +9,31 @@
99

1010
import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension;
1111
import io.opentelemetry.instrumentation.testing.junit.db.DbConnectionPoolMetricsAssertions;
12-
import io.opentelemetry.instrumentation.testing.junit.db.MockDriver;
1312
import java.sql.Connection;
14-
import java.sql.SQLException;
13+
import java.time.Duration;
1514
import java.util.Arrays;
1615
import java.util.HashSet;
1716
import java.util.Set;
1817
import java.util.concurrent.TimeUnit;
1918
import oracle.ucp.admin.UniversalConnectionPoolManagerImpl;
2019
import oracle.ucp.jdbc.PoolDataSource;
2120
import oracle.ucp.jdbc.PoolDataSourceFactory;
21+
import org.junit.jupiter.api.AfterAll;
22+
import org.junit.jupiter.api.Assumptions;
2223
import org.junit.jupiter.api.BeforeAll;
23-
import org.junit.jupiter.api.extension.ExtendWith;
2424
import org.junit.jupiter.params.ParameterizedTest;
2525
import org.junit.jupiter.params.provider.ValueSource;
26-
import org.mockito.junit.jupiter.MockitoExtension;
26+
import org.slf4j.Logger;
27+
import org.slf4j.LoggerFactory;
28+
import org.testcontainers.containers.output.Slf4jLogConsumer;
29+
import org.testcontainers.oracle.OracleContainer;
2730

28-
@ExtendWith(MockitoExtension.class)
2931
public abstract class AbstractOracleUcpInstrumentationTest {
32+
private static final Logger logger =
33+
LoggerFactory.getLogger(AbstractOracleUcpInstrumentationTest.class);
34+
3035
private static final String INSTRUMENTATION_NAME = "io.opentelemetry.orcale-ucp-11.2";
36+
private static OracleContainer oracle;
3137

3238
protected abstract InstrumentationExtension testing();
3339

@@ -36,17 +42,42 @@ public abstract class AbstractOracleUcpInstrumentationTest {
3642
protected abstract void shutdown(PoolDataSource connectionPool) throws Exception;
3743

3844
@BeforeAll
39-
static void setUpMocks() throws SQLException {
40-
MockDriver.register();
45+
static void setUp() {
46+
// This docker image does not work on arm mac. To run this test on arm mac read
47+
// https://blog.jdriven.com/2022/07/running-oracle-xe-with-testcontainers-on-apple-silicon/
48+
// install colima with brew install colima
49+
// colima start --arch x86_64 --memory 4
50+
// export TESTCONTAINERS_DOCKER_SOCKET_OVERRIDE=/var/run/docker.sock
51+
// export DOCKER_HOST="unix://${HOME}/.colima/docker.sock"
52+
String dockerHost = System.getenv("DOCKER_HOST");
53+
if (!"aarch64".equals(System.getProperty("os.arch"))
54+
|| (dockerHost != null && dockerHost.contains("colima"))) {
55+
oracle =
56+
new OracleContainer("gvenzl/oracle-free:23.4-slim-faststart")
57+
.withLogConsumer(new Slf4jLogConsumer(logger))
58+
.withStartupTimeout(Duration.ofMinutes(2));
59+
oracle.start();
60+
}
61+
}
62+
63+
@AfterAll
64+
static void cleanUp() {
65+
if (oracle != null) {
66+
oracle.stop();
67+
}
4168
}
4269

4370
@ParameterizedTest
4471
@ValueSource(booleans = {true, false})
4572
void shouldReportMetrics(boolean setExplicitPoolName) throws Exception {
73+
Assumptions.assumeTrue(oracle != null);
74+
4675
// given
4776
PoolDataSource connectionPool = PoolDataSourceFactory.getPoolDataSource();
48-
connectionPool.setConnectionFactoryClassName(MockDriver.class.getName());
49-
connectionPool.setURL("jdbc:mock:testDatabase");
77+
connectionPool.setConnectionFactoryClassName("oracle.jdbc.pool.OracleDataSource");
78+
connectionPool.setURL(oracle.getJdbcUrl());
79+
connectionPool.setUser(oracle.getUsername());
80+
connectionPool.setPassword(oracle.getPassword());
5081
if (setExplicitPoolName) {
5182
connectionPool.setConnectionPoolName("testPool");
5283
}

0 commit comments

Comments
 (0)