Migrate Netty 3.8 CONNECT instrumentation to Instrumenter API (#4492)
* Migrate Netty 3.8 CONNECT instrumentation to Instrumenter API * Move shouldStart()
This commit is contained in:
parent
a4947bc3dc
commit
e9ba87d6b3
|
@ -7,7 +7,6 @@ package io.opentelemetry.javaagent.instrumentation.netty.v3_8;
|
|||
|
||||
import static io.opentelemetry.javaagent.extension.matcher.AgentElementMatchers.hasClassesNamed;
|
||||
import static io.opentelemetry.javaagent.extension.matcher.AgentElementMatchers.implementsInterface;
|
||||
import static io.opentelemetry.javaagent.instrumentation.netty.v3_8.client.NettyHttpClientTracer.tracer;
|
||||
import static net.bytebuddy.matcher.ElementMatchers.isMethod;
|
||||
import static net.bytebuddy.matcher.ElementMatchers.named;
|
||||
import static net.bytebuddy.matcher.ElementMatchers.takesArgument;
|
||||
|
@ -70,11 +69,7 @@ public class ChannelFutureListenerInstrumentation implements TypeInstrumentation
|
|||
if (parentContext == null) {
|
||||
return null;
|
||||
}
|
||||
Scope parentScope = parentContext.makeCurrent();
|
||||
if (connectionContext.createConnectionSpan()) {
|
||||
tracer().connectionFailure(parentContext, future.getChannel(), cause);
|
||||
}
|
||||
return parentScope;
|
||||
return parentContext.makeCurrent();
|
||||
}
|
||||
|
||||
@Advice.OnMethodExit(onThrowable = Throwable.class, suppress = Throwable.class)
|
||||
|
|
|
@ -7,9 +7,11 @@ package io.opentelemetry.javaagent.instrumentation.netty.v3_8;
|
|||
|
||||
import static io.opentelemetry.javaagent.extension.matcher.AgentElementMatchers.hasClassesNamed;
|
||||
import static io.opentelemetry.javaagent.extension.matcher.AgentElementMatchers.implementsInterface;
|
||||
import static io.opentelemetry.javaagent.instrumentation.netty.v3_8.client.NettyClientSingletons.connectInstrumenter;
|
||||
import static net.bytebuddy.matcher.ElementMatchers.isMethod;
|
||||
import static net.bytebuddy.matcher.ElementMatchers.named;
|
||||
import static net.bytebuddy.matcher.ElementMatchers.returns;
|
||||
import static net.bytebuddy.matcher.ElementMatchers.takesArgument;
|
||||
|
||||
import io.opentelemetry.api.trace.Span;
|
||||
import io.opentelemetry.context.Context;
|
||||
|
@ -17,10 +19,14 @@ import io.opentelemetry.instrumentation.api.field.VirtualField;
|
|||
import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation;
|
||||
import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer;
|
||||
import io.opentelemetry.javaagent.instrumentation.api.Java8BytecodeBridge;
|
||||
import io.opentelemetry.javaagent.instrumentation.netty.common.NettyConnectRequest;
|
||||
import io.opentelemetry.javaagent.instrumentation.netty.v3_8.client.ConnectionListener;
|
||||
import java.net.SocketAddress;
|
||||
import net.bytebuddy.asm.Advice;
|
||||
import net.bytebuddy.description.type.TypeDescription;
|
||||
import net.bytebuddy.matcher.ElementMatcher;
|
||||
import org.jboss.netty.channel.Channel;
|
||||
import org.jboss.netty.channel.ChannelFuture;
|
||||
|
||||
public class NettyChannelInstrumentation implements TypeInstrumentation {
|
||||
|
||||
|
@ -39,6 +45,7 @@ public class NettyChannelInstrumentation implements TypeInstrumentation {
|
|||
transformer.applyAdviceToMethod(
|
||||
isMethod()
|
||||
.and(named("connect"))
|
||||
.and(takesArgument(0, SocketAddress.class))
|
||||
.and(returns(named("org.jboss.netty.channel.ChannelFuture"))),
|
||||
NettyChannelInstrumentation.class.getName() + "$ChannelConnectAdvice");
|
||||
}
|
||||
|
@ -46,10 +53,15 @@ public class NettyChannelInstrumentation implements TypeInstrumentation {
|
|||
@SuppressWarnings("unused")
|
||||
public static class ChannelConnectAdvice {
|
||||
|
||||
@Advice.OnMethodEnter
|
||||
public static void onEnter(@Advice.This Channel channel) {
|
||||
Context context = Java8BytecodeBridge.currentContext();
|
||||
Span span = Java8BytecodeBridge.spanFromContext(context);
|
||||
@Advice.OnMethodEnter(suppress = Throwable.class)
|
||||
public static void onEnter(
|
||||
@Advice.This Channel channel,
|
||||
@Advice.Argument(0) SocketAddress remoteAddress,
|
||||
@Advice.Local("otelParentContext") Context parentContext,
|
||||
@Advice.Local("otelRequest") NettyConnectRequest request) {
|
||||
|
||||
parentContext = Java8BytecodeBridge.currentContext();
|
||||
Span span = Java8BytecodeBridge.spanFromContext(parentContext);
|
||||
if (!span.getSpanContext().isValid()) {
|
||||
return;
|
||||
}
|
||||
|
@ -59,7 +71,30 @@ public class NettyChannelInstrumentation implements TypeInstrumentation {
|
|||
if (virtualField.get(channel) != null) {
|
||||
return;
|
||||
}
|
||||
virtualField.set(channel, new NettyConnectionContext(context));
|
||||
virtualField.set(channel, new NettyConnectionContext(parentContext));
|
||||
|
||||
request = NettyConnectRequest.create(remoteAddress);
|
||||
}
|
||||
|
||||
@Advice.OnMethodExit(suppress = Throwable.class, onThrowable = Throwable.class)
|
||||
public static void onExit(
|
||||
@Advice.Return ChannelFuture channelFuture,
|
||||
@Advice.Thrown Throwable error,
|
||||
@Advice.Local("otelParentContext") Context parentContext,
|
||||
@Advice.Local("otelRequest") NettyConnectRequest request) {
|
||||
|
||||
if (request == null) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (error != null) {
|
||||
if (connectInstrumenter().shouldStart(parentContext, request)) {
|
||||
Context context = connectInstrumenter().start(parentContext, request);
|
||||
connectInstrumenter().end(context, request, null, error);
|
||||
}
|
||||
} else {
|
||||
channelFuture.addListener(new ConnectionListener(parentContext, request));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -10,7 +10,6 @@ import javax.annotation.Nullable;
|
|||
|
||||
public class NettyConnectionContext {
|
||||
private Context connectionContext;
|
||||
private boolean connectionSpanCreated;
|
||||
|
||||
public NettyConnectionContext(Context connectionContext) {
|
||||
this.connectionContext = connectionContext;
|
||||
|
@ -27,12 +26,4 @@ public class NettyConnectionContext {
|
|||
connectionContext = null;
|
||||
return context;
|
||||
}
|
||||
|
||||
public boolean createConnectionSpan() {
|
||||
if (connectionSpanCreated) {
|
||||
return false;
|
||||
}
|
||||
connectionSpanCreated = true;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -0,0 +1,33 @@
|
|||
/*
|
||||
* Copyright The OpenTelemetry Authors
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*/
|
||||
|
||||
package io.opentelemetry.javaagent.instrumentation.netty.v3_8.client;
|
||||
|
||||
import static io.opentelemetry.javaagent.instrumentation.netty.v3_8.client.NettyClientSingletons.connectInstrumenter;
|
||||
|
||||
import io.opentelemetry.context.Context;
|
||||
import io.opentelemetry.javaagent.instrumentation.netty.common.NettyConnectRequest;
|
||||
import org.jboss.netty.channel.ChannelFuture;
|
||||
import org.jboss.netty.channel.ChannelFutureListener;
|
||||
|
||||
public final class ConnectionListener implements ChannelFutureListener {
|
||||
|
||||
private final Context parentContext;
|
||||
private final NettyConnectRequest request;
|
||||
|
||||
public ConnectionListener(Context parentContext, NettyConnectRequest request) {
|
||||
this.parentContext = parentContext;
|
||||
this.request = request;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void operationComplete(ChannelFuture future) {
|
||||
Throwable cause = future.getCause();
|
||||
if (cause != null && connectInstrumenter().shouldStart(parentContext, request)) {
|
||||
Context context = connectInstrumenter().start(parentContext, request);
|
||||
connectInstrumenter().end(context, request, future.getChannel(), cause);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -8,16 +8,22 @@ package io.opentelemetry.javaagent.instrumentation.netty.v3_8.client;
|
|||
import io.opentelemetry.api.GlobalOpenTelemetry;
|
||||
import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter;
|
||||
import io.opentelemetry.instrumentation.api.instrumenter.PeerServiceAttributesExtractor;
|
||||
import io.opentelemetry.instrumentation.api.instrumenter.SpanKindExtractor;
|
||||
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpClientMetrics;
|
||||
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpSpanNameExtractor;
|
||||
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpSpanStatusExtractor;
|
||||
import io.opentelemetry.javaagent.instrumentation.netty.common.NettyConnectRequest;
|
||||
import io.opentelemetry.javaagent.instrumentation.netty.common.NettyErrorHolder;
|
||||
import io.opentelemetry.javaagent.instrumentation.netty.v3_8.HttpRequestAndChannel;
|
||||
import org.jboss.netty.channel.Channel;
|
||||
import org.jboss.netty.handler.codec.http.HttpResponse;
|
||||
|
||||
final class NettyClientSingletons {
|
||||
public final class NettyClientSingletons {
|
||||
|
||||
private static final String INSTRUMENTATION_NAME = "io.opentelemetry.netty-3.8";
|
||||
|
||||
private static final Instrumenter<HttpRequestAndChannel, HttpResponse> INSTRUMENTER;
|
||||
private static final Instrumenter<NettyConnectRequest, Channel> CONNECT_INSTRUMENTER;
|
||||
|
||||
static {
|
||||
NettyHttpClientAttributesExtractor httpClientAttributesExtractor =
|
||||
|
@ -28,7 +34,7 @@ final class NettyClientSingletons {
|
|||
INSTRUMENTER =
|
||||
Instrumenter.<HttpRequestAndChannel, HttpResponse>builder(
|
||||
GlobalOpenTelemetry.get(),
|
||||
"io.opentelemetry.netty-3.8",
|
||||
INSTRUMENTATION_NAME,
|
||||
HttpSpanNameExtractor.create(httpClientAttributesExtractor))
|
||||
.setSpanStatusExtractor(HttpSpanStatusExtractor.create(httpClientAttributesExtractor))
|
||||
.addAttributesExtractor(httpClientAttributesExtractor)
|
||||
|
@ -39,11 +45,28 @@ final class NettyClientSingletons {
|
|||
.addContextCustomizer(
|
||||
(context, requestAndChannel, startAttributes) -> NettyErrorHolder.init(context))
|
||||
.newClientInstrumenter(new HttpRequestHeadersSetter());
|
||||
|
||||
NettyConnectNetAttributesExtractor nettyConnectAttributesExtractor =
|
||||
new NettyConnectNetAttributesExtractor();
|
||||
CONNECT_INSTRUMENTER =
|
||||
Instrumenter.<NettyConnectRequest, Channel>builder(
|
||||
GlobalOpenTelemetry.get(), INSTRUMENTATION_NAME, rq -> "CONNECT")
|
||||
.addAttributesExtractor(nettyConnectAttributesExtractor)
|
||||
.addAttributesExtractor(
|
||||
PeerServiceAttributesExtractor.create(nettyConnectAttributesExtractor))
|
||||
.setTimeExtractors(
|
||||
request -> request.timer().startTime(),
|
||||
(request, channel, error) -> request.timer().now())
|
||||
.newInstrumenter(SpanKindExtractor.alwaysClient());
|
||||
}
|
||||
|
||||
public static Instrumenter<HttpRequestAndChannel, HttpResponse> instrumenter() {
|
||||
return INSTRUMENTER;
|
||||
}
|
||||
|
||||
public static Instrumenter<NettyConnectRequest, Channel> connectInstrumenter() {
|
||||
return CONNECT_INSTRUMENTER;
|
||||
}
|
||||
|
||||
private NettyClientSingletons() {}
|
||||
}
|
||||
|
|
|
@ -0,0 +1,43 @@
|
|||
/*
|
||||
* Copyright The OpenTelemetry Authors
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*/
|
||||
|
||||
package io.opentelemetry.javaagent.instrumentation.netty.v3_8.client;
|
||||
|
||||
import static io.opentelemetry.semconv.trace.attributes.SemanticAttributes.NetTransportValues.IP_TCP;
|
||||
import static io.opentelemetry.semconv.trace.attributes.SemanticAttributes.NetTransportValues.IP_UDP;
|
||||
|
||||
import io.opentelemetry.instrumentation.api.instrumenter.net.InetSocketAddressNetClientAttributesExtractor;
|
||||
import io.opentelemetry.javaagent.instrumentation.netty.common.NettyConnectRequest;
|
||||
import java.net.InetSocketAddress;
|
||||
import java.net.SocketAddress;
|
||||
import javax.annotation.Nullable;
|
||||
import org.jboss.netty.channel.Channel;
|
||||
import org.jboss.netty.channel.socket.DatagramChannel;
|
||||
|
||||
final class NettyConnectNetAttributesExtractor
|
||||
extends InetSocketAddressNetClientAttributesExtractor<NettyConnectRequest, Channel> {
|
||||
|
||||
@Nullable
|
||||
@Override
|
||||
public InetSocketAddress getAddress(NettyConnectRequest request, @Nullable Channel channel) {
|
||||
SocketAddress remoteAddress = null;
|
||||
if (channel != null) {
|
||||
remoteAddress = channel.getRemoteAddress();
|
||||
}
|
||||
// remote address on end() may be null when connection hasn't been established
|
||||
if (remoteAddress == null) {
|
||||
remoteAddress = request.remoteAddressOnStart();
|
||||
}
|
||||
if (remoteAddress instanceof InetSocketAddress) {
|
||||
return (InetSocketAddress) remoteAddress;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String transport(NettyConnectRequest request, @Nullable Channel channel) {
|
||||
return channel instanceof DatagramChannel ? IP_UDP : IP_TCP;
|
||||
}
|
||||
}
|
|
@ -1,43 +0,0 @@
|
|||
/*
|
||||
* Copyright The OpenTelemetry Authors
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*/
|
||||
|
||||
package io.opentelemetry.javaagent.instrumentation.netty.v3_8.client;
|
||||
|
||||
import static io.opentelemetry.api.trace.SpanKind.CLIENT;
|
||||
import static io.opentelemetry.semconv.trace.attributes.SemanticAttributes.NetTransportValues.IP_TCP;
|
||||
import static io.opentelemetry.semconv.trace.attributes.SemanticAttributes.NetTransportValues.IP_UDP;
|
||||
|
||||
import io.opentelemetry.api.trace.SpanBuilder;
|
||||
import io.opentelemetry.context.Context;
|
||||
import io.opentelemetry.instrumentation.api.tracer.BaseTracer;
|
||||
import io.opentelemetry.instrumentation.api.tracer.net.NetPeerAttributes;
|
||||
import io.opentelemetry.semconv.trace.attributes.SemanticAttributes;
|
||||
import java.net.InetSocketAddress;
|
||||
import org.jboss.netty.channel.Channel;
|
||||
import org.jboss.netty.channel.socket.DatagramChannel;
|
||||
|
||||
public class NettyHttpClientTracer extends BaseTracer {
|
||||
private static final NettyHttpClientTracer TRACER = new NettyHttpClientTracer();
|
||||
|
||||
public static NettyHttpClientTracer tracer() {
|
||||
return TRACER;
|
||||
}
|
||||
|
||||
public void connectionFailure(Context parentContext, Channel channel, Throwable throwable) {
|
||||
SpanBuilder spanBuilder = spanBuilder(parentContext, "CONNECT", CLIENT);
|
||||
spanBuilder.setAttribute(
|
||||
SemanticAttributes.NET_TRANSPORT, channel instanceof DatagramChannel ? IP_UDP : IP_TCP);
|
||||
NetPeerAttributes.INSTANCE.setNetPeer(
|
||||
spanBuilder, (InetSocketAddress) channel.getRemoteAddress());
|
||||
|
||||
Context context = withClientSpan(parentContext, spanBuilder.startSpan());
|
||||
tracer().endExceptionally(context, throwable);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected String getInstrumentationName() {
|
||||
return "io.opentelemetry.netty-3.8";
|
||||
}
|
||||
}
|
|
@ -10,6 +10,7 @@ import io.netty.channel.ChannelFuture;
|
|||
import io.netty.util.concurrent.Future;
|
||||
import io.netty.util.concurrent.GenericFutureListener;
|
||||
import io.opentelemetry.context.Context;
|
||||
import io.opentelemetry.javaagent.instrumentation.netty.common.NettyConnectRequest;
|
||||
|
||||
public class ConnectionCompleteListener implements GenericFutureListener<Future<Void>> {
|
||||
private final NettyConnectInstrumenter instrumenter;
|
||||
|
|
|
@ -15,6 +15,7 @@ import io.opentelemetry.instrumentation.api.instrumenter.http.HttpClientMetrics;
|
|||
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpSpanNameExtractor;
|
||||
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpSpanStatusExtractor;
|
||||
import io.opentelemetry.javaagent.instrumentation.netty.common.HttpRequestAndChannel;
|
||||
import io.opentelemetry.javaagent.instrumentation.netty.common.NettyConnectRequest;
|
||||
|
||||
public final class NettyClientInstrumenterFactory {
|
||||
|
||||
|
|
|
@ -7,6 +7,7 @@ package io.opentelemetry.javaagent.instrumentation.netty.common.client;
|
|||
|
||||
import io.netty.channel.Channel;
|
||||
import io.opentelemetry.context.Context;
|
||||
import io.opentelemetry.javaagent.instrumentation.netty.common.NettyConnectRequest;
|
||||
import javax.annotation.Nullable;
|
||||
|
||||
public interface NettyConnectInstrumenter {
|
||||
|
|
|
@ -8,6 +8,7 @@ package io.opentelemetry.javaagent.instrumentation.netty.common.client;
|
|||
import io.netty.channel.Channel;
|
||||
import io.opentelemetry.context.Context;
|
||||
import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter;
|
||||
import io.opentelemetry.javaagent.instrumentation.netty.common.NettyConnectRequest;
|
||||
import javax.annotation.Nullable;
|
||||
|
||||
final class NettyConnectInstrumenterImpl implements NettyConnectInstrumenter {
|
||||
|
|
|
@ -11,6 +11,7 @@ import static io.opentelemetry.semconv.trace.attributes.SemanticAttributes.NetTr
|
|||
import io.netty.channel.Channel;
|
||||
import io.netty.channel.socket.DatagramChannel;
|
||||
import io.opentelemetry.instrumentation.api.instrumenter.net.InetSocketAddressNetClientAttributesExtractor;
|
||||
import io.opentelemetry.javaagent.instrumentation.netty.common.NettyConnectRequest;
|
||||
import java.net.InetSocketAddress;
|
||||
import java.net.SocketAddress;
|
||||
import javax.annotation.Nullable;
|
||||
|
@ -35,7 +36,6 @@ final class NettyConnectNetAttributesExtractor
|
|||
return null;
|
||||
}
|
||||
|
||||
@Nullable
|
||||
@Override
|
||||
public String transport(NettyConnectRequest request, @Nullable Channel channel) {
|
||||
return channel instanceof DatagramChannel ? IP_UDP : IP_TCP;
|
||||
|
|
|
@ -8,6 +8,7 @@ package io.opentelemetry.javaagent.instrumentation.netty.common.client;
|
|||
import io.netty.channel.Channel;
|
||||
import io.opentelemetry.context.Context;
|
||||
import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter;
|
||||
import io.opentelemetry.javaagent.instrumentation.netty.common.NettyConnectRequest;
|
||||
import javax.annotation.Nullable;
|
||||
|
||||
final class NettyErrorOnlyConnectInstrumenter implements NettyConnectInstrumenter {
|
||||
|
|
|
@ -15,8 +15,8 @@ import io.opentelemetry.context.Scope;
|
|||
import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation;
|
||||
import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer;
|
||||
import io.opentelemetry.javaagent.instrumentation.api.Java8BytecodeBridge;
|
||||
import io.opentelemetry.javaagent.instrumentation.netty.common.NettyConnectRequest;
|
||||
import io.opentelemetry.javaagent.instrumentation.netty.common.client.ConnectionCompleteListener;
|
||||
import io.opentelemetry.javaagent.instrumentation.netty.common.client.NettyConnectRequest;
|
||||
import java.net.SocketAddress;
|
||||
import net.bytebuddy.asm.Advice;
|
||||
import net.bytebuddy.description.type.TypeDescription;
|
||||
|
|
|
@ -15,8 +15,8 @@ import io.opentelemetry.context.Scope;
|
|||
import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation;
|
||||
import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer;
|
||||
import io.opentelemetry.javaagent.instrumentation.api.Java8BytecodeBridge;
|
||||
import io.opentelemetry.javaagent.instrumentation.netty.common.NettyConnectRequest;
|
||||
import io.opentelemetry.javaagent.instrumentation.netty.common.client.ConnectionCompleteListener;
|
||||
import io.opentelemetry.javaagent.instrumentation.netty.common.client.NettyConnectRequest;
|
||||
import java.net.SocketAddress;
|
||||
import net.bytebuddy.asm.Advice;
|
||||
import net.bytebuddy.description.type.TypeDescription;
|
||||
|
|
|
@ -1,3 +1,8 @@
|
|||
plugins {
|
||||
id("otel.javaagent-instrumentation")
|
||||
}
|
||||
|
||||
dependencies {
|
||||
compileOnly("com.google.auto.value:auto-value-annotations")
|
||||
annotationProcessor("com.google.auto.value:auto-value")
|
||||
}
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
* SPDX-License-Identifier: Apache-2.0
|
||||
*/
|
||||
|
||||
package io.opentelemetry.javaagent.instrumentation.netty.common.client;
|
||||
package io.opentelemetry.javaagent.instrumentation.netty.common;
|
||||
|
||||
import com.google.auto.value.AutoValue;
|
||||
import java.net.SocketAddress;
|
||||
|
@ -16,8 +16,8 @@ public abstract class NettyConnectRequest {
|
|||
return new AutoValue_NettyConnectRequest(Timer.start(), remoteAddress);
|
||||
}
|
||||
|
||||
abstract Timer timer();
|
||||
public abstract Timer timer();
|
||||
|
||||
@Nullable
|
||||
abstract SocketAddress remoteAddressOnStart();
|
||||
public abstract SocketAddress remoteAddressOnStart();
|
||||
}
|
|
@ -3,13 +3,13 @@
|
|||
* SPDX-License-Identifier: Apache-2.0
|
||||
*/
|
||||
|
||||
package io.opentelemetry.javaagent.instrumentation.netty.common.client;
|
||||
package io.opentelemetry.javaagent.instrumentation.netty.common;
|
||||
|
||||
import java.time.Instant;
|
||||
|
||||
final class Timer {
|
||||
public final class Timer {
|
||||
|
||||
static Timer start() {
|
||||
public static Timer start() {
|
||||
return new Timer(Instant.now(), System.nanoTime());
|
||||
}
|
||||
|
||||
|
@ -21,11 +21,11 @@ final class Timer {
|
|||
this.startNanoTime = startNanoTime;
|
||||
}
|
||||
|
||||
Instant startTime() {
|
||||
public Instant startTime() {
|
||||
return startTime;
|
||||
}
|
||||
|
||||
Instant now() {
|
||||
public Instant now() {
|
||||
long durationNanos = System.nanoTime() - startNanoTime;
|
||||
return startTime().plusNanos(durationNanos);
|
||||
}
|
|
@ -9,7 +9,7 @@ import static io.opentelemetry.javaagent.instrumentation.reactornetty.v1_0.React
|
|||
|
||||
import io.netty.channel.Channel;
|
||||
import io.opentelemetry.context.Context;
|
||||
import io.opentelemetry.javaagent.instrumentation.netty.common.client.NettyConnectRequest;
|
||||
import io.opentelemetry.javaagent.instrumentation.netty.common.NettyConnectRequest;
|
||||
import reactor.core.publisher.Mono;
|
||||
|
||||
public class ConnectionWrapper {
|
||||
|
|
|
@ -15,7 +15,7 @@ import io.opentelemetry.context.Scope;
|
|||
import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation;
|
||||
import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer;
|
||||
import io.opentelemetry.javaagent.instrumentation.api.Java8BytecodeBridge;
|
||||
import io.opentelemetry.javaagent.instrumentation.netty.common.client.NettyConnectRequest;
|
||||
import io.opentelemetry.javaagent.instrumentation.netty.common.NettyConnectRequest;
|
||||
import java.net.SocketAddress;
|
||||
import net.bytebuddy.asm.Advice;
|
||||
import net.bytebuddy.description.type.TypeDescription;
|
||||
|
|
Loading…
Reference in New Issue