Last instrumentation conversion to OpenTelemetry API and remove prior agent API (#128)

* Convert OkHttp3 to use OpenTelemetry API directly

* Remove Agent API
This commit is contained in:
Trask Stalnaker 2020-02-05 13:20:07 -08:00 committed by GitHub
parent 3a4b2a9b95
commit 1440d95fb5
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
18 changed files with 19 additions and 764 deletions

View File

@ -1,19 +0,0 @@
package io.opentelemetry.auto.instrumentation.api;
@Deprecated
public interface AgentPropagation {
<C> void inject(AgentSpan span, C carrier, Setter<C> setter);
interface Setter<C> {
void set(C carrier, String key, String value);
}
<C> AgentSpan.Context extract(C carrier, Getter<C> getter);
interface Getter<C> {
Iterable<String> keys(C carrier);
String get(C carrier, String key);
}
}

View File

@ -1,11 +0,0 @@
package io.opentelemetry.auto.instrumentation.api;
import java.io.Closeable;
@Deprecated
public interface AgentScope extends Closeable {
AgentSpan span();
@Override
void close();
}

View File

@ -1,34 +0,0 @@
package io.opentelemetry.auto.instrumentation.api;
import io.opentelemetry.trace.Span;
@Deprecated
public interface AgentSpan {
AgentSpan setAttribute(String key, boolean value);
AgentSpan setAttribute(String key, int value);
AgentSpan setAttribute(String key, long value);
AgentSpan setAttribute(String key, double value);
AgentSpan setAttribute(String key, String value);
AgentSpan setError(boolean error);
AgentSpan setErrorMessage(String errorMessage);
AgentSpan addThrowable(Throwable throwable);
Context context();
void finish();
String getSpanName();
void setSpanName(String spanName);
Span getSpan();
interface Context {}
}

View File

@ -1,219 +0,0 @@
package io.opentelemetry.auto.instrumentation.api;
import io.opentelemetry.auto.instrumentation.api.AgentSpan.Context;
import io.opentelemetry.trace.DefaultSpan;
import io.opentelemetry.trace.Span;
import java.util.concurrent.atomic.AtomicReference;
@Deprecated
public class AgentTracer {
// Implicit parent
public static AgentSpan startSpan(final String spanName) {
return get().startSpan(spanName);
}
// Implicit parent
public static AgentSpan startSpan(final String spanName, final long startTimeMicros) {
return get().startSpan(spanName, startTimeMicros);
}
// Explicit parent
public static AgentSpan startSpan(final String spanName, final AgentSpan.Context parent) {
return get().startSpan(spanName, parent);
}
// Explicit parent
public static AgentSpan startSpan(
final String spanName, final AgentSpan.Context parent, final long startTimeMicros) {
return get().startSpan(spanName, parent, startTimeMicros);
}
public static AgentScope activateSpan(final AgentSpan span, final boolean finishSpanOnClose) {
return get().activateSpan(span, finishSpanOnClose);
}
public static AgentSpan activeSpan() {
return get().activeSpan();
}
public static AgentPropagation propagate() {
return get().propagate();
}
public static AgentSpan noopSpan() {
return get().noopSpan();
}
private static final TracerAPI DEFAULT = new NoopTracerAPI();
private static final AtomicReference<TracerAPI> provider = new AtomicReference<>(DEFAULT);
public static void registerIfAbsent(final TracerAPI trace) {
provider.compareAndSet(DEFAULT, trace);
}
public static TracerAPI get() {
return provider.get();
}
// Not intended to be constructed.
private AgentTracer() {}
public interface TracerAPI {
AgentSpan startSpan(String spanName);
AgentSpan startSpan(String spanName, long startTimeMicros);
AgentSpan startSpan(String spanName, AgentSpan.Context parent);
AgentSpan startSpan(String spanName, AgentSpan.Context parent, long startTimeMicros);
AgentScope activateSpan(AgentSpan span, boolean finishSpanOnClose);
AgentSpan activeSpan();
AgentPropagation propagate();
AgentSpan noopSpan();
}
static class NoopTracerAPI implements TracerAPI {
protected NoopTracerAPI() {}
@Override
public AgentSpan startSpan(final String spanName) {
return NoopAgentSpan.INSTANCE;
}
@Override
public AgentSpan startSpan(final String spanName, final long startTimeMicros) {
return NoopAgentSpan.INSTANCE;
}
@Override
public AgentSpan startSpan(final String spanName, final Context parent) {
return NoopAgentSpan.INSTANCE;
}
@Override
public AgentSpan startSpan(
final String spanName, final Context parent, final long startTimeMicros) {
return NoopAgentSpan.INSTANCE;
}
@Override
public AgentScope activateSpan(final AgentSpan span, final boolean finishSpanOnClose) {
return NoopAgentScope.INSTANCE;
}
@Override
public AgentSpan activeSpan() {
return NoopAgentSpan.INSTANCE;
}
@Override
public AgentPropagation propagate() {
return NoopAgentPropagation.INSTANCE;
}
@Override
public AgentSpan noopSpan() {
return NoopAgentSpan.INSTANCE;
}
}
static class NoopAgentSpan implements AgentSpan {
static final NoopAgentSpan INSTANCE = new NoopAgentSpan();
@Override
public AgentSpan setAttribute(final String key, final boolean value) {
return this;
}
@Override
public AgentSpan setAttribute(final String key, final int value) {
return this;
}
@Override
public AgentSpan setAttribute(final String key, final long value) {
return this;
}
@Override
public AgentSpan setAttribute(final String key, final double value) {
return this;
}
@Override
public AgentSpan setAttribute(final String key, final String value) {
return this;
}
@Override
public AgentSpan setError(final boolean error) {
return this;
}
@Override
public AgentSpan setErrorMessage(final String errorMessage) {
return this;
}
@Override
public AgentSpan addThrowable(final Throwable throwable) {
return this;
}
@Override
public Context context() {
return NoopContext.INSTANCE;
}
@Override
public void finish() {}
@Override
public String getSpanName() {
return "";
}
@Override
public void setSpanName(final String spanName) {}
@Override
public Span getSpan() {
return DefaultSpan.getInvalid();
}
}
public static class NoopAgentScope implements AgentScope {
public static final NoopAgentScope INSTANCE = new NoopAgentScope();
@Override
public AgentSpan span() {
return NoopAgentSpan.INSTANCE;
}
@Override
public void close() {}
}
static class NoopAgentPropagation implements AgentPropagation {
static final NoopAgentPropagation INSTANCE = new NoopAgentPropagation();
@Override
public <C> void inject(final AgentSpan span, final C carrier, final Setter<C> setter) {}
@Override
public <C> Context extract(final C carrier, final Getter<C> getter) {
return NoopContext.INSTANCE;
}
}
static class NoopContext implements Context {
static final NoopContext INSTANCE = new NoopContext();
}
}

View File

@ -1,7 +1,5 @@
package io.opentelemetry.auto.decorator;
import io.opentelemetry.auto.instrumentation.api.AgentScope;
import io.opentelemetry.auto.instrumentation.api.AgentSpan;
import io.opentelemetry.auto.instrumentation.api.MoreTags;
import io.opentelemetry.auto.instrumentation.api.Tags;
import io.opentelemetry.trace.Span;
@ -23,12 +21,6 @@ public abstract class BaseDecorator {
protected abstract String getComponentName();
@Deprecated
public AgentSpan afterStart(final AgentSpan span) {
afterStart(span.getSpan());
return span;
}
public Span afterStart(final Span span) {
assert span != null;
final String spanType = getSpanType();
@ -42,37 +34,11 @@ public abstract class BaseDecorator {
return span;
}
@Deprecated
public AgentScope beforeFinish(final AgentScope scope) {
assert scope != null;
beforeFinish(scope.span());
return scope;
}
@Deprecated
public AgentSpan beforeFinish(final AgentSpan span) {
beforeFinish(span.getSpan());
return span;
}
public Span beforeFinish(final Span span) {
assert span != null;
return span;
}
@Deprecated
public AgentScope onError(final AgentScope scope, final Throwable throwable) {
assert scope != null;
onError(scope.span(), throwable);
return scope;
}
@Deprecated
public AgentSpan onError(final AgentSpan span, final Throwable throwable) {
onError(span.getSpan(), throwable);
return span;
}
public Span onError(final Span span, final Throwable throwable) {
assert span != null;
if (throwable != null) {
@ -83,13 +49,6 @@ public abstract class BaseDecorator {
return span;
}
@Deprecated
public AgentSpan onPeerConnection(
final AgentSpan span, final InetSocketAddress remoteConnection) {
onPeerConnection(span.getSpan(), remoteConnection);
return span;
}
public Span onPeerConnection(final Span span, final InetSocketAddress remoteConnection) {
assert span != null;
if (remoteConnection != null) {
@ -101,12 +60,6 @@ public abstract class BaseDecorator {
return span;
}
@Deprecated
public AgentSpan onPeerConnection(final AgentSpan span, final InetAddress remoteAddress) {
onPeerConnection(span.getSpan(), remoteAddress);
return span;
}
public Span onPeerConnection(final Span span, final InetAddress remoteAddress) {
assert span != null;
if (remoteAddress != null) {

View File

@ -1,6 +1,5 @@
package io.opentelemetry.auto.decorator;
import io.opentelemetry.auto.instrumentation.api.AgentSpan;
import io.opentelemetry.auto.instrumentation.api.MoreTags;
import io.opentelemetry.auto.instrumentation.api.Tags;
import io.opentelemetry.trace.Span;
@ -13,13 +12,6 @@ public abstract class ClientDecorator extends BaseDecorator {
return Tags.SPAN_KIND_CLIENT;
}
@Deprecated
@Override
public AgentSpan afterStart(final AgentSpan span) {
afterStart(span.getSpan());
return span;
}
@Override
public Span afterStart(final Span span) {
assert span != null;

View File

@ -1,7 +1,6 @@
package io.opentelemetry.auto.decorator;
import io.opentelemetry.auto.config.Config;
import io.opentelemetry.auto.instrumentation.api.AgentSpan;
import io.opentelemetry.auto.instrumentation.api.MoreTags;
import io.opentelemetry.auto.instrumentation.api.Tags;
import io.opentelemetry.trace.Span;
@ -14,13 +13,6 @@ public abstract class DatabaseClientDecorator<CONNECTION> extends ClientDecorato
protected abstract String dbInstance(CONNECTION connection);
@Deprecated
@Override
public AgentSpan afterStart(final AgentSpan span) {
afterStart(span.getSpan());
return span;
}
@Override
public Span afterStart(final Span span) {
assert span != null;
@ -38,12 +30,6 @@ public abstract class DatabaseClientDecorator<CONNECTION> extends ClientDecorato
* @param connection
* @return
*/
@Deprecated
public AgentSpan onConnection(final AgentSpan span, final CONNECTION connection) {
onConnection(span.getSpan(), connection);
return span;
}
public Span onConnection(final Span span, final CONNECTION connection) {
assert span != null;
if (connection != null) {
@ -63,12 +49,6 @@ public abstract class DatabaseClientDecorator<CONNECTION> extends ClientDecorato
return span;
}
@Deprecated
public AgentSpan onStatement(final AgentSpan span, final String statement) {
onStatement(span.getSpan(), statement);
return span;
}
public Span onStatement(final Span span, final String statement) {
assert span != null;
span.setAttribute(Tags.DB_STATEMENT, statement);

View File

@ -1,7 +1,6 @@
package io.opentelemetry.auto.decorator;
import io.opentelemetry.auto.config.Config;
import io.opentelemetry.auto.instrumentation.api.AgentSpan;
import io.opentelemetry.auto.instrumentation.api.MoreTags;
import io.opentelemetry.auto.instrumentation.api.SpanTypes;
import io.opentelemetry.auto.instrumentation.api.Tags;
@ -34,12 +33,6 @@ public abstract class HttpClientDecorator<REQUEST, RESPONSE> extends ClientDecor
return null;
}
@Deprecated
public AgentSpan onRequest(final AgentSpan span, final REQUEST request) {
onRequest(span.getSpan(), request);
return span;
}
public Span onRequest(final Span span, final REQUEST request) {
assert span != null;
if (request != null) {
@ -105,12 +98,6 @@ public abstract class HttpClientDecorator<REQUEST, RESPONSE> extends ClientDecor
return span;
}
@Deprecated
public AgentSpan onResponse(final AgentSpan span, final RESPONSE response) {
onResponse(span.getSpan(), response);
return span;
}
public Span onResponse(final Span span, final RESPONSE response) {
assert span != null;
if (response != null) {

View File

@ -1,7 +1,6 @@
package io.opentelemetry.auto.decorator;
import io.opentelemetry.auto.config.Config;
import io.opentelemetry.auto.instrumentation.api.AgentSpan;
import io.opentelemetry.auto.instrumentation.api.MoreTags;
import io.opentelemetry.auto.instrumentation.api.SpanTypes;
import io.opentelemetry.auto.instrumentation.api.Tags;
@ -38,12 +37,6 @@ public abstract class HttpServerDecorator<REQUEST, CONNECTION, RESPONSE> extends
return SpanTypes.HTTP_SERVER;
}
@Deprecated
public AgentSpan onRequest(final AgentSpan span, final REQUEST request) {
onRequest(span.getSpan(), request);
return span;
}
public Span onRequest(final Span span, final REQUEST request) {
assert span != null;
if (request != null) {
@ -91,12 +84,6 @@ public abstract class HttpServerDecorator<REQUEST, CONNECTION, RESPONSE> extends
return span;
}
@Deprecated
public AgentSpan onConnection(final AgentSpan span, final CONNECTION connection) {
onConnection(span.getSpan(), connection);
return span;
}
public Span onConnection(final Span span, final CONNECTION connection) {
assert span != null;
if (connection != null) {
@ -121,12 +108,6 @@ public abstract class HttpServerDecorator<REQUEST, CONNECTION, RESPONSE> extends
return span;
}
@Deprecated
public AgentSpan onResponse(final AgentSpan span, final RESPONSE response) {
onResponse(span.getSpan(), response);
return span;
}
public Span onResponse(final Span span, final RESPONSE response) {
assert span != null;
if (response != null) {

View File

@ -1,6 +1,5 @@
package io.opentelemetry.auto.decorator;
import io.opentelemetry.auto.instrumentation.api.AgentSpan;
import io.opentelemetry.auto.instrumentation.api.MoreTags;
import io.opentelemetry.trace.Span;
@ -8,12 +7,6 @@ public abstract class OrmClientDecorator extends DatabaseClientDecorator {
public abstract String entityName(final Object entity);
@Deprecated
public AgentSpan onOperation(final AgentSpan span, final Object entity) {
onOperation(span.getSpan(), entity);
return span;
}
public Span onOperation(final Span span, final Object entity) {
assert span != null;

View File

@ -1,18 +1,10 @@
package io.opentelemetry.auto.decorator;
import io.opentelemetry.auto.instrumentation.api.AgentSpan;
import io.opentelemetry.auto.instrumentation.api.Tags;
import io.opentelemetry.trace.Span;
public abstract class ServerDecorator extends BaseDecorator {
@Deprecated
@Override
public AgentSpan afterStart(final AgentSpan span) {
afterStart(span.getSpan());
return span;
}
@Override
public Span afterStart(final Span span) {
assert span != null;

View File

@ -1,327 +0,0 @@
package io.opentelemetry.auto.tooling;
import static java.util.concurrent.TimeUnit.MICROSECONDS;
import io.opentelemetry.auto.instrumentation.api.AgentPropagation;
import io.opentelemetry.auto.instrumentation.api.AgentPropagation.Getter;
import io.opentelemetry.auto.instrumentation.api.AgentScope;
import io.opentelemetry.auto.instrumentation.api.AgentSpan;
import io.opentelemetry.auto.instrumentation.api.AgentTracer.TracerAPI;
import io.opentelemetry.auto.instrumentation.api.MoreTags;
import io.opentelemetry.context.Scope;
import io.opentelemetry.context.propagation.HttpTextFormat;
import io.opentelemetry.sdk.trace.ReadableSpan;
import io.opentelemetry.trace.DefaultSpan;
import io.opentelemetry.trace.Span;
import io.opentelemetry.trace.SpanContext;
import io.opentelemetry.trace.Status;
import io.opentelemetry.trace.Tracer;
import java.io.PrintWriter;
import java.io.StringWriter;
public final class AgentTracerImpl implements TracerAPI {
private final Tracer tracer;
private final AgentPropagationImpl propagation = new AgentPropagationImpl();
private final AgentSpanImpl noopSpan;
public AgentTracerImpl(final Tracer tracer) {
this.tracer = tracer;
noopSpan = new AgentSpanImpl(DefaultSpan.getInvalid());
}
@Override
public AgentSpan startSpan(final String spanName) {
return new AgentSpanImpl(spanName);
}
@Override
public AgentSpan startSpan(final String spanName, final long startTimeMicros) {
return new AgentSpanImpl(spanName, startTimeMicros);
}
@Override
public AgentSpan startSpan(final String spanName, final AgentSpan.Context parent) {
return new AgentSpanImpl(spanName, (AgentContextImpl) parent);
}
@Override
public AgentSpan startSpan(
final String spanName, final AgentSpan.Context parent, final long startTimeMicros) {
return new AgentSpanImpl(spanName, parent, startTimeMicros);
}
@Override
public AgentScope activateSpan(final AgentSpan span, final boolean finishSpanOnClose) {
final Scope scope = tracer.withSpan(((AgentSpanImpl) span).span);
return new AgentScopeImpl(span, scope, finishSpanOnClose);
}
@Override
public AgentSpan activeSpan() {
final Span span = tracer.getCurrentSpan();
if (!span.getContext().isValid()) {
return null;
}
return new AgentSpanImpl(span);
}
@Override
public AgentPropagation propagate() {
return propagation;
}
@Override
public AgentSpan noopSpan() {
return noopSpan;
}
private final class AgentSpanImpl implements AgentSpan {
private final Span span;
private AgentSpanImpl(final String spanName) {
this(tracer.spanBuilder(spanName).startSpan());
}
private AgentSpanImpl(final String spanName, final long startTimeMicros) {
this(
tracer
.spanBuilder(spanName)
.setStartTimestamp(MICROSECONDS.toNanos(startTimeMicros))
.startSpan());
}
private AgentSpanImpl(final String spanName, final AgentContextImpl parent) {
final SpanContext context = parent.context;
final Span.Builder spanBuilder = tracer.spanBuilder(spanName);
if (context == null) {
spanBuilder.setNoParent();
} else {
spanBuilder.setParent(context);
}
span = spanBuilder.startSpan();
}
private AgentSpanImpl(final String spanName, final Context parent, final long startTimeMicros) {
final SpanContext context = ((AgentContextImpl) parent).context;
final Span.Builder spanBuilder =
tracer.spanBuilder(spanName).setStartTimestamp(MICROSECONDS.toNanos(startTimeMicros));
if (context == null) {
spanBuilder.setNoParent();
} else {
spanBuilder.setParent(context);
}
span = spanBuilder.startSpan();
}
private AgentSpanImpl(final Span span) {
this.span = span;
}
@Override
public AgentSpan setAttribute(final String key, final boolean value) {
span.setAttribute(key, value);
return this;
}
@Override
public AgentSpan setAttribute(final String key, final int value) {
span.setAttribute(key, value);
return this;
}
@Override
public AgentSpan setAttribute(final String key, final long value) {
span.setAttribute(key, value);
return this;
}
@Override
public AgentSpan setAttribute(final String key, final double value) {
span.setAttribute(key, value);
return this;
}
@Override
public AgentSpan setAttribute(final String key, final String value) {
if (value != null && !value.isEmpty()) {
span.setAttribute(key, value);
}
return this;
}
@Override
public AgentSpan setError(final boolean error) {
span.setStatus(Status.UNKNOWN);
return this;
}
@Override
public AgentSpan setErrorMessage(final String errorMessage) {
span.setAttribute(MoreTags.ERROR_MSG, errorMessage);
return this;
}
@Override
public AgentSpan addThrowable(final Throwable throwable) {
final String message = throwable.getMessage();
if (message != null) {
span.setAttribute(MoreTags.ERROR_MSG, message);
}
span.setAttribute(MoreTags.ERROR_TYPE, throwable.getClass().getName());
final StringWriter errorString = new StringWriter();
throwable.printStackTrace(new PrintWriter(errorString));
span.setAttribute(MoreTags.ERROR_STACK, errorString.toString());
return this;
}
@Override
public AgentContextImpl context() {
final SpanContext context = span.getContext();
return new AgentContextImpl(context);
}
@Override
public void finish() {
span.end();
}
@Override
public String getSpanName() {
if (span instanceof ReadableSpan) {
return ((ReadableSpan) span).getName();
} else {
return "";
}
}
@Override
public void setSpanName(final String spanName) {
span.updateName(spanName);
}
@Override
public Span getSpan() {
return span;
}
@Override
public int hashCode() {
return span.hashCode();
}
@Override
public boolean equals(final Object obj) {
if (!(obj instanceof AgentSpanImpl)) {
return false;
}
final AgentSpanImpl other = (AgentSpanImpl) obj;
return span.equals(other.span);
}
}
private final class AgentScopeImpl implements AgentScope {
private final AgentSpanImpl span;
private final Scope scope;
private final boolean finishSpanOnClose;
private AgentScopeImpl(
final AgentSpan span, final Scope scope, final boolean finishSpanOnClose) {
assert span instanceof AgentSpanImpl;
this.span = (AgentSpanImpl) span;
this.scope = scope;
this.finishSpanOnClose = finishSpanOnClose;
}
@Override
public void close() {
scope.close();
if (finishSpanOnClose) {
span.finish();
}
}
@Override
public AgentSpan span() {
return span;
}
@Override
public int hashCode() {
return scope.hashCode();
}
@Override
public boolean equals(final Object obj) {
if (!(obj instanceof AgentScopeImpl)) {
return false;
}
final AgentScopeImpl other = (AgentScopeImpl) obj;
return scope.equals(other.scope);
}
}
private final class AgentPropagationImpl implements AgentPropagation {
@Override
public <C> void inject(final AgentSpan span, final C carrier, final Setter<C> setter) {
assert span instanceof AgentSpanImpl;
tracer
.getHttpTextFormat()
.inject(
((AgentSpanImpl) span).getSpan().getContext(),
carrier,
new AgentPropagationImpl.Injector<>(setter));
}
private final class Injector<C> implements HttpTextFormat.Setter<C> {
private final Setter<C> setter;
private Injector(final Setter<C> setter) {
this.setter = setter;
}
@Override
public void put(final C carrier, final String key, final String value) {
setter.set(carrier, key, value);
}
}
@Override
public <C> AgentSpan.Context extract(final C carrier, final Getter<C> getter) {
SpanContext extract;
try {
extract = tracer.getHttpTextFormat().extract(carrier, new Extractor<>(getter));
} catch (final IllegalArgumentException e) {
extract = null;
}
return new AgentContextImpl(extract);
}
}
private static final class Extractor<C> implements HttpTextFormat.Getter<C> {
private final Getter<C> getter;
private Extractor(final Getter<C> getter) {
this.getter = getter;
}
@Override
public String get(final C carrier, final String key) {
return getter.get(carrier, key);
}
}
private static final class AgentContextImpl implements AgentSpan.Context {
private final SpanContext context;
private AgentContextImpl(final SpanContext context) {
this.context = context;
}
}
}

View File

@ -1,14 +1,11 @@
package io.opentelemetry.auto.tooling;
import io.opentelemetry.OpenTelemetry;
import io.opentelemetry.auto.config.Config;
import io.opentelemetry.auto.instrumentation.api.AgentTracer;
import io.opentelemetry.auto.tooling.exporter.ExporterConfigException;
import io.opentelemetry.auto.tooling.exporter.ExporterRegistry;
import io.opentelemetry.auto.tooling.exporter.SpanExporterFactory;
import io.opentelemetry.sdk.OpenTelemetrySdk;
import io.opentelemetry.sdk.trace.export.SimpleSpansProcessor;
import io.opentelemetry.trace.Tracer;
import lombok.extern.slf4j.Slf4j;
@Slf4j
@ -32,13 +29,6 @@ public class TracerInstaller {
} else {
log.warn("No exporter is specified. Tracing will run but spans are dropped");
}
final Tracer tracer = OpenTelemetry.getTracerFactory().get("io.opentelemetry.auto");
try {
AgentTracer.registerIfAbsent(new AgentTracerImpl(tracer));
} catch (final RuntimeException re) {
log.warn("Failed to register tracer '" + tracer + "'", re);
}
} else {
log.debug("Tracing is disabled.");
}

View File

@ -1,6 +1,6 @@
package io.opentelemetry.auto.instrumentation.okhttp3;
import io.opentelemetry.auto.instrumentation.api.AgentPropagation;
import io.opentelemetry.context.propagation.HttpTextFormat;
import okhttp3.Request;
/**
@ -8,12 +8,12 @@ import okhttp3.Request;
*
* @author Pavol Loffay
*/
public class RequestBuilderInjectAdapter implements AgentPropagation.Setter<Request.Builder> {
public class RequestBuilderInjectAdapter implements HttpTextFormat.Setter<Request.Builder> {
public static final RequestBuilderInjectAdapter SETTER = new RequestBuilderInjectAdapter();
@Override
public void set(final Request.Builder carrier, final String key, final String value) {
public void put(final Request.Builder carrier, final String key, final String value) {
carrier.addHeader(key, value);
}
}

View File

@ -1,13 +1,12 @@
package io.opentelemetry.auto.instrumentation.okhttp3;
import static io.opentelemetry.auto.instrumentation.api.AgentTracer.activateSpan;
import static io.opentelemetry.auto.instrumentation.api.AgentTracer.propagate;
import static io.opentelemetry.auto.instrumentation.api.AgentTracer.startSpan;
import static io.opentelemetry.auto.instrumentation.okhttp3.OkHttpClientDecorator.DECORATE;
import static io.opentelemetry.auto.instrumentation.okhttp3.RequestBuilderInjectAdapter.SETTER;
import io.opentelemetry.auto.instrumentation.api.AgentScope;
import io.opentelemetry.auto.instrumentation.api.AgentSpan;
import io.opentelemetry.OpenTelemetry;
import io.opentelemetry.context.Scope;
import io.opentelemetry.trace.Span;
import io.opentelemetry.trace.Tracer;
import java.io.IOException;
import lombok.extern.slf4j.Slf4j;
import okhttp3.Interceptor;
@ -16,27 +15,31 @@ import okhttp3.Response;
@Slf4j
public class TracingInterceptor implements Interceptor {
public static final Tracer TRACER = OpenTelemetry.getTracerFactory().get("io.opentelemetry.auto");
@Override
public Response intercept(final Chain chain) throws IOException {
final AgentSpan span = startSpan("okhttp.request");
final Span span = TRACER.spanBuilder("okhttp.request").startSpan();
try (final AgentScope scope = activateSpan(span, true)) {
try (final Scope scope = TRACER.withSpan(span)) {
DECORATE.afterStart(span);
DECORATE.onRequest(span, chain.request());
final Request.Builder requestBuilder = chain.request().newBuilder();
propagate().inject(span, requestBuilder, SETTER);
TRACER.getHttpTextFormat().inject(span.getContext(), requestBuilder, SETTER);
final Response response;
try {
response = chain.proceed(requestBuilder.build());
} catch (final Exception e) {
DECORATE.onError(span, e);
span.end();
throw e;
}
DECORATE.onResponse(span, response);
DECORATE.beforeFinish(span);
span.end();
return response;
}
}

View File

@ -8,7 +8,6 @@ import static net.bytebuddy.matcher.ElementMatchers.takesArgument;
import static net.bytebuddy.matcher.ElementMatchers.takesArguments;
import com.google.auto.service.AutoService;
import io.opentelemetry.auto.instrumentation.api.AgentTracer;
import io.opentelemetry.auto.tooling.Constants;
import io.opentelemetry.auto.tooling.Instrumenter;
import java.util.Map;
@ -19,9 +18,8 @@ import net.bytebuddy.matcher.ElementMatcher;
/**
* Instrument Tomcat's web app classloader so it loads agent bootstrap classes from parent
* classloader. Without this change web apps get their own versions of agent classes leading to
* there being multiple {@link AgentTracer}s in existence, some of them not configured properly.
* This is really the same idea we have for OSGi and JBoss.
* classloader. Without this change web apps get their own versions of agent classes. This is really
* the same idea we have for OSGi and JBoss.
*/
@AutoService(Instrumenter.class)
public final class TomcatClassloadingInstrumentation extends Instrumenter.Default {

View File

@ -1,4 +1,4 @@
import io.opentelemetry.auto.instrumentation.api.AgentTracer
import io.opentelemetry.auto.instrumentation.api.Tags
import io.opentelemetry.auto.test.AgentTestRunner
import org.apache.catalina.WebResource
import org.apache.catalina.WebResourceRoot
@ -22,9 +22,9 @@ class TomcatClassloadingTest extends AgentTestRunner {
when:
// If instrumentation didn't work this would blow up with NPE due to incomplete resources mocking
def clazz = classloader.loadClass("io.opentelemetry.auto.instrumentation.api.AgentTracer")
def clazz = classloader.loadClass("io.opentelemetry.auto.instrumentation.api.Tags")
then:
clazz == AgentTracer
clazz == Tags
}
}

View File

@ -10,10 +10,8 @@ import groovy.lang.DelegatesTo;
import groovy.transform.stc.ClosureParams;
import groovy.transform.stc.SimpleType;
import io.opentelemetry.OpenTelemetry;
import io.opentelemetry.auto.instrumentation.api.AgentTracer;
import io.opentelemetry.auto.test.asserts.ListWriterAssert;
import io.opentelemetry.auto.tooling.AgentInstaller;
import io.opentelemetry.auto.tooling.AgentTracerImpl;
import io.opentelemetry.auto.tooling.Instrumenter;
import io.opentelemetry.auto.util.test.AgentSpecification;
import io.opentelemetry.sdk.OpenTelemetrySdk;
@ -84,8 +82,6 @@ public abstract class AgentTestRunner extends AgentSpecification {
TEST_WRITER = new ListWriter();
OpenTelemetrySdk.getTracerFactory().addSpanProcessor(TEST_WRITER);
TEST_TRACER = OpenTelemetry.getTracerFactory().get("io.opentelemetry.auto");
AgentTracer.registerIfAbsent(new AgentTracerImpl(TEST_TRACER));
}
protected static Tracer getTestTracer() {