HTTP client instrumentation cleanup: google-http-client (#1910)

* HTTP client instrumentation cleanup: google-http-client

* Bring back comment

* Feedback
This commit is contained in:
Trask Stalnaker 2020-12-15 21:49:00 -08:00 committed by GitHub
parent 35005bd508
commit 6dcc819f77
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 25 additions and 36 deletions

View File

@ -6,7 +6,6 @@
package io.opentelemetry.javaagent.instrumentation.googlehttpclient;
import static io.opentelemetry.javaagent.instrumentation.api.Java8BytecodeBridge.currentContext;
import static io.opentelemetry.javaagent.instrumentation.api.Java8BytecodeBridge.spanFromContext;
import static io.opentelemetry.javaagent.instrumentation.googlehttpclient.GoogleHttpClientTracer.tracer;
import static java.util.Collections.singletonList;
import static java.util.Collections.singletonMap;
@ -19,10 +18,8 @@ import static net.bytebuddy.matcher.ElementMatchers.takesArguments;
import com.google.api.client.http.HttpRequest;
import com.google.api.client.http.HttpResponse;
import com.google.auto.service.AutoService;
import io.opentelemetry.api.trace.StatusCode;
import io.opentelemetry.context.Context;
import io.opentelemetry.context.Scope;
import io.opentelemetry.javaagent.instrumentation.api.ContextStore;
import io.opentelemetry.javaagent.instrumentation.api.InstrumentationContext;
import io.opentelemetry.javaagent.tooling.InstrumentationModule;
import io.opentelemetry.javaagent.tooling.TypeInstrumentation;
@ -85,21 +82,20 @@ public class GoogleHttpClientInstrumentationModule extends InstrumentationModule
@Advice.Local("otelContext") Context context,
@Advice.Local("otelScope") Scope scope) {
ContextStore<HttpRequest, Context> contextStore =
InstrumentationContext.get(HttpRequest.class, Context.class);
context = contextStore.get(request);
if (context == null) {
Context parentContext = currentContext();
if (tracer().shouldStartSpan(parentContext)) {
context = tracer().startSpan(parentContext, request, request.getHeaders());
contextStore.put(request, context);
scope = context.makeCurrent();
}
} else {
context = InstrumentationContext.get(HttpRequest.class, Context.class).get(request);
if (context != null) {
// span was created by GoogleHttpClientAsyncAdvice instrumentation below
// (executeAsync ends up calling execute from a separate thread)
// so make it current and end it in method exit
scope = context.makeCurrent();
return;
}
Context parentContext = currentContext();
if (!tracer().shouldStartSpan(parentContext)) {
return;
}
context = tracer().startSpan(parentContext, request);
scope = context.makeCurrent();
}
@Advice.OnMethodExit(onThrowable = Throwable.class, suppress = Throwable.class)
@ -113,16 +109,7 @@ public class GoogleHttpClientInstrumentationModule extends InstrumentationModule
}
scope.close();
if (throwable == null) {
tracer().end(context, response);
} else {
tracer().endExceptionally(context, response, 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()) {
spanFromContext(context).setStatus(StatusCode.ERROR);
}
tracer().endMaybeExceptionally(context, response, throwable);
}
}
@ -138,15 +125,10 @@ public class GoogleHttpClientInstrumentationModule extends InstrumentationModule
return;
}
context = tracer().startSpan(parentContext, request, request.getHeaders());
// propagating the context manually here so this instrumentation will work with and without
// the executors instrumentation
ContextStore<HttpRequest, Context> contextStore =
InstrumentationContext.get(HttpRequest.class, Context.class);
contextStore.put(request, context);
context = tracer().startSpan(parentContext, request);
scope = context.makeCurrent();
InstrumentationContext.get(HttpRequest.class, Context.class).put(request, context);
}
@Advice.OnMethodExit(onThrowable = Throwable.class, suppress = Throwable.class)

View File

@ -5,10 +5,13 @@
package io.opentelemetry.javaagent.instrumentation.googlehttpclient;
import static io.opentelemetry.javaagent.instrumentation.googlehttpclient.HeadersInjectAdapter.SETTER;
import com.google.api.client.http.HttpHeaders;
import com.google.api.client.http.HttpRequest;
import com.google.api.client.http.HttpResponse;
import io.opentelemetry.context.propagation.TextMapPropagator.Setter;
import io.opentelemetry.context.Context;
import io.opentelemetry.context.propagation.TextMapPropagator;
import io.opentelemetry.instrumentation.api.tracer.HttpClientTracer;
import java.net.URI;
import java.net.URISyntaxException;
@ -21,6 +24,10 @@ public class GoogleHttpClientTracer
return TRACER;
}
public Context startSpan(Context parentContext, HttpRequest request) {
return startSpan(parentContext, request, request.getHeaders());
}
@Override
protected String getInstrumentationName() {
return "io.opentelemetry.javaagent.google-http-client";
@ -56,8 +63,8 @@ public class GoogleHttpClientTracer
}
@Override
protected Setter<HttpHeaders> getSetter() {
return HeadersInjectAdapter.SETTER;
protected TextMapPropagator.Setter<HttpHeaders> getSetter() {
return SETTER;
}
private static String header(HttpHeaders headers, String name) {