From 120937d175b138bc021bf5b29a56b4d17b2775eb Mon Sep 17 00:00:00 2001 From: Trask Stalnaker Date: Sat, 19 Oct 2019 11:57:40 -0700 Subject: [PATCH] Update google-http-client to new agent api --- .../GoogleHttpClientInstrumentation.java | 59 ++++++------------- .../HeadersInjectAdapter.java | 14 +++++ .../googlehttpclient/RequestState.java | 4 +- 3 files changed, 34 insertions(+), 43 deletions(-) create mode 100644 dd-java-agent/instrumentation/google-http-client/src/main/java/datadog/trace/instrumentation/googlehttpclient/HeadersInjectAdapter.java diff --git a/dd-java-agent/instrumentation/google-http-client/src/main/java/datadog/trace/instrumentation/googlehttpclient/GoogleHttpClientInstrumentation.java b/dd-java-agent/instrumentation/google-http-client/src/main/java/datadog/trace/instrumentation/googlehttpclient/GoogleHttpClientInstrumentation.java index d587ab0aba..f3a0193d49 100644 --- a/dd-java-agent/instrumentation/google-http-client/src/main/java/datadog/trace/instrumentation/googlehttpclient/GoogleHttpClientInstrumentation.java +++ b/dd-java-agent/instrumentation/google-http-client/src/main/java/datadog/trace/instrumentation/googlehttpclient/GoogleHttpClientInstrumentation.java @@ -1,7 +1,10 @@ package datadog.trace.instrumentation.googlehttpclient; +import static datadog.trace.instrumentation.api.AgentTracer.activateSpan; +import static datadog.trace.instrumentation.api.AgentTracer.propagate; +import static datadog.trace.instrumentation.api.AgentTracer.startSpan; import static datadog.trace.instrumentation.googlehttpclient.GoogleHttpClientDecorator.DECORATE; -import static java.util.Collections.singletonMap; +import static datadog.trace.instrumentation.googlehttpclient.HeadersInjectAdapter.SETTER; import static net.bytebuddy.matcher.ElementMatchers.isMethod; import static net.bytebuddy.matcher.ElementMatchers.isPublic; import static net.bytebuddy.matcher.ElementMatchers.named; @@ -14,16 +17,10 @@ import com.google.auto.service.AutoService; import datadog.trace.agent.tooling.Instrumenter; import datadog.trace.bootstrap.ContextStore; import datadog.trace.bootstrap.InstrumentationContext; -import io.opentracing.Scope; -import io.opentracing.Span; -import io.opentracing.log.Fields; -import io.opentracing.propagation.Format; -import io.opentracing.propagation.TextMap; -import io.opentracing.tag.Tags; -import io.opentracing.util.GlobalTracer; +import datadog.trace.instrumentation.api.AgentScope; +import datadog.trace.instrumentation.api.AgentSpan; import java.util.Collections; import java.util.HashMap; -import java.util.Iterator; import java.util.Map; import net.bytebuddy.asm.Advice; import net.bytebuddy.description.method.MethodDescription; @@ -58,7 +55,7 @@ public class GoogleHttpClientInstrumentation extends Instrumenter.Default { packageName + ".RequestState", getClass().getName() + "$GoogleHttpClientAdvice", getClass().getName() + "$GoogleHttpClientAsyncAdvice", - getClass().getName() + "$HeadersInjectAdapter" + packageName + ".HeadersInjectAdapter" }; } @@ -90,17 +87,16 @@ public class GoogleHttpClientInstrumentation extends Instrumenter.Default { RequestState state = contextStore.get(request); if (state == null) { - state = new RequestState(GlobalTracer.get().buildSpan("http.request").start()); + state = new RequestState(startSpan("http.request")); contextStore.put(request, state); } - final Span span = state.getSpan(); + final AgentSpan span = state.getSpan(); - try (final Scope scope = GlobalTracer.get().scopeManager().activate(span, false)) { + try (final AgentScope scope = activateSpan(span, false)) { DECORATE.afterStart(span); DECORATE.onRequest(span, request); - GlobalTracer.get() - .inject(span.context(), Format.Builtin.HTTP_HEADERS, new HeadersInjectAdapter(request)); + propagate().inject(span, request, SETTER); } } @@ -115,17 +111,17 @@ public class GoogleHttpClientInstrumentation extends Instrumenter.Default { final RequestState state = contextStore.get(request); if (state != null) { - final Span span = state.getSpan(); + final AgentSpan span = state.getSpan(); - try (final Scope scope = GlobalTracer.get().scopeManager().activate(span, false)) { + try (final AgentScope scope = activateSpan(span, false)) { DECORATE.onResponse(span, response); DECORATE.onError(span, throwable); // If HttpRequest.setThrowExceptionOnExecuteError is set to false, there are no exceptions // for a failed request. Thus, check the response code if (response != null && !response.isSuccessStatusCode()) { - Tags.ERROR.set(span, true); - span.log(singletonMap(Fields.MESSAGE, response.getStatusMessage())); + span.setError(true); + span.setErrorMessage(response.getStatusMessage()); } DECORATE.beforeFinish(span); @@ -139,7 +135,7 @@ public class GoogleHttpClientInstrumentation extends Instrumenter.Default { @Advice.OnMethodEnter(suppress = Throwable.class) public static void methodEnter(@Advice.This final HttpRequest request) { - final Span span = GlobalTracer.get().buildSpan("http.request").start(); + final AgentSpan span = startSpan("http.request"); final ContextStore contextStore = InstrumentationContext.get(HttpRequest.class, RequestState.class); @@ -159,9 +155,9 @@ public class GoogleHttpClientInstrumentation extends Instrumenter.Default { final RequestState state = contextStore.get(request); if (state != null) { - final Span span = state.getSpan(); + final AgentSpan span = state.getSpan(); - try (final Scope scope = GlobalTracer.get().scopeManager().activate(span, false)) { + try (final AgentScope scope = activateSpan(span, false)) { DECORATE.onError(span, throwable); DECORATE.beforeFinish(span); @@ -171,23 +167,4 @@ public class GoogleHttpClientInstrumentation extends Instrumenter.Default { } } } - - public static class HeadersInjectAdapter implements TextMap { - private final HttpRequest request; - - public HeadersInjectAdapter(final HttpRequest request) { - this.request = request; - } - - @Override - public Iterator> iterator() { - throw new UnsupportedOperationException( - "This class should be used only with tracer#inject()"); - } - - @Override - public void put(final String key, final String value) { - request.getHeaders().put(key, value); - } - } } diff --git a/dd-java-agent/instrumentation/google-http-client/src/main/java/datadog/trace/instrumentation/googlehttpclient/HeadersInjectAdapter.java b/dd-java-agent/instrumentation/google-http-client/src/main/java/datadog/trace/instrumentation/googlehttpclient/HeadersInjectAdapter.java new file mode 100644 index 0000000000..81cdc497e5 --- /dev/null +++ b/dd-java-agent/instrumentation/google-http-client/src/main/java/datadog/trace/instrumentation/googlehttpclient/HeadersInjectAdapter.java @@ -0,0 +1,14 @@ +package datadog.trace.instrumentation.googlehttpclient; + +import com.google.api.client.http.HttpRequest; +import datadog.trace.instrumentation.api.AgentPropagation; + +public class HeadersInjectAdapter implements AgentPropagation.Setter { + + public static final HeadersInjectAdapter SETTER = new HeadersInjectAdapter(); + + @Override + public void set(final HttpRequest carrier, final String key, final String value) { + carrier.getHeaders().put(key, value); + } +} diff --git a/dd-java-agent/instrumentation/google-http-client/src/main/java/datadog/trace/instrumentation/googlehttpclient/RequestState.java b/dd-java-agent/instrumentation/google-http-client/src/main/java/datadog/trace/instrumentation/googlehttpclient/RequestState.java index 8e52df3b72..caf6b1b8e7 100644 --- a/dd-java-agent/instrumentation/google-http-client/src/main/java/datadog/trace/instrumentation/googlehttpclient/RequestState.java +++ b/dd-java-agent/instrumentation/google-http-client/src/main/java/datadog/trace/instrumentation/googlehttpclient/RequestState.java @@ -1,10 +1,10 @@ package datadog.trace.instrumentation.googlehttpclient; -import io.opentracing.Span; +import datadog.trace.instrumentation.api.AgentSpan; import lombok.Data; import lombok.NonNull; @Data public class RequestState { - @NonNull public Span span; + @NonNull public AgentSpan span; }