Update google-http-client to new agent api

This commit is contained in:
Trask Stalnaker 2019-10-19 11:57:40 -07:00
parent 9775a94132
commit 120937d175
3 changed files with 34 additions and 43 deletions

View File

@ -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<HttpRequest, RequestState> 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<Map.Entry<String, String>> 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);
}
}
}

View File

@ -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<HttpRequest> {
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);
}
}

View File

@ -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;
}