Skip to content

Commit 9dc30d8

Browse files
committed
chore: check compatibility between reactor-core and lettuce
Change-Id: Id24535b21c004991b9bd6eec3c3f167903bc6ab0
1 parent 647c64e commit 9dc30d8

File tree

4 files changed

+138
-1
lines changed

4 files changed

+138
-1
lines changed

instrumentation/lettuce/lettuce-5.1/javaagent/build.gradle.kts

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,3 +41,16 @@ tasks {
4141
dependsOn(testStableSemconv)
4242
}
4343
}
44+
45+
testing {
46+
suites {
47+
val test_compatibility by registering(JvmTestSuite::class) {
48+
dependencies {
49+
implementation("io.lettuce:lettuce-core:5.2.0.RELEASE")
50+
implementation("io.projectreactor:reactor-core:3.5.3")
51+
implementation("org.testcontainers:testcontainers")
52+
implementation(project(":instrumentation:lettuce:lettuce-5.1:testing"))
53+
}
54+
}
55+
}
56+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
/*
2+
* Copyright The OpenTelemetry Authors
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
package io.opentelemetry.javaagent.instrumentation.lettuce.v5_1;
7+
8+
import io.lettuce.core.tracing.TraceContext;
9+
import io.lettuce.core.tracing.TraceContextProvider;
10+
import io.lettuce.core.tracing.Tracing;
11+
import java.util.concurrent.locks.Lock;
12+
import java.util.concurrent.locks.ReentrantLock;
13+
import reactor.core.publisher.Mono;
14+
15+
public class CompatibilityChecker {
16+
private static Boolean isCompatible;
17+
private static final Lock lock = new ReentrantLock();
18+
19+
// related to https://github.com/open-telemetry/opentelemetry-java-instrumentation/issues/10997
20+
// if users are using incompatible versions of reactor-core and lettuce
21+
// then just disable the instrumentation
22+
public static boolean checkCompatible() {
23+
try {
24+
lock.lock();
25+
if (isCompatible != null) {
26+
return isCompatible;
27+
}
28+
Tracing.withTraceContextProvider(
29+
new TraceContextProvider() {
30+
@Override
31+
public TraceContext getTraceContext() {
32+
return null;
33+
}
34+
35+
@Override
36+
public Mono<TraceContext> getTraceContextLater() {
37+
return TraceContextProvider.super.getTraceContextLater();
38+
}
39+
});
40+
Tracing.getContext();
41+
Tracing.clearContext();
42+
Tracing.disabled();
43+
isCompatible = true;
44+
} catch (Throwable t) {
45+
isCompatible = false;
46+
} finally {
47+
lock.unlock();
48+
}
49+
return isCompatible;
50+
}
51+
}

instrumentation/lettuce/lettuce-5.1/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/lettuce/v5_1/DefaultClientResourcesInstrumentation.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,9 @@ public static class BuilderAdvice {
3535

3636
@Advice.OnMethodExit(suppress = Throwable.class)
3737
public static void methodEnter(@Advice.Return DefaultClientResources.Builder builder) {
38-
builder.tracing(TracingHolder.TRACING);
38+
if (CompatibilityChecker.checkCompatible()) {
39+
builder.tracing(TracingHolder.TRACING);
40+
}
3941
}
4042
}
4143
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
/*
2+
* Copyright The OpenTelemetry Authors
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
package io.opentelemetry.javaagent.instrumentation.lettuce.v5_1;
7+
8+
import static org.assertj.core.api.Assertions.assertThat;
9+
10+
import io.lettuce.core.RedisClient;
11+
import io.lettuce.core.api.sync.RedisCommands;
12+
import io.opentelemetry.instrumentation.lettuce.v5_1.AbstractLettuceClientTest;
13+
import io.opentelemetry.instrumentation.testing.junit.AgentInstrumentationExtension;
14+
import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension;
15+
import java.net.InetAddress;
16+
import java.net.UnknownHostException;
17+
import org.junit.jupiter.api.AfterAll;
18+
import org.junit.jupiter.api.BeforeAll;
19+
import org.junit.jupiter.api.Test;
20+
import org.junit.jupiter.api.extension.RegisterExtension;
21+
22+
public class DisableNoEntranceSpanAndMetricsTest extends AbstractLettuceClientTest {
23+
@RegisterExtension
24+
static final InstrumentationExtension testing = AgentInstrumentationExtension.create();
25+
26+
@Override
27+
public InstrumentationExtension testing() {
28+
return testing;
29+
}
30+
31+
@Override
32+
protected RedisClient createClient(String uri) {
33+
return RedisClient.create(uri);
34+
}
35+
36+
private static RedisCommands<String, String> syncCommands;
37+
38+
@BeforeAll
39+
void setUp() throws UnknownHostException {
40+
redisServer.start();
41+
42+
host = redisServer.getHost();
43+
ip = InetAddress.getByName(host).getHostAddress();
44+
port = redisServer.getMappedPort(6379);
45+
embeddedDbUri = "redis://" + host + ":" + port + "/" + DB_INDEX;
46+
47+
redisClient = createClient(embeddedDbUri);
48+
49+
connection = redisClient.connect();
50+
syncCommands = connection.sync();
51+
52+
syncCommands.set("TESTKEY", "TESTVAL");
53+
}
54+
55+
@AfterAll
56+
static void cleanUp() {
57+
connection.close();
58+
redisClient.shutdown();
59+
redisServer.stop();
60+
}
61+
62+
@Test
63+
void testEmptyTrace() {
64+
String res =
65+
testing().runWithSpan("parent", () -> syncCommands.set("TESTSETKEY", "TESTSETVAL"));
66+
assertThat(res).isEqualTo("OK");
67+
68+
assertThat(testing.spans().isEmpty());
69+
assertThat(testing.metrics().isEmpty());
70+
}
71+
}

0 commit comments

Comments
 (0)