Skip to content

Commit 37ecc77

Browse files
123liuziminglaurit
andauthored
chore: check compatibility between reactor-core and lettuce (#15472)
Co-authored-by: Lauri Tulmin <[email protected]>
1 parent 68b7715 commit 37ecc77

File tree

4 files changed

+127
-1
lines changed

4 files changed

+127
-1
lines changed

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

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,3 +43,22 @@ tasks {
4343
dependsOn(testStableSemconv)
4444
}
4545
}
46+
47+
testing {
48+
suites {
49+
val testCompatibility by registering(JvmTestSuite::class) {
50+
dependencies {
51+
implementation("io.lettuce:lettuce-core:6.1.10.RELEASE")
52+
implementation("io.projectreactor:reactor-core:3.5.3")
53+
implementation("org.testcontainers:testcontainers")
54+
implementation(project(":instrumentation:lettuce:lettuce-5.1:testing"))
55+
}
56+
}
57+
}
58+
}
59+
60+
tasks {
61+
check {
62+
dependsOn(testing.suites)
63+
}
64+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
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.Tracing;
9+
10+
public final class CompatibilityChecker {
11+
12+
private CompatibilityChecker() {}
13+
14+
private static final boolean isCompatible = isCompatible();
15+
16+
private static boolean isCompatible() {
17+
try {
18+
Tracing.getContext();
19+
return true;
20+
} catch (Throwable t) {
21+
return false;
22+
}
23+
}
24+
25+
// related to https://github.com/open-telemetry/opentelemetry-java-instrumentation/issues/10997
26+
// if users are using incompatible versions of reactor-core and lettuce
27+
// then just disable the instrumentation
28+
public static boolean checkCompatible() {
29+
return isCompatible;
30+
}
31+
}

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,74 @@
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.api.trace.SpanKind;
13+
import io.opentelemetry.instrumentation.lettuce.v5_1.AbstractLettuceClientTest;
14+
import io.opentelemetry.instrumentation.testing.junit.AgentInstrumentationExtension;
15+
import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension;
16+
import java.net.InetAddress;
17+
import java.net.UnknownHostException;
18+
import org.junit.jupiter.api.AfterAll;
19+
import org.junit.jupiter.api.BeforeAll;
20+
import org.junit.jupiter.api.Test;
21+
import org.junit.jupiter.api.extension.RegisterExtension;
22+
23+
class LettuceCompatibilityTest extends AbstractLettuceClientTest {
24+
@RegisterExtension
25+
static final InstrumentationExtension testing = AgentInstrumentationExtension.create();
26+
27+
@Override
28+
public InstrumentationExtension testing() {
29+
return testing;
30+
}
31+
32+
@Override
33+
protected RedisClient createClient(String uri) {
34+
return RedisClient.create(uri);
35+
}
36+
37+
private static RedisCommands<String, String> syncCommands;
38+
39+
@BeforeAll
40+
void setUp() throws UnknownHostException {
41+
redisServer.start();
42+
43+
host = redisServer.getHost();
44+
ip = InetAddress.getByName(host).getHostAddress();
45+
port = redisServer.getMappedPort(6379);
46+
embeddedDbUri = "redis://" + host + ":" + port + "/" + DB_INDEX;
47+
48+
redisClient = createClient(embeddedDbUri);
49+
50+
connection = redisClient.connect();
51+
syncCommands = connection.sync();
52+
53+
syncCommands.set("TESTKEY", "TESTVAL");
54+
}
55+
56+
@AfterAll
57+
static void cleanUp() {
58+
connection.close();
59+
redisClient.shutdown();
60+
redisServer.stop();
61+
}
62+
63+
@Test
64+
void testInstrumentationDisabled() {
65+
String res =
66+
testing().runWithSpan("parent", () -> syncCommands.set("TESTSETKEY", "TESTSETVAL"));
67+
assertThat(res).isEqualTo("OK");
68+
testing()
69+
.waitAndAssertTraces(
70+
trace ->
71+
trace.hasSpansSatisfyingExactly(
72+
span -> span.hasName("parent").hasKind(SpanKind.INTERNAL).hasNoParent()));
73+
}
74+
}

0 commit comments

Comments
 (0)