diff --git a/instrumentation/lettuce/lettuce-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/lettuce/v5_0/EndCommandAsyncBiFunction.java b/instrumentation/lettuce/lettuce-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/lettuce/v5_0/EndCommandAsyncBiFunction.java new file mode 100644 index 0000000000..e6c1192d27 --- /dev/null +++ b/instrumentation/lettuce/lettuce-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/lettuce/v5_0/EndCommandAsyncBiFunction.java @@ -0,0 +1,57 @@ +/* + * 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.LettuceInstrumenters.instrumenter; + +import io.lettuce.core.protocol.RedisCommand; +import io.opentelemetry.api.trace.Span; +import io.opentelemetry.context.Context; +import io.opentelemetry.instrumentation.api.config.Config; +import java.util.concurrent.CancellationException; +import java.util.function.BiFunction; + +/** + * Callback class to close the command span on an error or a success in the RedisFuture returned by + * the lettuce async API. + * + * @param the normal completion result + * @param the error + * @param the return type, should be null since nothing else should happen from tracing + * standpoint after the span is closed + */ +public class EndCommandAsyncBiFunction + implements BiFunction { + + private static final boolean CAPTURE_EXPERIMENTAL_SPAN_ATTRIBUTES = + Config.get() + .getBooleanProperty("otel.instrumentation.lettuce.experimental-span-attributes", false); + + private final Context context; + private final RedisCommand command; + + public EndCommandAsyncBiFunction(Context context, RedisCommand command) { + this.context = context; + this.command = command; + } + + @Override + public R apply(T t, Throwable throwable) { + end(context, command, throwable); + return null; + } + + public static void end(Context context, RedisCommand command, Throwable throwable) { + if (throwable instanceof CancellationException) { + if (CAPTURE_EXPERIMENTAL_SPAN_ATTRIBUTES) { + Span.fromContext(context).setAttribute("lettuce.command.cancelled", true); + } + // and don't report this as an error + throwable = null; + } + instrumenter().end(context, command, null, throwable); + } +} diff --git a/instrumentation/lettuce/lettuce-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/lettuce/v5_0/LettuceAsyncBiFunction.java b/instrumentation/lettuce/lettuce-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/lettuce/v5_0/EndConnectAsyncBiFunction.java similarity index 66% rename from instrumentation/lettuce/lettuce-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/lettuce/v5_0/LettuceAsyncBiFunction.java rename to instrumentation/lettuce/lettuce-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/lettuce/v5_0/EndConnectAsyncBiFunction.java index 7e6d5ed75f..b054d064c5 100644 --- a/instrumentation/lettuce/lettuce-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/lettuce/v5_0/LettuceAsyncBiFunction.java +++ b/instrumentation/lettuce/lettuce-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/lettuce/v5_0/EndConnectAsyncBiFunction.java @@ -5,8 +5,9 @@ package io.opentelemetry.javaagent.instrumentation.lettuce.v5_0; -import static io.opentelemetry.javaagent.instrumentation.lettuce.v5_0.LettuceDatabaseClientTracer.tracer; +import static io.opentelemetry.javaagent.instrumentation.lettuce.v5_0.LettuceInstrumenters.connectInstrumenter; +import io.lettuce.core.RedisURI; import io.opentelemetry.api.trace.Span; import io.opentelemetry.context.Context; import io.opentelemetry.instrumentation.api.config.Config; @@ -14,15 +15,15 @@ import java.util.concurrent.CancellationException; import java.util.function.BiFunction; /** - * Callback class to close the span on an error or a success in the RedisFuture returned by the - * lettuce async API. + * Callback class to close the connect span on an error or a success in the RedisFuture returned by + * the lettuce async API. * * @param the normal completion result * @param the error * @param the return type, should be null since nothing else should happen from tracing * standpoint after the span is closed */ -public class LettuceAsyncBiFunction +public class EndConnectAsyncBiFunction implements BiFunction { private static final boolean CAPTURE_EXPERIMENTAL_SPAN_ATTRIBUTES = @@ -30,23 +31,23 @@ public class LettuceAsyncBiFunction .getBooleanProperty("otel.instrumentation.lettuce.experimental-span-attributes", false); private final Context context; + private final RedisURI request; - public LettuceAsyncBiFunction(Context context) { + public EndConnectAsyncBiFunction(Context context, RedisURI request) { this.context = context; + this.request = request; } @Override public R apply(T t, Throwable throwable) { - if (throwable == null) { - tracer().end(context); - } else if (throwable instanceof CancellationException) { + if (throwable instanceof CancellationException) { if (CAPTURE_EXPERIMENTAL_SPAN_ATTRIBUTES) { Span.fromContext(context).setAttribute("lettuce.command.cancelled", true); } - tracer().end(context); - } else { - tracer().endExceptionally(context, throwable); + // and don't report this as an error + throwable = null; } + connectInstrumenter().end(context, request, null, throwable); return null; } } diff --git a/instrumentation/lettuce/lettuce-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/lettuce/v5_0/LettuceAbstractDatabaseClientTracer.java b/instrumentation/lettuce/lettuce-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/lettuce/v5_0/LettuceAbstractDatabaseClientTracer.java deleted file mode 100644 index 0d80011067..0000000000 --- a/instrumentation/lettuce/lettuce-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/lettuce/v5_0/LettuceAbstractDatabaseClientTracer.java +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * SPDX-License-Identifier: Apache-2.0 - */ - -package io.opentelemetry.javaagent.instrumentation.lettuce.v5_0; - -import io.lettuce.core.RedisURI; -import io.opentelemetry.api.trace.SpanBuilder; -import io.opentelemetry.instrumentation.api.tracer.DatabaseClientTracer; -import io.opentelemetry.instrumentation.api.tracer.net.NetPeerAttributes; -import io.opentelemetry.semconv.trace.attributes.SemanticAttributes; -import io.opentelemetry.semconv.trace.attributes.SemanticAttributes.DbSystemValues; -import java.net.InetSocketAddress; - -public abstract class LettuceAbstractDatabaseClientTracer - extends DatabaseClientTracer { - protected LettuceAbstractDatabaseClientTracer() { - super(NetPeerAttributes.INSTANCE); - } - - @Override - protected String getInstrumentationName() { - return "io.opentelemetry.javaagent.lettuce-5.0"; - } - - @Override - protected String dbSystem(RedisURI connection) { - return DbSystemValues.REDIS; - } - - @Override - protected InetSocketAddress peerAddress(RedisURI redisUri) { - return new InetSocketAddress(redisUri.getHost(), redisUri.getPort()); - } - - @Override - public void onConnection(SpanBuilder span, RedisURI connection) { - if (connection != null && connection.getDatabase() != 0) { - span.setAttribute( - SemanticAttributes.DB_REDIS_DATABASE_INDEX, (long) connection.getDatabase()); - } - super.onConnection(span, connection); - } - - @Override - protected String dbStatement( - RedisURI connection, STATEMENT statement, String sanitizedStatement) { - return sanitizedStatement; - } -} 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 ff3e039982..b028cd0e04 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 @@ -6,8 +6,8 @@ package io.opentelemetry.javaagent.instrumentation.lettuce.v5_0; import static io.opentelemetry.javaagent.instrumentation.api.Java8BytecodeBridge.currentContext; -import static io.opentelemetry.javaagent.instrumentation.lettuce.v5_0.LettuceDatabaseClientTracer.tracer; import static io.opentelemetry.javaagent.instrumentation.lettuce.v5_0.LettuceInstrumentationUtil.expectsResponse; +import static io.opentelemetry.javaagent.instrumentation.lettuce.v5_0.LettuceInstrumenters.instrumenter; import static net.bytebuddy.matcher.ElementMatchers.isMethod; import static net.bytebuddy.matcher.ElementMatchers.named; import static net.bytebuddy.matcher.ElementMatchers.takesArgument; @@ -46,7 +46,7 @@ public class LettuceAsyncCommandsInstrumentation implements TypeInstrumentation @Advice.Local("otelContext") Context context, @Advice.Local("otelScope") Scope scope) { - context = tracer().startSpan(currentContext(), null, command); + context = instrumenter().start(currentContext(), command); scope = context.makeCurrent(); } @@ -60,15 +60,15 @@ public class LettuceAsyncCommandsInstrumentation implements TypeInstrumentation scope.close(); if (throwable != null) { - tracer().endExceptionally(context, throwable); + instrumenter().end(context, command, null, throwable); return; } // close spans on error or normal completion if (expectsResponse(command)) { - asyncCommand.handleAsync(new LettuceAsyncBiFunction<>(context)); + asyncCommand.handleAsync(new EndCommandAsyncBiFunction<>(context, command)); } else { - tracer().end(context); + instrumenter().end(context, command, null, null); } } } diff --git a/instrumentation/lettuce/lettuce-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/lettuce/v5_0/LettuceClientInstrumentation.java b/instrumentation/lettuce/lettuce-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/lettuce/v5_0/LettuceClientInstrumentation.java index 570695e8e4..c43c9b0e18 100644 --- a/instrumentation/lettuce/lettuce-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/lettuce/v5_0/LettuceClientInstrumentation.java +++ b/instrumentation/lettuce/lettuce-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/lettuce/v5_0/LettuceClientInstrumentation.java @@ -6,7 +6,7 @@ package io.opentelemetry.javaagent.instrumentation.lettuce.v5_0; import static io.opentelemetry.javaagent.instrumentation.api.Java8BytecodeBridge.currentContext; -import static io.opentelemetry.javaagent.instrumentation.lettuce.v5_0.LettuceConnectionDatabaseClientTracer.tracer; +import static io.opentelemetry.javaagent.instrumentation.lettuce.v5_0.LettuceInstrumenters.connectInstrumenter; import static net.bytebuddy.matcher.ElementMatchers.isMethod; import static net.bytebuddy.matcher.ElementMatchers.isPrivate; import static net.bytebuddy.matcher.ElementMatchers.nameEndsWith; @@ -51,12 +51,13 @@ public class LettuceClientInstrumentation implements TypeInstrumentation { @Advice.Argument(1) RedisURI redisUri, @Advice.Local("otelContext") Context context, @Advice.Local("otelScope") Scope scope) { - context = tracer().startSpan(currentContext(), redisUri, "CONNECT"); + context = connectInstrumenter().start(currentContext(), redisUri); scope = context.makeCurrent(); } @Advice.OnMethodExit(onThrowable = Throwable.class, suppress = Throwable.class) public static void stopSpan( + @Advice.Argument(1) RedisURI redisUri, @Advice.Thrown Throwable throwable, @Advice.Return ConnectionFuture connectionFuture, @Advice.Local("otelContext") Context context, @@ -64,10 +65,10 @@ public class LettuceClientInstrumentation implements TypeInstrumentation { scope.close(); if (throwable != null) { - tracer().endExceptionally(context, throwable); + connectInstrumenter().end(context, redisUri, null, throwable); return; } - connectionFuture.handleAsync(new LettuceAsyncBiFunction<>(context)); + connectionFuture.handleAsync(new EndConnectAsyncBiFunction<>(context, redisUri)); } } } diff --git a/instrumentation/lettuce/lettuce-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/lettuce/v5_0/LettuceConnectAttributesExtractor.java b/instrumentation/lettuce/lettuce-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/lettuce/v5_0/LettuceConnectAttributesExtractor.java new file mode 100644 index 0000000000..52b2085159 --- /dev/null +++ b/instrumentation/lettuce/lettuce-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/lettuce/v5_0/LettuceConnectAttributesExtractor.java @@ -0,0 +1,27 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.instrumentation.lettuce.v5_0; + +import io.lettuce.core.RedisURI; +import io.opentelemetry.api.common.AttributesBuilder; +import io.opentelemetry.instrumentation.api.instrumenter.AttributesExtractor; +import io.opentelemetry.semconv.trace.attributes.SemanticAttributes; + +final class LettuceConnectAttributesExtractor extends AttributesExtractor { + + @Override + protected void onStart(AttributesBuilder attributes, RedisURI redisUri) { + attributes.put(SemanticAttributes.DB_SYSTEM, SemanticAttributes.DbSystemValues.REDIS); + + int database = redisUri.getDatabase(); + if (database != 0) { + attributes.put(SemanticAttributes.DB_REDIS_DATABASE_INDEX, (long) database); + } + } + + @Override + protected void onEnd(AttributesBuilder attributes, RedisURI redisUri, Void ignored) {} +} diff --git a/instrumentation/lettuce/lettuce-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/lettuce/v5_0/LettuceConnectionDatabaseClientTracer.java b/instrumentation/lettuce/lettuce-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/lettuce/v5_0/LettuceConnectionDatabaseClientTracer.java deleted file mode 100644 index 207f21d80a..0000000000 --- a/instrumentation/lettuce/lettuce-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/lettuce/v5_0/LettuceConnectionDatabaseClientTracer.java +++ /dev/null @@ -1,28 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * SPDX-License-Identifier: Apache-2.0 - */ - -package io.opentelemetry.javaagent.instrumentation.lettuce.v5_0; - -import io.lettuce.core.RedisURI; - -public class LettuceConnectionDatabaseClientTracer - extends LettuceAbstractDatabaseClientTracer { - private static final LettuceConnectionDatabaseClientTracer TRACER = - new LettuceConnectionDatabaseClientTracer(); - - public static LettuceConnectionDatabaseClientTracer tracer() { - return TRACER; - } - - @Override - protected String sanitizeStatement(String command) { - return command; - } - - @Override - protected String spanName(RedisURI connection, String command, String ignored) { - return command; - } -} diff --git a/instrumentation/lettuce/lettuce-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/lettuce/v5_0/LettuceDatabaseClientTracer.java b/instrumentation/lettuce/lettuce-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/lettuce/v5_0/LettuceDatabaseClientTracer.java deleted file mode 100644 index 3daab49ec7..0000000000 --- a/instrumentation/lettuce/lettuce-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/lettuce/v5_0/LettuceDatabaseClientTracer.java +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * SPDX-License-Identifier: Apache-2.0 - */ - -package io.opentelemetry.javaagent.instrumentation.lettuce.v5_0; - -import io.lettuce.core.RedisURI; -import io.lettuce.core.protocol.RedisCommand; -import io.opentelemetry.instrumentation.api.db.RedisCommandSanitizer; -import io.opentelemetry.instrumentation.lettuce.common.LettuceArgSplitter; -import java.util.Collections; -import java.util.List; - -public class LettuceDatabaseClientTracer - extends LettuceAbstractDatabaseClientTracer> { - private static final LettuceDatabaseClientTracer TRACER = new LettuceDatabaseClientTracer(); - - public static LettuceDatabaseClientTracer tracer() { - return TRACER; - } - - @Override - protected String sanitizeStatement(RedisCommand redisCommand) { - String command = LettuceInstrumentationUtil.getCommandName(redisCommand); - List args = - redisCommand.getArgs() == null - ? Collections.emptyList() - : LettuceArgSplitter.splitArgs(redisCommand.getArgs().toCommandString()); - return RedisCommandSanitizer.sanitize(command, args); - } - - @Override - protected String spanName( - RedisURI connection, RedisCommand command, String sanitizedStatement) { - return LettuceInstrumentationUtil.getCommandName(command); - } -} diff --git a/instrumentation/lettuce/lettuce-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/lettuce/v5_0/LettuceDbAttributesExtractor.java b/instrumentation/lettuce/lettuce-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/lettuce/v5_0/LettuceDbAttributesExtractor.java new file mode 100644 index 0000000000..519ff8d38b --- /dev/null +++ b/instrumentation/lettuce/lettuce-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/lettuce/v5_0/LettuceDbAttributesExtractor.java @@ -0,0 +1,56 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.instrumentation.lettuce.v5_0; + +import io.lettuce.core.protocol.RedisCommand; +import io.opentelemetry.instrumentation.api.db.RedisCommandSanitizer; +import io.opentelemetry.instrumentation.api.instrumenter.db.DbAttributesExtractor; +import io.opentelemetry.instrumentation.lettuce.common.LettuceArgSplitter; +import io.opentelemetry.semconv.trace.attributes.SemanticAttributes; +import java.util.Collections; +import java.util.List; +import org.checkerframework.checker.nullness.qual.Nullable; + +final class LettuceDbAttributesExtractor + extends DbAttributesExtractor, Void> { + @Override + protected String system(RedisCommand request) { + return SemanticAttributes.DbSystemValues.REDIS; + } + + @Override + @Nullable + protected String user(RedisCommand request) { + return null; + } + + @Override + @Nullable + protected String name(RedisCommand request) { + return null; + } + + @Override + @Nullable + protected String connectionString(RedisCommand request) { + return null; + } + + @Override + protected String statement(RedisCommand request) { + String command = LettuceInstrumentationUtil.getCommandName(request); + List args = + request.getArgs() == null + ? Collections.emptyList() + : LettuceArgSplitter.splitArgs(request.getArgs().toCommandString()); + return RedisCommandSanitizer.sanitize(command, args); + } + + @Override + protected String operation(RedisCommand request) { + return request.getType().name(); + } +} diff --git a/instrumentation/lettuce/lettuce-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/lettuce/v5_0/LettuceInstrumenters.java b/instrumentation/lettuce/lettuce-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/lettuce/v5_0/LettuceInstrumenters.java new file mode 100644 index 0000000000..28c9b38ba9 --- /dev/null +++ b/instrumentation/lettuce/lettuce-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/lettuce/v5_0/LettuceInstrumenters.java @@ -0,0 +1,56 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.instrumentation.lettuce.v5_0; + +import io.lettuce.core.RedisURI; +import io.lettuce.core.protocol.RedisCommand; +import io.opentelemetry.api.GlobalOpenTelemetry; +import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter; +import io.opentelemetry.instrumentation.api.instrumenter.SpanKindExtractor; +import io.opentelemetry.instrumentation.api.instrumenter.SpanNameExtractor; +import io.opentelemetry.instrumentation.api.instrumenter.db.DbAttributesExtractor; +import io.opentelemetry.instrumentation.api.instrumenter.db.DbSpanNameExtractor; +import io.opentelemetry.javaagent.instrumentation.api.instrumenter.PeerServiceAttributesExtractor; + +public final class LettuceInstrumenters { + private static final String INSTRUMENTATION_NAME = "io.opentelemetry.javaagent.jedis-5.0"; + + private static final Instrumenter, Void> INSTRUMENTER; + + private static final Instrumenter CONNECT_INSTRUMENTER; + + static { + DbAttributesExtractor, Void> attributesExtractor = + new LettuceDbAttributesExtractor(); + SpanNameExtractor> spanName = + DbSpanNameExtractor.create(attributesExtractor); + + INSTRUMENTER = + Instrumenter., Void>newBuilder( + GlobalOpenTelemetry.get(), INSTRUMENTATION_NAME, spanName) + .addAttributesExtractor(attributesExtractor) + .newInstrumenter(SpanKindExtractor.alwaysClient()); + + LettuceNetAttributesExtractor netAttributesExtractor = new LettuceNetAttributesExtractor(); + CONNECT_INSTRUMENTER = + Instrumenter.newBuilder( + GlobalOpenTelemetry.get(), INSTRUMENTATION_NAME, redisUri -> "CONNECT") + .addAttributesExtractor(netAttributesExtractor) + .addAttributesExtractor(PeerServiceAttributesExtractor.create(netAttributesExtractor)) + .addAttributesExtractor(new LettuceConnectAttributesExtractor()) + .newInstrumenter(SpanKindExtractor.alwaysClient()); + } + + public static Instrumenter, Void> instrumenter() { + return INSTRUMENTER; + } + + public static Instrumenter connectInstrumenter() { + return CONNECT_INSTRUMENTER; + } + + private LettuceInstrumenters() {} +} diff --git a/instrumentation/lettuce/lettuce-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/lettuce/v5_0/LettuceNetAttributesExtractor.java b/instrumentation/lettuce/lettuce-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/lettuce/v5_0/LettuceNetAttributesExtractor.java new file mode 100644 index 0000000000..ccaab6f8f8 --- /dev/null +++ b/instrumentation/lettuce/lettuce-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/lettuce/v5_0/LettuceNetAttributesExtractor.java @@ -0,0 +1,35 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.instrumentation.lettuce.v5_0; + +import io.lettuce.core.RedisURI; +import io.opentelemetry.instrumentation.api.instrumenter.net.NetAttributesExtractor; +import org.checkerframework.checker.nullness.qual.Nullable; + +final class LettuceNetAttributesExtractor extends NetAttributesExtractor { + + @Override + @Nullable + public String transport(RedisURI redisUri) { + return null; + } + + @Override + public String peerName(RedisURI redisUri, @Nullable Void ignored) { + return redisUri.getHost(); + } + + @Override + public Integer peerPort(RedisURI redisUri, @Nullable Void ignored) { + return redisUri.getPort(); + } + + @Override + @Nullable + public String peerIp(RedisURI redisUri, @Nullable Void ignored) { + return null; + } +} diff --git a/instrumentation/lettuce/lettuce-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/lettuce/v5_0/rx/LettuceFluxTerminationRunnable.java b/instrumentation/lettuce/lettuce-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/lettuce/v5_0/rx/LettuceFluxTerminationRunnable.java index 9a3a6bba41..7c4142031f 100644 --- a/instrumentation/lettuce/lettuce-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/lettuce/v5_0/rx/LettuceFluxTerminationRunnable.java +++ b/instrumentation/lettuce/lettuce-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/lettuce/v5_0/rx/LettuceFluxTerminationRunnable.java @@ -5,7 +5,7 @@ package io.opentelemetry.javaagent.instrumentation.lettuce.v5_0.rx; -import static io.opentelemetry.javaagent.instrumentation.lettuce.v5_0.LettuceDatabaseClientTracer.tracer; +import static io.opentelemetry.javaagent.instrumentation.lettuce.v5_0.LettuceInstrumenters.instrumenter; import io.lettuce.core.protocol.RedisCommand; import io.opentelemetry.api.trace.Span; @@ -45,11 +45,7 @@ public class LettuceFluxTerminationRunnable implements Consumer>, Runn span.setAttribute("lettuce.command.cancelled", true); } } - if (throwable == null) { - tracer().end(context); - } else { - tracer().endExceptionally(context, throwable); - } + instrumenter().end(context, onSubscribeConsumer.command, null, throwable); } else { LoggerFactory.getLogger(Flux.class) .error( @@ -90,9 +86,9 @@ public class LettuceFluxTerminationRunnable implements Consumer>, Runn @Override public void accept(Subscription subscription) { - owner.context = tracer().startSpan(Context.current(), null, command); + owner.context = instrumenter().start(Context.current(), command); if (!expectsResponse) { - tracer().end(owner.context); + instrumenter().end(owner.context, command, null, null); } } } diff --git a/instrumentation/lettuce/lettuce-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/lettuce/v5_0/rx/LettuceMonoDualConsumer.java b/instrumentation/lettuce/lettuce-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/lettuce/v5_0/rx/LettuceMonoDualConsumer.java index c030af68b0..5820f483bd 100644 --- a/instrumentation/lettuce/lettuce-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/lettuce/v5_0/rx/LettuceMonoDualConsumer.java +++ b/instrumentation/lettuce/lettuce-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/lettuce/v5_0/rx/LettuceMonoDualConsumer.java @@ -5,7 +5,7 @@ package io.opentelemetry.javaagent.instrumentation.lettuce.v5_0.rx; -import static io.opentelemetry.javaagent.instrumentation.lettuce.v5_0.LettuceDatabaseClientTracer.tracer; +import static io.opentelemetry.javaagent.instrumentation.lettuce.v5_0.LettuceInstrumenters.instrumenter; import io.lettuce.core.protocol.RedisCommand; import io.opentelemetry.context.Context; @@ -27,20 +27,16 @@ public class LettuceMonoDualConsumer implements Consumer, BiConsumer 100 } } } @@ -215,6 +220,7 @@ class LettuceReactiveClientTest extends AgentInstrumentationSpecification { attributes { "$SemanticAttributes.DB_SYSTEM.key" "redis" "$SemanticAttributes.DB_STATEMENT.key" "COMMAND" + "$SemanticAttributes.DB_OPERATION.key" "COMMAND" "lettuce.command.cancelled" true "lettuce.command.results.count" 2 } @@ -245,6 +251,7 @@ class LettuceReactiveClientTest extends AgentInstrumentationSpecification { attributes { "$SemanticAttributes.DB_SYSTEM.key" "redis" "$SemanticAttributes.DB_STATEMENT.key" "DEBUG SEGFAULT" + "$SemanticAttributes.DB_OPERATION.key" "DEBUG" } } } @@ -264,6 +271,7 @@ class LettuceReactiveClientTest extends AgentInstrumentationSpecification { attributes { "$SemanticAttributes.DB_SYSTEM.key" "redis" "$SemanticAttributes.DB_STATEMENT.key" "SHUTDOWN NOSAVE" + "$SemanticAttributes.DB_OPERATION.key" "SHUTDOWN" } } } @@ -293,6 +301,7 @@ class LettuceReactiveClientTest extends AgentInstrumentationSpecification { attributes { "$SemanticAttributes.DB_SYSTEM.key" "redis" "$SemanticAttributes.DB_STATEMENT.key" "SET a ?" + "$SemanticAttributes.DB_OPERATION.key" "SET" } } span(2) { @@ -302,6 +311,7 @@ class LettuceReactiveClientTest extends AgentInstrumentationSpecification { attributes { "$SemanticAttributes.DB_SYSTEM.key" "redis" "$SemanticAttributes.DB_STATEMENT.key" "GET a" + "$SemanticAttributes.DB_OPERATION.key" "GET" } } } @@ -331,6 +341,7 @@ class LettuceReactiveClientTest extends AgentInstrumentationSpecification { attributes { "$SemanticAttributes.DB_SYSTEM.key" "redis" "$SemanticAttributes.DB_STATEMENT.key" "SET a ?" + "$SemanticAttributes.DB_OPERATION.key" "SET" } } span(2) { @@ -340,6 +351,7 @@ class LettuceReactiveClientTest extends AgentInstrumentationSpecification { attributes { "$SemanticAttributes.DB_SYSTEM.key" "redis" "$SemanticAttributes.DB_STATEMENT.key" "GET a" + "$SemanticAttributes.DB_OPERATION.key" "GET" } } } @@ -370,6 +382,7 @@ class LettuceReactiveClientTest extends AgentInstrumentationSpecification { attributes { "$SemanticAttributes.DB_SYSTEM.key" "redis" "$SemanticAttributes.DB_STATEMENT.key" "SET a ?" + "$SemanticAttributes.DB_OPERATION.key" "SET" } } span(2) { @@ -379,6 +392,7 @@ class LettuceReactiveClientTest extends AgentInstrumentationSpecification { attributes { "$SemanticAttributes.DB_SYSTEM.key" "redis" "$SemanticAttributes.DB_STATEMENT.key" "GET a" + "$SemanticAttributes.DB_OPERATION.key" "GET" } } } diff --git a/instrumentation/lettuce/lettuce-5.0/javaagent/src/test/groovy/LettuceSyncClientTest.groovy b/instrumentation/lettuce/lettuce-5.0/javaagent/src/test/groovy/LettuceSyncClientTest.groovy index 649b83094c..eb5b6b5057 100644 --- a/instrumentation/lettuce/lettuce-5.0/javaagent/src/test/groovy/LettuceSyncClientTest.groovy +++ b/instrumentation/lettuce/lettuce-5.0/javaagent/src/test/groovy/LettuceSyncClientTest.groovy @@ -97,10 +97,8 @@ class LettuceSyncClientTest extends AgentInstrumentationSpecification { kind CLIENT attributes { "$SemanticAttributes.NET_PEER_NAME.key" PEER_NAME - "$SemanticAttributes.NET_PEER_IP.key" PEER_IP "$SemanticAttributes.NET_PEER_PORT.key" port "$SemanticAttributes.DB_SYSTEM.key" "redis" - "$SemanticAttributes.DB_STATEMENT.key" "CONNECT" } } } @@ -129,10 +127,8 @@ class LettuceSyncClientTest extends AgentInstrumentationSpecification { errorEvent AbstractChannel.AnnotatedConnectException, String attributes { "$SemanticAttributes.NET_PEER_NAME.key" PEER_NAME - "$SemanticAttributes.NET_PEER_IP.key" PEER_IP "$SemanticAttributes.NET_PEER_PORT.key" incorrectPort "$SemanticAttributes.DB_SYSTEM.key" "redis" - "$SemanticAttributes.DB_STATEMENT.key" "CONNECT" } } } @@ -153,6 +149,7 @@ class LettuceSyncClientTest extends AgentInstrumentationSpecification { attributes { "$SemanticAttributes.DB_SYSTEM.key" "redis" "$SemanticAttributes.DB_STATEMENT.key" "SET TESTSETKEY ?" + "$SemanticAttributes.DB_OPERATION.key" "SET" } } } @@ -173,6 +170,7 @@ class LettuceSyncClientTest extends AgentInstrumentationSpecification { attributes { "$SemanticAttributes.DB_SYSTEM.key" "redis" "$SemanticAttributes.DB_STATEMENT.key" "GET TESTKEY" + "$SemanticAttributes.DB_OPERATION.key" "GET" } } } @@ -193,6 +191,7 @@ class LettuceSyncClientTest extends AgentInstrumentationSpecification { attributes { "$SemanticAttributes.DB_SYSTEM.key" "redis" "$SemanticAttributes.DB_STATEMENT.key" "GET NON_EXISTENT_KEY" + "$SemanticAttributes.DB_OPERATION.key" "GET" } } } @@ -213,6 +212,7 @@ class LettuceSyncClientTest extends AgentInstrumentationSpecification { attributes { "$SemanticAttributes.DB_SYSTEM.key" "redis" "$SemanticAttributes.DB_STATEMENT.key" "RANDOMKEY" + "$SemanticAttributes.DB_OPERATION.key" "RANDOMKEY" } } } @@ -233,6 +233,7 @@ class LettuceSyncClientTest extends AgentInstrumentationSpecification { attributes { "$SemanticAttributes.DB_SYSTEM.key" "redis" "$SemanticAttributes.DB_STATEMENT.key" "LPUSH TESTLIST ?" + "$SemanticAttributes.DB_OPERATION.key" "LPUSH" } } } @@ -253,6 +254,7 @@ class LettuceSyncClientTest extends AgentInstrumentationSpecification { attributes { "$SemanticAttributes.DB_SYSTEM.key" "redis" "$SemanticAttributes.DB_STATEMENT.key" "HMSET user firstname ? lastname ? age ?" + "$SemanticAttributes.DB_OPERATION.key" "HMSET" } } } @@ -273,6 +275,7 @@ class LettuceSyncClientTest extends AgentInstrumentationSpecification { attributes { "$SemanticAttributes.DB_SYSTEM.key" "redis" "$SemanticAttributes.DB_STATEMENT.key" "HGETALL TESTHM" + "$SemanticAttributes.DB_OPERATION.key" "HGETALL" } } } @@ -292,6 +295,7 @@ class LettuceSyncClientTest extends AgentInstrumentationSpecification { attributes { "$SemanticAttributes.DB_SYSTEM.key" "redis" "$SemanticAttributes.DB_STATEMENT.key" "DEBUG SEGFAULT" + "$SemanticAttributes.DB_OPERATION.key" "DEBUG" } } } @@ -311,6 +315,7 @@ class LettuceSyncClientTest extends AgentInstrumentationSpecification { attributes { "$SemanticAttributes.DB_SYSTEM.key" "redis" "$SemanticAttributes.DB_STATEMENT.key" "SHUTDOWN NOSAVE" + "$SemanticAttributes.DB_OPERATION.key" "SHUTDOWN" } } }