diff --git a/instrumentation/lettuce/lettuce-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/lettuce/v4_0/LettuceAsyncCommandsInstrumentation.java b/instrumentation/lettuce/lettuce-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/lettuce/v4_0/LettuceAsyncCommandsInstrumentation.java index 37d9850d2a57..e4fb909b864f 100644 --- a/instrumentation/lettuce/lettuce-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/lettuce/v4_0/LettuceAsyncCommandsInstrumentation.java +++ b/instrumentation/lettuce/lettuce-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/lettuce/v4_0/LettuceAsyncCommandsInstrumentation.java @@ -6,11 +6,16 @@ package io.opentelemetry.javaagent.instrumentation.lettuce.v4_0; import static io.opentelemetry.javaagent.bootstrap.Java8BytecodeBridge.currentContext; +import static io.opentelemetry.javaagent.instrumentation.lettuce.v4_0.LettuceSingletons.COMMAND_CONNECTION_INFO; +import static io.opentelemetry.javaagent.instrumentation.lettuce.v4_0.LettuceSingletons.CONNECTION_URI; import static io.opentelemetry.javaagent.instrumentation.lettuce.v4_0.LettuceSingletons.instrumenter; import static net.bytebuddy.matcher.ElementMatchers.isMethod; import static net.bytebuddy.matcher.ElementMatchers.named; import static net.bytebuddy.matcher.ElementMatchers.takesArgument; +import com.lambdaworks.redis.AbstractRedisAsyncCommands; +import com.lambdaworks.redis.RedisURI; +import com.lambdaworks.redis.api.StatefulConnection; import com.lambdaworks.redis.protocol.AsyncCommand; import com.lambdaworks.redis.protocol.RedisCommand; import io.opentelemetry.context.Context; @@ -60,7 +65,16 @@ public void end( } @Advice.OnMethodEnter(suppress = Throwable.class) - public static AdviceScope onEnter(@Advice.Argument(0) RedisCommand command) { + public static AdviceScope onEnter( + @Advice.This AbstractRedisAsyncCommands asyncCommands, + @Advice.Argument(0) RedisCommand command) { + + StatefulConnection connection = asyncCommands.getConnection(); + RedisURI redisUri = connection != null ? CONNECTION_URI.get(connection) : null; + + if (redisUri != null) { + COMMAND_CONNECTION_INFO.set(command, redisUri); + } Context parentContext = currentContext(); if (!instrumenter().shouldStart(parentContext, command)) { diff --git a/instrumentation/lettuce/lettuce-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/lettuce/v4_0/LettuceConnectInstrumentation.java b/instrumentation/lettuce/lettuce-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/lettuce/v4_0/LettuceConnectInstrumentation.java index 62851588ed98..a51bec21d6f6 100644 --- a/instrumentation/lettuce/lettuce-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/lettuce/v4_0/LettuceConnectInstrumentation.java +++ b/instrumentation/lettuce/lettuce-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/lettuce/v4_0/LettuceConnectInstrumentation.java @@ -6,11 +6,13 @@ package io.opentelemetry.javaagent.instrumentation.lettuce.v4_0; import static io.opentelemetry.javaagent.bootstrap.Java8BytecodeBridge.currentContext; +import static io.opentelemetry.javaagent.instrumentation.lettuce.v4_0.LettuceSingletons.CONNECTION_URI; import static io.opentelemetry.javaagent.instrumentation.lettuce.v4_0.LettuceSingletons.connectInstrumenter; import static net.bytebuddy.matcher.ElementMatchers.isMethod; import static net.bytebuddy.matcher.ElementMatchers.named; import com.lambdaworks.redis.RedisURI; +import com.lambdaworks.redis.api.StatefulConnection; import io.opentelemetry.context.Context; import io.opentelemetry.context.Scope; import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation; @@ -66,8 +68,14 @@ public static AdviceScope onEnter(@Advice.Argument(1) RedisURI redisUri) { @Advice.OnMethodExit(onThrowable = Throwable.class, suppress = Throwable.class) public static void onExit( @Advice.Argument(1) RedisURI redisUri, + @Advice.Return @Nullable StatefulConnection connection, @Advice.Thrown @Nullable Throwable throwable, @Advice.Enter @Nullable AdviceScope adviceScope) { + + if (connection != null) { + CONNECTION_URI.set(connection, redisUri); + } + if (adviceScope != null) { adviceScope.end(throwable, redisUri); } diff --git a/instrumentation/lettuce/lettuce-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/lettuce/v4_0/LettuceNetworkAttributesGetter.java b/instrumentation/lettuce/lettuce-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/lettuce/v4_0/LettuceNetworkAttributesGetter.java new file mode 100644 index 000000000000..5d3788a92cbe --- /dev/null +++ b/instrumentation/lettuce/lettuce-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/lettuce/v4_0/LettuceNetworkAttributesGetter.java @@ -0,0 +1,31 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.instrumentation.lettuce.v4_0; + +import static io.opentelemetry.javaagent.instrumentation.lettuce.v4_0.LettuceSingletons.COMMAND_CONNECTION_INFO; + +import com.lambdaworks.redis.RedisURI; +import com.lambdaworks.redis.protocol.RedisCommand; +import io.opentelemetry.instrumentation.api.semconv.network.ServerAttributesGetter; +import javax.annotation.Nullable; + +public final class LettuceNetworkAttributesGetter + implements ServerAttributesGetter> { + + @Override + @Nullable + public String getServerAddress(RedisCommand redisCommand) { + RedisURI redisUri = COMMAND_CONNECTION_INFO.get(redisCommand); + return redisUri != null ? redisUri.getHost() : null; + } + + @Override + @Nullable + public Integer getServerPort(RedisCommand redisCommand) { + RedisURI redisUri = COMMAND_CONNECTION_INFO.get(redisCommand); + return redisUri != null ? redisUri.getPort() : null; + } +} diff --git a/instrumentation/lettuce/lettuce-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/lettuce/v4_0/LettuceSingletons.java b/instrumentation/lettuce/lettuce-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/lettuce/v4_0/LettuceSingletons.java index 44b55c613347..9bfd0dfcfae0 100644 --- a/instrumentation/lettuce/lettuce-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/lettuce/v4_0/LettuceSingletons.java +++ b/instrumentation/lettuce/lettuce-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/lettuce/v4_0/LettuceSingletons.java @@ -6,6 +6,7 @@ package io.opentelemetry.javaagent.instrumentation.lettuce.v4_0; import com.lambdaworks.redis.RedisURI; +import com.lambdaworks.redis.api.StatefulConnection; import com.lambdaworks.redis.protocol.AsyncCommand; import com.lambdaworks.redis.protocol.RedisCommand; import io.opentelemetry.api.GlobalOpenTelemetry; @@ -33,9 +34,14 @@ public final class LettuceSingletons { public static final VirtualField, Context> CONTEXT = VirtualField.find(AsyncCommand.class, Context.class); + public static final VirtualField, RedisURI> CONNECTION_URI = + VirtualField.find(StatefulConnection.class, RedisURI.class); + public static final VirtualField, RedisURI> COMMAND_CONNECTION_INFO = + VirtualField.find(RedisCommand.class, RedisURI.class); static { LettuceDbAttributesGetter dbAttributesGetter = new LettuceDbAttributesGetter(); + LettuceNetworkAttributesGetter netAttributesGetter = new LettuceNetworkAttributesGetter(); INSTRUMENTER = Instrumenter., Void>builder( @@ -43,19 +49,20 @@ public final class LettuceSingletons { INSTRUMENTATION_NAME, DbClientSpanNameExtractor.create(dbAttributesGetter)) .addAttributesExtractor(DbClientAttributesExtractor.create(dbAttributesGetter)) + .addAttributesExtractor(ServerAttributesExtractor.create(netAttributesGetter)) .addOperationMetrics(DbClientMetrics.get()) .buildInstrumenter(SpanKindExtractor.alwaysClient()); - LettuceConnectNetworkAttributesGetter netAttributesGetter = + LettuceConnectNetworkAttributesGetter connectNetAttributesGetter = new LettuceConnectNetworkAttributesGetter(); CONNECT_INSTRUMENTER = Instrumenter.builder( GlobalOpenTelemetry.get(), INSTRUMENTATION_NAME, redisUri -> "CONNECT") - .addAttributesExtractor(ServerAttributesExtractor.create(netAttributesGetter)) + .addAttributesExtractor(ServerAttributesExtractor.create(connectNetAttributesGetter)) .addAttributesExtractor( PeerServiceAttributesExtractor.create( - netAttributesGetter, AgentCommonConfig.get().getPeerServiceResolver())) + connectNetAttributesGetter, AgentCommonConfig.get().getPeerServiceResolver())) .addAttributesExtractor(new LettuceConnectAttributesExtractor()) .setEnabled( AgentInstrumentationConfig.get() diff --git a/instrumentation/lettuce/lettuce-4.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/lettuce/v4_0/LettuceAsyncClientTest.java b/instrumentation/lettuce/lettuce-4.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/lettuce/v4_0/LettuceAsyncClientTest.java index 77e8523cbe6c..f3736da6c9d5 100644 --- a/instrumentation/lettuce/lettuce-4.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/lettuce/v4_0/LettuceAsyncClientTest.java +++ b/instrumentation/lettuce/lettuce-4.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/lettuce/v4_0/LettuceAsyncClientTest.java @@ -204,7 +204,9 @@ void testSetCommandUsingFutureGetWithTimeout() .hasKind(SpanKind.CLIENT) .hasAttributesSatisfyingExactly( equalTo(maybeStable(DB_SYSTEM), "redis"), - equalTo(maybeStable(DB_OPERATION), "SET")))); + equalTo(maybeStable(DB_OPERATION), "SET"), + equalTo(SERVER_ADDRESS, "localhost"), + equalTo(SERVER_PORT, port)))); } @Test @@ -234,7 +236,9 @@ void testCommandChainedWithThenAccept() { .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( equalTo(maybeStable(DB_SYSTEM), "redis"), - equalTo(maybeStable(DB_OPERATION), "GET")), + equalTo(maybeStable(DB_OPERATION), "GET"), + equalTo(SERVER_ADDRESS, "localhost"), + equalTo(SERVER_PORT, port)), span -> span.hasName("callback") .hasKind(SpanKind.INTERNAL) @@ -296,7 +300,9 @@ void getNonExistentKeyCommandWithHandleAsyncAndChainedWithThenApply() { .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( equalTo(maybeStable(DB_SYSTEM), "redis"), - equalTo(maybeStable(DB_OPERATION), "GET")), + equalTo(maybeStable(DB_OPERATION), "GET"), + equalTo(SERVER_ADDRESS, "localhost"), + equalTo(SERVER_PORT, port)), span -> span.hasName("callback1") .hasKind(SpanKind.INTERNAL) @@ -337,7 +343,9 @@ void testCommandWithNoArgumentsUsingBiconsumer() { .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( equalTo(maybeStable(DB_SYSTEM), "redis"), - equalTo(maybeStable(DB_OPERATION), "RANDOMKEY")), + equalTo(maybeStable(DB_OPERATION), "RANDOMKEY"), + equalTo(SERVER_ADDRESS, "localhost"), + equalTo(SERVER_PORT, port)), span -> span.hasName("callback") .hasKind(SpanKind.INTERNAL) @@ -381,7 +389,9 @@ void testHashSetAndThenNestApplyToHashGetall() { .hasKind(SpanKind.CLIENT) .hasAttributesSatisfyingExactly( equalTo(maybeStable(DB_SYSTEM), "redis"), - equalTo(maybeStable(DB_OPERATION), "HMSET"))), + equalTo(maybeStable(DB_OPERATION), "HMSET"), + equalTo(SERVER_ADDRESS, "localhost"), + equalTo(SERVER_PORT, port))), trace -> trace.hasSpansSatisfyingExactly( span -> @@ -389,7 +399,9 @@ void testHashSetAndThenNestApplyToHashGetall() { .hasKind(SpanKind.CLIENT) .hasAttributesSatisfyingExactly( equalTo(maybeStable(DB_SYSTEM), "redis"), - equalTo(maybeStable(DB_OPERATION), "HGETALL")))); + equalTo(maybeStable(DB_OPERATION), "HGETALL"), + equalTo(SERVER_ADDRESS, "localhost"), + equalTo(SERVER_PORT, port)))); } @Test @@ -425,7 +437,9 @@ void testCommandCompletesExceptionally() { new ArrayList<>( Arrays.asList( equalTo(maybeStable(DB_SYSTEM), "redis"), - equalTo(maybeStable(DB_OPERATION), "DEL"))); + equalTo(maybeStable(DB_OPERATION), "DEL"), + equalTo(SERVER_ADDRESS, "localhost"), + equalTo(SERVER_PORT, port))); if (SemconvStability.emitStableDatabaseSemconv()) { assertions.add(equalTo(ERROR_TYPE, "java.lang.IllegalStateException")); } @@ -476,6 +490,8 @@ void testCommandBeforeItFinished() { .hasAttributesSatisfyingExactly( equalTo(maybeStable(DB_SYSTEM), "redis"), equalTo(maybeStable(DB_OPERATION), "SADD"), + equalTo(SERVER_ADDRESS, "localhost"), + equalTo(SERVER_PORT, port), equalTo(booleanKey("lettuce.command.cancelled"), true)), span -> span.hasName("callback") @@ -512,7 +528,9 @@ void testDebugSegfaultCommandWithNoArgumentShouldProduceSpan() { .hasKind(SpanKind.CLIENT) .hasAttributesSatisfyingExactly( equalTo(maybeStable(DB_SYSTEM), "redis"), - equalTo(maybeStable(DB_OPERATION), "DEBUG")))); + equalTo(maybeStable(DB_OPERATION), "DEBUG"), + equalTo(SERVER_ADDRESS, "localhost"), + equalTo(SERVER_PORT, serverPort)))); } @Test @@ -546,6 +564,8 @@ void testShutdownCommandShouldProduceSpan() { .hasKind(SpanKind.CLIENT) .hasAttributesSatisfyingExactly( equalTo(maybeStable(DB_SYSTEM), "redis"), - equalTo(maybeStable(DB_OPERATION), "SHUTDOWN")))); + equalTo(maybeStable(DB_OPERATION), "SHUTDOWN"), + equalTo(SERVER_ADDRESS, "localhost"), + equalTo(SERVER_PORT, shutdownServerPort)))); } } diff --git a/instrumentation/lettuce/lettuce-4.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/lettuce/v4_0/LettuceSyncClientTest.java b/instrumentation/lettuce/lettuce-4.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/lettuce/v4_0/LettuceSyncClientTest.java index 1e12e8fa6a1c..bab1060e608f 100644 --- a/instrumentation/lettuce/lettuce-4.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/lettuce/v4_0/LettuceSyncClientTest.java +++ b/instrumentation/lettuce/lettuce-4.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/lettuce/v4_0/LettuceSyncClientTest.java @@ -168,7 +168,9 @@ void testSetCommand() { .hasKind(SpanKind.CLIENT) .hasAttributesSatisfyingExactly( equalTo(maybeStable(DB_SYSTEM), "redis"), - equalTo(maybeStable(DB_OPERATION), "SET")))); + equalTo(maybeStable(DB_OPERATION), "SET"), + equalTo(SERVER_ADDRESS, "localhost"), + equalTo(SERVER_PORT, port)))); } @Test @@ -184,7 +186,9 @@ void testGetCommand() { .hasKind(SpanKind.CLIENT) .hasAttributesSatisfyingExactly( equalTo(maybeStable(DB_SYSTEM), "redis"), - equalTo(maybeStable(DB_OPERATION), "GET")))); + equalTo(maybeStable(DB_OPERATION), "GET"), + equalTo(SERVER_ADDRESS, "localhost"), + equalTo(SERVER_PORT, port)))); } @Test @@ -200,7 +204,9 @@ void testGetNonExistentKeyCommand() { .hasKind(SpanKind.CLIENT) .hasAttributesSatisfyingExactly( equalTo(maybeStable(DB_SYSTEM), "redis"), - equalTo(maybeStable(DB_OPERATION), "GET")))); + equalTo(maybeStable(DB_OPERATION), "GET"), + equalTo(SERVER_ADDRESS, "localhost"), + equalTo(SERVER_PORT, port)))); } @Test @@ -216,7 +222,9 @@ void testCommandWithNoArguments() { .hasKind(SpanKind.CLIENT) .hasAttributesSatisfyingExactly( equalTo(maybeStable(DB_SYSTEM), "redis"), - equalTo(maybeStable(DB_OPERATION), "RANDOMKEY")))); + equalTo(maybeStable(DB_OPERATION), "RANDOMKEY"), + equalTo(SERVER_ADDRESS, "localhost"), + equalTo(SERVER_PORT, port)))); } @Test @@ -232,7 +240,9 @@ void testListCommand() { .hasKind(SpanKind.CLIENT) .hasAttributesSatisfyingExactly( equalTo(maybeStable(DB_SYSTEM), "redis"), - equalTo(maybeStable(DB_OPERATION), "LPUSH")))); + equalTo(maybeStable(DB_OPERATION), "LPUSH"), + equalTo(SERVER_ADDRESS, "localhost"), + equalTo(SERVER_PORT, port)))); } @Test @@ -248,7 +258,9 @@ void testHashSetCommand() { .hasKind(SpanKind.CLIENT) .hasAttributesSatisfyingExactly( equalTo(maybeStable(DB_SYSTEM), "redis"), - equalTo(maybeStable(DB_OPERATION), "HMSET")))); + equalTo(maybeStable(DB_OPERATION), "HMSET"), + equalTo(SERVER_ADDRESS, "localhost"), + equalTo(SERVER_PORT, port)))); } @Test @@ -264,7 +276,9 @@ void testHashGetallCommand() { .hasKind(SpanKind.CLIENT) .hasAttributesSatisfyingExactly( equalTo(maybeStable(DB_SYSTEM), "redis"), - equalTo(maybeStable(DB_OPERATION), "HGETALL")))); + equalTo(maybeStable(DB_OPERATION), "HGETALL"), + equalTo(SERVER_ADDRESS, "localhost"), + equalTo(SERVER_PORT, port)))); } @Test @@ -296,7 +310,9 @@ void testDebugSegfaultCommandWithNoArgumentShouldProduceSpan() { .hasKind(SpanKind.CLIENT) .hasAttributesSatisfyingExactly( equalTo(maybeStable(DB_SYSTEM), "redis"), - equalTo(maybeStable(DB_OPERATION), "DEBUG")))); + equalTo(maybeStable(DB_OPERATION), "DEBUG"), + equalTo(SERVER_ADDRESS, "localhost"), + equalTo(SERVER_PORT, serverPort)))); } @Test @@ -330,6 +346,8 @@ void testShutdownCommandShouldProduceSpan() { .hasKind(SpanKind.CLIENT) .hasAttributesSatisfyingExactly( equalTo(maybeStable(DB_SYSTEM), "redis"), - equalTo(maybeStable(DB_OPERATION), "SHUTDOWN")))); + equalTo(maybeStable(DB_OPERATION), "SHUTDOWN"), + equalTo(SERVER_ADDRESS, "localhost"), + equalTo(SERVER_PORT, shutdownServerPort)))); } } diff --git a/instrumentation/lettuce/lettuce-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/lettuce/v5_0/EndConnectAsyncBiFunction.java b/instrumentation/lettuce/lettuce-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/lettuce/v5_0/EndConnectAsyncBiFunction.java index d179605e5ccc..1f09a452b628 100644 --- a/instrumentation/lettuce/lettuce-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/lettuce/v5_0/EndConnectAsyncBiFunction.java +++ b/instrumentation/lettuce/lettuce-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/lettuce/v5_0/EndConnectAsyncBiFunction.java @@ -5,9 +5,11 @@ package io.opentelemetry.javaagent.instrumentation.lettuce.v5_0; +import static io.opentelemetry.javaagent.instrumentation.lettuce.v5_0.LettuceSingletons.CONNECTION_URI; import static io.opentelemetry.javaagent.instrumentation.lettuce.v5_0.LettuceSingletons.connectInstrumenter; import io.lettuce.core.RedisURI; +import io.lettuce.core.api.StatefulConnection; import io.opentelemetry.api.trace.Span; import io.opentelemetry.context.Context; import io.opentelemetry.javaagent.bootstrap.internal.AgentInstrumentationConfig; @@ -40,6 +42,10 @@ public EndConnectAsyncBiFunction(Context context, RedisURI redisUri) { @Override public R apply(T t, Throwable throwable) { + if (t instanceof StatefulConnection) { + CONNECTION_URI.set((StatefulConnection) t, redisUri); + } + if (throwable instanceof CancellationException) { if (CAPTURE_EXPERIMENTAL_SPAN_ATTRIBUTES) { Span.fromContext(context).setAttribute("lettuce.command.cancelled", true); diff --git a/instrumentation/lettuce/lettuce-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/lettuce/v5_0/LettuceAsyncCommandsInstrumentation.java b/instrumentation/lettuce/lettuce-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/lettuce/v5_0/LettuceAsyncCommandsInstrumentation.java index 9c1f62655a4d..a64b191cf546 100644 --- a/instrumentation/lettuce/lettuce-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/lettuce/v5_0/LettuceAsyncCommandsInstrumentation.java +++ b/instrumentation/lettuce/lettuce-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/lettuce/v5_0/LettuceAsyncCommandsInstrumentation.java @@ -7,11 +7,15 @@ import static io.opentelemetry.javaagent.bootstrap.Java8BytecodeBridge.currentContext; import static io.opentelemetry.javaagent.instrumentation.lettuce.v5_0.LettuceInstrumentationUtil.expectsResponse; +import static io.opentelemetry.javaagent.instrumentation.lettuce.v5_0.LettuceSingletons.COMMAND_CONNECTION_INFO; import static io.opentelemetry.javaagent.instrumentation.lettuce.v5_0.LettuceSingletons.instrumenter; import static net.bytebuddy.matcher.ElementMatchers.isMethod; import static net.bytebuddy.matcher.ElementMatchers.named; import static net.bytebuddy.matcher.ElementMatchers.takesArgument; +import io.lettuce.core.AbstractRedisAsyncCommands; +import io.lettuce.core.RedisURI; +import io.lettuce.core.api.StatefulConnection; import io.lettuce.core.protocol.AsyncCommand; import io.lettuce.core.protocol.RedisCommand; import io.opentelemetry.context.Context; @@ -72,7 +76,16 @@ public void end( } @Advice.OnMethodEnter(suppress = Throwable.class) - public static AdviceScope onEnter(@Advice.Argument(0) RedisCommand command) { + public static AdviceScope onEnter( + @Advice.This AbstractRedisAsyncCommands asyncCommands, + @Advice.Argument(0) RedisCommand command) { + + StatefulConnection connection = asyncCommands.getConnection(); + RedisURI redisUri = LettuceSingletons.CONNECTION_URI.get(connection); + + if (redisUri != null) { + COMMAND_CONNECTION_INFO.set(command, redisUri); + } Context parentContext = currentContext(); if (!instrumenter().shouldStart(parentContext, command)) { diff --git a/instrumentation/lettuce/lettuce-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/lettuce/v5_0/LettuceNetworkAttributesGetter.java b/instrumentation/lettuce/lettuce-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/lettuce/v5_0/LettuceNetworkAttributesGetter.java new file mode 100644 index 000000000000..f9912cc09ef2 --- /dev/null +++ b/instrumentation/lettuce/lettuce-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/lettuce/v5_0/LettuceNetworkAttributesGetter.java @@ -0,0 +1,31 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.instrumentation.lettuce.v5_0; + +import static io.opentelemetry.javaagent.instrumentation.lettuce.v5_0.LettuceSingletons.COMMAND_CONNECTION_INFO; + +import io.lettuce.core.RedisURI; +import io.lettuce.core.protocol.RedisCommand; +import io.opentelemetry.instrumentation.api.semconv.network.ServerAttributesGetter; +import javax.annotation.Nullable; + +public final class LettuceNetworkAttributesGetter + implements ServerAttributesGetter> { + + @Override + @Nullable + public String getServerAddress(RedisCommand redisCommand) { + RedisURI redisUri = COMMAND_CONNECTION_INFO.get(redisCommand); + return redisUri != null ? redisUri.getHost() : null; + } + + @Override + @Nullable + public Integer getServerPort(RedisCommand redisCommand) { + RedisURI redisUri = COMMAND_CONNECTION_INFO.get(redisCommand); + return redisUri != null ? redisUri.getPort() : null; + } +} diff --git a/instrumentation/lettuce/lettuce-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/lettuce/v5_0/LettuceSingletons.java b/instrumentation/lettuce/lettuce-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/lettuce/v5_0/LettuceSingletons.java index e8661ad8a8cd..9e93029ebbbc 100644 --- a/instrumentation/lettuce/lettuce-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/lettuce/v5_0/LettuceSingletons.java +++ b/instrumentation/lettuce/lettuce-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/lettuce/v5_0/LettuceSingletons.java @@ -6,6 +6,7 @@ package io.opentelemetry.javaagent.instrumentation.lettuce.v5_0; import io.lettuce.core.RedisURI; +import io.lettuce.core.api.StatefulConnection; import io.lettuce.core.protocol.AsyncCommand; import io.lettuce.core.protocol.RedisCommand; import io.opentelemetry.api.GlobalOpenTelemetry; @@ -33,9 +34,14 @@ public final class LettuceSingletons { public static final VirtualField, Context> CONTEXT = VirtualField.find(AsyncCommand.class, Context.class); + public static final VirtualField, RedisURI> CONNECTION_URI = + VirtualField.find(StatefulConnection.class, RedisURI.class); + public static final VirtualField, RedisURI> COMMAND_CONNECTION_INFO = + VirtualField.find(RedisCommand.class, RedisURI.class); static { LettuceDbAttributesGetter dbAttributesGetter = new LettuceDbAttributesGetter(); + LettuceNetworkAttributesGetter netAttributesGetter = new LettuceNetworkAttributesGetter(); INSTRUMENTER = Instrumenter., Void>builder( @@ -43,6 +49,7 @@ public final class LettuceSingletons { INSTRUMENTATION_NAME, DbClientSpanNameExtractor.create(dbAttributesGetter)) .addAttributesExtractor(DbClientAttributesExtractor.create(dbAttributesGetter)) + .addAttributesExtractor(ServerAttributesExtractor.create(netAttributesGetter)) .addOperationMetrics(DbClientMetrics.get()) .buildInstrumenter(SpanKindExtractor.alwaysClient()); diff --git a/instrumentation/lettuce/lettuce-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/lettuce/v5_0/rx/LettuceReactiveCommandsInstrumentation.java b/instrumentation/lettuce/lettuce-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/lettuce/v5_0/rx/LettuceReactiveCommandsInstrumentation.java index 688c44413eb7..a83ec56041ba 100644 --- a/instrumentation/lettuce/lettuce-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/lettuce/v5_0/rx/LettuceReactiveCommandsInstrumentation.java +++ b/instrumentation/lettuce/lettuce-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/lettuce/v5_0/rx/LettuceReactiveCommandsInstrumentation.java @@ -6,6 +6,8 @@ package io.opentelemetry.javaagent.instrumentation.lettuce.v5_0.rx; import static io.opentelemetry.javaagent.instrumentation.lettuce.v5_0.LettuceInstrumentationUtil.expectsResponse; +import static io.opentelemetry.javaagent.instrumentation.lettuce.v5_0.LettuceSingletons.COMMAND_CONNECTION_INFO; +import static io.opentelemetry.javaagent.instrumentation.lettuce.v5_0.LettuceSingletons.CONNECTION_URI; import static net.bytebuddy.matcher.ElementMatchers.isMethod; import static net.bytebuddy.matcher.ElementMatchers.isPublic; import static net.bytebuddy.matcher.ElementMatchers.nameEndsWith; @@ -14,6 +16,9 @@ import static net.bytebuddy.matcher.ElementMatchers.returns; import static net.bytebuddy.matcher.ElementMatchers.takesArgument; +import io.lettuce.core.AbstractRedisReactiveCommands; +import io.lettuce.core.RedisURI; +import io.lettuce.core.api.StatefulConnection; import io.lettuce.core.protocol.RedisCommand; import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation; import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer; @@ -56,8 +61,22 @@ public static class CreateMonoAdvice { @Advice.OnMethodEnter(suppress = Throwable.class) public static RedisCommand extractCommandName( + @Advice.This Object reactiveCommands, @Advice.Argument(0) Supplier> supplier) { - return supplier.get(); + RedisCommand command = supplier.get(); + + StatefulConnection connection = null; + if (reactiveCommands instanceof AbstractRedisReactiveCommands) { + connection = ((AbstractRedisReactiveCommands) reactiveCommands).getConnection(); + } + + RedisURI redisUri = connection != null ? CONNECTION_URI.get(connection) : null; + + if (redisUri != null) { + COMMAND_CONNECTION_INFO.set(command, redisUri); + } + + return command; } // throwables wouldn't matter here, because no spans have been started due to redis command not @@ -84,8 +103,22 @@ public static class CreateFluxAdvice { @Advice.OnMethodEnter(suppress = Throwable.class) public static RedisCommand extractCommandName( + @Advice.This Object reactiveCommands, @Advice.Argument(0) Supplier> supplier) { - return supplier.get(); + RedisCommand command = supplier.get(); + + StatefulConnection connection = null; + if (reactiveCommands instanceof AbstractRedisReactiveCommands) { + connection = ((AbstractRedisReactiveCommands) reactiveCommands).getConnection(); + } + + RedisURI redisUri = connection != null ? CONNECTION_URI.get(connection) : null; + + if (redisUri != null) { + COMMAND_CONNECTION_INFO.set(command, redisUri); + } + + return command; } // if there is an exception thrown, then don't make spans diff --git a/instrumentation/lettuce/lettuce-5.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/lettuce/v5_0/AbstractLettuceClientTest.java b/instrumentation/lettuce/lettuce-5.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/lettuce/v5_0/AbstractLettuceClientTest.java index cb90534b13dd..4db96f7f1423 100644 --- a/instrumentation/lettuce/lettuce-5.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/lettuce/v5_0/AbstractLettuceClientTest.java +++ b/instrumentation/lettuce/lettuce-5.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/lettuce/v5_0/AbstractLettuceClientTest.java @@ -55,6 +55,8 @@ abstract class AbstractLettuceClientTest { protected static String embeddedDbUri; + protected static int serverPort; + protected static StatefulRedisConnection newContainerConnection() { GenericContainer server = new GenericContainer<>(containerImage) @@ -64,7 +66,7 @@ protected static StatefulRedisConnection newContainerConnection( server.start(); cleanup.deferCleanup(server::stop); - long serverPort = server.getMappedPort(6379); + serverPort = server.getMappedPort(6379); RedisClient client = RedisClient.create("redis://" + host + ":" + serverPort + "/" + DB_INDEX); client.setOptions(CLIENT_OPTIONS); diff --git a/instrumentation/lettuce/lettuce-5.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/lettuce/v5_0/LettuceAsyncClientTest.java b/instrumentation/lettuce/lettuce-5.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/lettuce/v5_0/LettuceAsyncClientTest.java index 4f05a89a430d..1b3020d15e40 100644 --- a/instrumentation/lettuce/lettuce-5.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/lettuce/v5_0/LettuceAsyncClientTest.java +++ b/instrumentation/lettuce/lettuce-5.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/lettuce/v5_0/LettuceAsyncClientTest.java @@ -200,7 +200,9 @@ void testSetCommandUsingFutureGetWithTimeout() .hasAttributesSatisfyingExactly( equalTo(maybeStable(DB_SYSTEM), "redis"), equalTo(maybeStable(DB_STATEMENT), "SET TESTSETKEY ?"), - equalTo(maybeStable(DB_OPERATION), "SET")))); + equalTo(maybeStable(DB_OPERATION), "SET"), + equalTo(SERVER_ADDRESS, "localhost"), + equalTo(SERVER_PORT, port)))); } @Test @@ -232,7 +234,9 @@ void testGetCommandChainedWithThenAccept() .hasAttributesSatisfyingExactly( equalTo(maybeStable(DB_SYSTEM), "redis"), equalTo(maybeStable(DB_STATEMENT), "GET TESTKEY"), - equalTo(maybeStable(DB_OPERATION), "GET")), + equalTo(maybeStable(DB_OPERATION), "GET"), + equalTo(SERVER_ADDRESS, "localhost"), + equalTo(SERVER_PORT, port)), span -> span.hasName("callback") .hasKind(SpanKind.INTERNAL) @@ -289,7 +293,9 @@ void testGetNonExistentKeyCommandWithHandleAsyncAndChainedWithThenApply() .hasAttributesSatisfyingExactly( equalTo(maybeStable(DB_SYSTEM), "redis"), equalTo(maybeStable(DB_STATEMENT), "GET NON_EXISTENT_KEY"), - equalTo(maybeStable(DB_OPERATION), "GET")), + equalTo(maybeStable(DB_OPERATION), "GET"), + equalTo(SERVER_ADDRESS, "localhost"), + equalTo(SERVER_PORT, port)), span -> span.hasName("callback1") .hasKind(SpanKind.INTERNAL) @@ -332,7 +338,9 @@ void testCommandWithNoArgumentsUsingBiconsumer() .hasAttributesSatisfyingExactly( equalTo(maybeStable(DB_SYSTEM), "redis"), equalTo(maybeStable(DB_STATEMENT), "RANDOMKEY"), - equalTo(maybeStable(DB_OPERATION), "RANDOMKEY")), + equalTo(maybeStable(DB_OPERATION), "RANDOMKEY"), + equalTo(SERVER_ADDRESS, "localhost"), + equalTo(SERVER_PORT, port)), span -> span.hasName("callback") .hasKind(SpanKind.INTERNAL) @@ -380,7 +388,9 @@ void testHashSetAndThenNestApplyToHashGetall() equalTo( maybeStable(DB_STATEMENT), "HMSET TESTHM firstname ? lastname ? age ?"), - equalTo(maybeStable(DB_OPERATION), "HMSET"))), + equalTo(maybeStable(DB_OPERATION), "HMSET"), + equalTo(SERVER_ADDRESS, "localhost"), + equalTo(SERVER_PORT, port))), trace -> trace.hasSpansSatisfyingExactly( span -> @@ -389,7 +399,9 @@ void testHashSetAndThenNestApplyToHashGetall() .hasAttributesSatisfyingExactly( equalTo(maybeStable(DB_SYSTEM), "redis"), equalTo(maybeStable(DB_STATEMENT), "HGETALL TESTHM"), - equalTo(maybeStable(DB_OPERATION), "HGETALL")))); + equalTo(maybeStable(DB_OPERATION), "HGETALL"), + equalTo(SERVER_ADDRESS, "localhost"), + equalTo(SERVER_PORT, port)))); } @Test @@ -426,7 +438,9 @@ void testCommandCompletesExceptionally() { Arrays.asList( equalTo(maybeStable(DB_SYSTEM), "redis"), equalTo(maybeStable(DB_STATEMENT), "DEL key1 key2"), - equalTo(maybeStable(DB_OPERATION), "DEL"))); + equalTo(maybeStable(DB_OPERATION), "DEL"), + equalTo(SERVER_ADDRESS, "localhost"), + equalTo(SERVER_PORT, port))); if (SemconvStability.emitStableDatabaseSemconv()) { assertions.add(equalTo(ERROR_TYPE, "java.lang.IllegalStateException")); @@ -479,6 +493,8 @@ void testCancelCommandBeforeItFinishes() { equalTo(maybeStable(DB_SYSTEM), "redis"), equalTo(maybeStable(DB_STATEMENT), "SADD SKEY ? ?"), equalTo(maybeStable(DB_OPERATION), "SADD"), + equalTo(SERVER_ADDRESS, "localhost"), + equalTo(SERVER_PORT, port), equalTo(booleanKey("lettuce.command.cancelled"), true)), span -> span.hasName("callback") @@ -503,7 +519,9 @@ void testDebugSegfaultCommandWithNoArgumentShouldProduceSpan() { .hasAttributesSatisfyingExactly( equalTo(maybeStable(DB_SYSTEM), "redis"), equalTo(maybeStable(DB_STATEMENT), "DEBUG SEGFAULT"), - equalTo(maybeStable(DB_OPERATION), "DEBUG")))); + equalTo(maybeStable(DB_OPERATION), "DEBUG"), + equalTo(SERVER_ADDRESS, "localhost"), + equalTo(SERVER_PORT, serverPort)))); } @Test @@ -523,6 +541,8 @@ void testShutdownCommandShouldProduceSpan() { .hasAttributesSatisfyingExactly( equalTo(maybeStable(DB_SYSTEM), "redis"), equalTo(maybeStable(DB_STATEMENT), "SHUTDOWN NOSAVE"), - equalTo(maybeStable(DB_OPERATION), "SHUTDOWN")))); + equalTo(maybeStable(DB_OPERATION), "SHUTDOWN"), + equalTo(SERVER_ADDRESS, "localhost"), + equalTo(SERVER_PORT, serverPort)))); } } diff --git a/instrumentation/lettuce/lettuce-5.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/lettuce/v5_0/LettuceReactiveClientTest.java b/instrumentation/lettuce/lettuce-5.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/lettuce/v5_0/LettuceReactiveClientTest.java index 9cf7b958e519..b445dcf1086c 100644 --- a/instrumentation/lettuce/lettuce-5.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/lettuce/v5_0/LettuceReactiveClientTest.java +++ b/instrumentation/lettuce/lettuce-5.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/lettuce/v5_0/LettuceReactiveClientTest.java @@ -8,6 +8,8 @@ import static io.opentelemetry.instrumentation.testing.junit.db.SemconvStabilityUtil.maybeStable; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.satisfies; +import static io.opentelemetry.semconv.ServerAttributes.SERVER_ADDRESS; +import static io.opentelemetry.semconv.ServerAttributes.SERVER_PORT; import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_OPERATION; import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_STATEMENT; import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_SYSTEM; @@ -97,7 +99,9 @@ void testSetCommandWithSubscribeOnDefinedConsumer() .hasAttributesSatisfyingExactly( equalTo(maybeStable(DB_SYSTEM), "redis"), equalTo(maybeStable(DB_STATEMENT), "SET TESTSETKEY ?"), - equalTo(maybeStable(DB_OPERATION), "SET")), + equalTo(maybeStable(DB_OPERATION), "SET"), + equalTo(SERVER_ADDRESS, "localhost"), + equalTo(SERVER_PORT, port)), span -> span.hasName("callback") .hasKind(SpanKind.INTERNAL) @@ -128,7 +132,9 @@ void testGetCommandWithLambdaFunction() .hasAttributesSatisfyingExactly( equalTo(maybeStable(DB_SYSTEM), "redis"), equalTo(maybeStable(DB_STATEMENT), "GET TESTKEY"), - equalTo(maybeStable(DB_OPERATION), "GET")))); + equalTo(maybeStable(DB_OPERATION), "GET"), + equalTo(SERVER_ADDRESS, "localhost"), + equalTo(SERVER_PORT, port)))); } // to make sure instrumentation's chained completion stages won't interfere with user's, while @@ -167,7 +173,9 @@ void testGetNonExistentKeyCommand() .hasAttributesSatisfyingExactly( equalTo(maybeStable(DB_SYSTEM), "redis"), equalTo(maybeStable(DB_STATEMENT), "GET NON_EXISTENT_KEY"), - equalTo(maybeStable(DB_OPERATION), "GET")), + equalTo(maybeStable(DB_OPERATION), "GET"), + equalTo(SERVER_ADDRESS, "localhost"), + equalTo(SERVER_PORT, port)), span -> span.hasName("callback") .hasKind(SpanKind.INTERNAL) @@ -197,7 +205,9 @@ void testCommandWithNoArguments() .hasAttributesSatisfyingExactly( equalTo(maybeStable(DB_SYSTEM), "redis"), equalTo(maybeStable(DB_STATEMENT), "RANDOMKEY"), - equalTo(maybeStable(DB_OPERATION), "RANDOMKEY")))); + equalTo(maybeStable(DB_OPERATION), "RANDOMKEY"), + equalTo(SERVER_ADDRESS, "localhost"), + equalTo(SERVER_PORT, port)))); } @Test @@ -214,6 +224,8 @@ void testCommandFluxPublisher() { equalTo(maybeStable(DB_SYSTEM), "redis"), equalTo(maybeStable(DB_STATEMENT), "COMMAND"), equalTo(maybeStable(DB_OPERATION), "COMMAND"), + equalTo(SERVER_ADDRESS, "localhost"), + equalTo(SERVER_PORT, port), satisfies( AttributeKey.longKey("lettuce.command.results.count"), val -> val.isGreaterThan(100))))); @@ -233,6 +245,8 @@ void testCommandCancelAfter2OnFluxPublisher() { equalTo(maybeStable(DB_SYSTEM), "redis"), equalTo(maybeStable(DB_STATEMENT), "COMMAND"), equalTo(maybeStable(DB_OPERATION), "COMMAND"), + equalTo(SERVER_ADDRESS, "localhost"), + equalTo(SERVER_PORT, port), satisfies( AttributeKey.booleanKey("lettuce.command.cancelled"), AbstractBooleanAssert::isTrue), @@ -266,7 +280,9 @@ void testDebugSegfaultCommandReturnsMonoVoidWithNoArgumentShouldProduceSpan() { .hasAttributesSatisfyingExactly( equalTo(maybeStable(DB_SYSTEM), "redis"), equalTo(maybeStable(DB_STATEMENT), "DEBUG SEGFAULT"), - equalTo(maybeStable(DB_OPERATION), "DEBUG")))); + equalTo(maybeStable(DB_OPERATION), "DEBUG"), + equalTo(SERVER_ADDRESS, "localhost"), + equalTo(SERVER_PORT, serverPort)))); } @Test @@ -286,7 +302,9 @@ void testShutdownCommandShouldProduceSpan() { .hasAttributesSatisfyingExactly( equalTo(maybeStable(DB_SYSTEM), "redis"), equalTo(maybeStable(DB_STATEMENT), "SHUTDOWN NOSAVE"), - equalTo(maybeStable(DB_OPERATION), "SHUTDOWN")))); + equalTo(maybeStable(DB_OPERATION), "SHUTDOWN"), + equalTo(SERVER_ADDRESS, "localhost"), + equalTo(SERVER_PORT, serverPort)))); } @Test @@ -306,7 +324,9 @@ void testBlockingSubscriber() { .hasAttributesSatisfyingExactly( equalTo(maybeStable(DB_SYSTEM), "redis"), equalTo(maybeStable(DB_STATEMENT), "SET a ?"), - equalTo(maybeStable(DB_OPERATION), "SET")), + equalTo(maybeStable(DB_OPERATION), "SET"), + equalTo(SERVER_ADDRESS, "localhost"), + equalTo(SERVER_PORT, port)), span -> span.hasName("GET") .hasKind(SpanKind.CLIENT) @@ -314,7 +334,9 @@ void testBlockingSubscriber() { .hasAttributesSatisfyingExactly( equalTo(maybeStable(DB_SYSTEM), "redis"), equalTo(maybeStable(DB_STATEMENT), "GET a"), - equalTo(maybeStable(DB_OPERATION), "GET")))); + equalTo(maybeStable(DB_OPERATION), "GET"), + equalTo(SERVER_ADDRESS, "localhost"), + equalTo(SERVER_PORT, port)))); } @Test @@ -334,7 +356,9 @@ void testAsyncSubscriber() { .hasAttributesSatisfyingExactly( equalTo(maybeStable(DB_SYSTEM), "redis"), equalTo(maybeStable(DB_STATEMENT), "SET a ?"), - equalTo(maybeStable(DB_OPERATION), "SET")), + equalTo(maybeStable(DB_OPERATION), "SET"), + equalTo(SERVER_ADDRESS, "localhost"), + equalTo(SERVER_PORT, port)), span -> span.hasName("GET") .hasKind(SpanKind.CLIENT) @@ -342,7 +366,9 @@ void testAsyncSubscriber() { .hasAttributesSatisfyingExactly( equalTo(maybeStable(DB_SYSTEM), "redis"), equalTo(maybeStable(DB_STATEMENT), "GET a"), - equalTo(maybeStable(DB_OPERATION), "GET")))); + equalTo(maybeStable(DB_OPERATION), "GET"), + equalTo(SERVER_ADDRESS, "localhost"), + equalTo(SERVER_PORT, port)))); } @Test @@ -367,7 +393,9 @@ void testAsyncSubscriberWithSpecificThreadPool() { .hasAttributesSatisfyingExactly( equalTo(maybeStable(DB_SYSTEM), "redis"), equalTo(maybeStable(DB_STATEMENT), "SET a ?"), - equalTo(maybeStable(DB_OPERATION), "SET")), + equalTo(maybeStable(DB_OPERATION), "SET"), + equalTo(SERVER_ADDRESS, "localhost"), + equalTo(SERVER_PORT, port)), span -> span.hasName("GET") .hasKind(SpanKind.CLIENT) @@ -375,6 +403,8 @@ void testAsyncSubscriberWithSpecificThreadPool() { .hasAttributesSatisfyingExactly( equalTo(maybeStable(DB_SYSTEM), "redis"), equalTo(maybeStable(DB_STATEMENT), "GET a"), - equalTo(maybeStable(DB_OPERATION), "GET")))); + equalTo(maybeStable(DB_OPERATION), "GET"), + equalTo(SERVER_ADDRESS, "localhost"), + equalTo(SERVER_PORT, port)))); } } diff --git a/instrumentation/lettuce/lettuce-5.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/lettuce/v5_0/LettuceSyncClientTest.java b/instrumentation/lettuce/lettuce-5.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/lettuce/v5_0/LettuceSyncClientTest.java index 5304407c8ef3..b3ab81406608 100644 --- a/instrumentation/lettuce/lettuce-5.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/lettuce/v5_0/LettuceSyncClientTest.java +++ b/instrumentation/lettuce/lettuce-5.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/lettuce/v5_0/LettuceSyncClientTest.java @@ -157,7 +157,9 @@ void testSetCommand() { .hasAttributesSatisfyingExactly( equalTo(maybeStable(DB_SYSTEM), "redis"), equalTo(maybeStable(DB_STATEMENT), "SET TESTSETKEY ?"), - equalTo(maybeStable(DB_OPERATION), "SET")))); + equalTo(maybeStable(DB_OPERATION), "SET"), + equalTo(SERVER_ADDRESS, "localhost"), + equalTo(SERVER_PORT, port)))); } @Test @@ -174,7 +176,9 @@ void testGetCommand() { .hasAttributesSatisfyingExactly( equalTo(maybeStable(DB_SYSTEM), "redis"), equalTo(maybeStable(DB_STATEMENT), "GET TESTKEY"), - equalTo(maybeStable(DB_OPERATION), "GET")))); + equalTo(maybeStable(DB_OPERATION), "GET"), + equalTo(SERVER_ADDRESS, "localhost"), + equalTo(SERVER_PORT, port)))); } @Test @@ -191,7 +195,9 @@ void testGetNonExistentKeyCommand() { .hasAttributesSatisfyingExactly( equalTo(maybeStable(DB_SYSTEM), "redis"), equalTo(maybeStable(DB_STATEMENT), "GET NON_EXISTENT_KEY"), - equalTo(maybeStable(DB_OPERATION), "GET")))); + equalTo(maybeStable(DB_OPERATION), "GET"), + equalTo(SERVER_ADDRESS, "localhost"), + equalTo(SERVER_PORT, port)))); } @Test @@ -208,7 +214,9 @@ void testCommandWithNoArguments() { .hasAttributesSatisfyingExactly( equalTo(maybeStable(DB_SYSTEM), "redis"), equalTo(maybeStable(DB_STATEMENT), "RANDOMKEY"), - equalTo(maybeStable(DB_OPERATION), "RANDOMKEY")))); + equalTo(maybeStable(DB_OPERATION), "RANDOMKEY"), + equalTo(SERVER_ADDRESS, "localhost"), + equalTo(SERVER_PORT, port)))); } @Test @@ -225,7 +233,9 @@ void testListCommand() { .hasAttributesSatisfyingExactly( equalTo(maybeStable(DB_SYSTEM), "redis"), equalTo(maybeStable(DB_STATEMENT), "LPUSH TESTLIST ?"), - equalTo(maybeStable(DB_OPERATION), "LPUSH")))); + equalTo(maybeStable(DB_OPERATION), "LPUSH"), + equalTo(SERVER_ADDRESS, "localhost"), + equalTo(SERVER_PORT, port)))); } @Test @@ -244,7 +254,9 @@ void testHashSetCommand() { equalTo( maybeStable(DB_STATEMENT), "HMSET user firstname ? lastname ? age ?"), - equalTo(maybeStable(DB_OPERATION), "HMSET")))); + equalTo(maybeStable(DB_OPERATION), "HMSET"), + equalTo(SERVER_ADDRESS, "localhost"), + equalTo(SERVER_PORT, port)))); } @Test @@ -261,7 +273,9 @@ void testHashGetallCommand() { .hasAttributesSatisfyingExactly( equalTo(maybeStable(DB_SYSTEM), "redis"), equalTo(maybeStable(DB_STATEMENT), "HGETALL TESTHM"), - equalTo(maybeStable(DB_OPERATION), "HGETALL")))); + equalTo(maybeStable(DB_OPERATION), "HGETALL"), + equalTo(SERVER_ADDRESS, "localhost"), + equalTo(SERVER_PORT, port)))); } @Test @@ -281,7 +295,9 @@ void testDebugSegfaultCommandWithNoArgumentShouldProduceSpan() { .hasAttributesSatisfyingExactly( equalTo(maybeStable(DB_SYSTEM), "redis"), equalTo(maybeStable(DB_STATEMENT), "DEBUG SEGFAULT"), - equalTo(maybeStable(DB_OPERATION), "DEBUG")))); + equalTo(maybeStable(DB_OPERATION), "DEBUG"), + equalTo(SERVER_ADDRESS, "localhost"), + equalTo(SERVER_PORT, serverPort)))); } @Test @@ -301,6 +317,8 @@ void testShutdownCommandShouldProduceSpan() { .hasAttributesSatisfyingExactly( equalTo(maybeStable(DB_SYSTEM), "redis"), equalTo(maybeStable(DB_STATEMENT), "SHUTDOWN NOSAVE"), - equalTo(maybeStable(DB_OPERATION), "SHUTDOWN")))); + equalTo(maybeStable(DB_OPERATION), "SHUTDOWN"), + equalTo(SERVER_ADDRESS, "localhost"), + equalTo(SERVER_PORT, serverPort)))); } }