diff --git a/java-agent/instrumentation/grpc-1.5/src/main/java/io/opentelemetry/auto/instrumentation/grpc/client/GrpcClientDecorator.java b/java-agent/instrumentation/grpc-1.5/src/main/java/io/opentelemetry/auto/instrumentation/grpc/client/GrpcClientDecorator.java index 78637b992f..b905e17af5 100644 --- a/java-agent/instrumentation/grpc-1.5/src/main/java/io/opentelemetry/auto/instrumentation/grpc/client/GrpcClientDecorator.java +++ b/java-agent/instrumentation/grpc-1.5/src/main/java/io/opentelemetry/auto/instrumentation/grpc/client/GrpcClientDecorator.java @@ -1,12 +1,15 @@ package io.opentelemetry.auto.instrumentation.grpc.client; -import io.grpc.Status; +import io.opentelemetry.OpenTelemetry; import io.opentelemetry.auto.api.SpanTypes; import io.opentelemetry.auto.decorator.ClientDecorator; -import io.opentelemetry.auto.instrumentation.api.AgentSpan; +import io.opentelemetry.trace.Span; +import io.opentelemetry.trace.Status; +import io.opentelemetry.trace.Tracer; public class GrpcClientDecorator extends ClientDecorator { public static final GrpcClientDecorator DECORATE = new GrpcClientDecorator(); + public static final Tracer TRACER = OpenTelemetry.getTracerFactory().get("io.opentelemetry.auto"); @Override protected String[] instrumentationNames() { @@ -28,16 +31,17 @@ public class GrpcClientDecorator extends ClientDecorator { return null; } - public AgentSpan onClose(final AgentSpan span, final Status status) { + public Span onClose(final Span span, final io.grpc.Status status) { span.setAttribute("status.code", status.getCode().name()); - span.setAttribute("status.description", status.getDescription()); + if (status.getDescription() != null) { + span.setAttribute("status.description", status.getDescription()); + } onError(span, status.getCause()); if (!status.isOk()) { - span.setError(true); + span.setStatus(Status.UNKNOWN); } - return span; } } diff --git a/java-agent/instrumentation/grpc-1.5/src/main/java/io/opentelemetry/auto/instrumentation/grpc/client/GrpcInjectAdapter.java b/java-agent/instrumentation/grpc-1.5/src/main/java/io/opentelemetry/auto/instrumentation/grpc/client/GrpcInjectAdapter.java index e870347647..e9ead31f1e 100644 --- a/java-agent/instrumentation/grpc-1.5/src/main/java/io/opentelemetry/auto/instrumentation/grpc/client/GrpcInjectAdapter.java +++ b/java-agent/instrumentation/grpc-1.5/src/main/java/io/opentelemetry/auto/instrumentation/grpc/client/GrpcInjectAdapter.java @@ -1,14 +1,14 @@ package io.opentelemetry.auto.instrumentation.grpc.client; import io.grpc.Metadata; -import io.opentelemetry.auto.instrumentation.api.AgentPropagation; +import io.opentelemetry.context.propagation.HttpTextFormat; -public final class GrpcInjectAdapter implements AgentPropagation.Setter { +public final class GrpcInjectAdapter implements HttpTextFormat.Setter { public static final GrpcInjectAdapter SETTER = new GrpcInjectAdapter(); @Override - public void set(final Metadata carrier, final String key, final String value) { + public void put(final Metadata carrier, final String key, final String value) { carrier.put(Metadata.Key.of(key, Metadata.ASCII_STRING_MARSHALLER), value); } } diff --git a/java-agent/instrumentation/grpc-1.5/src/main/java/io/opentelemetry/auto/instrumentation/grpc/client/TracingClientInterceptor.java b/java-agent/instrumentation/grpc-1.5/src/main/java/io/opentelemetry/auto/instrumentation/grpc/client/TracingClientInterceptor.java index 0f8e049196..2ae3a4d1be 100644 --- a/java-agent/instrumentation/grpc-1.5/src/main/java/io/opentelemetry/auto/instrumentation/grpc/client/TracingClientInterceptor.java +++ b/java-agent/instrumentation/grpc-1.5/src/main/java/io/opentelemetry/auto/instrumentation/grpc/client/TracingClientInterceptor.java @@ -1,9 +1,7 @@ package io.opentelemetry.auto.instrumentation.grpc.client; -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.grpc.client.GrpcClientDecorator.DECORATE; +import static io.opentelemetry.auto.instrumentation.grpc.client.GrpcClientDecorator.TRACER; import static io.opentelemetry.auto.instrumentation.grpc.client.GrpcInjectAdapter.SETTER; import io.grpc.CallOptions; @@ -16,8 +14,8 @@ import io.grpc.Metadata; import io.grpc.MethodDescriptor; import io.grpc.Status; import io.opentelemetry.auto.api.MoreTags; -import io.opentelemetry.auto.instrumentation.api.AgentScope; -import io.opentelemetry.auto.instrumentation.api.AgentSpan; +import io.opentelemetry.context.Scope; +import io.opentelemetry.trace.Span; public class TracingClientInterceptor implements ClientInterceptor { @@ -29,9 +27,9 @@ public class TracingClientInterceptor implements ClientInterceptor { final CallOptions callOptions, final Channel next) { - final AgentSpan span = - startSpan("grpc.client").setAttribute(MoreTags.RESOURCE_NAME, method.getFullMethodName()); - try (final AgentScope scope = activateSpan(span, false)) { + final Span span = TRACER.spanBuilder("grpc.client").startSpan(); + span.setAttribute(MoreTags.RESOURCE_NAME, method.getFullMethodName()); + try (final Scope scope = TRACER.withSpan(span)) { DECORATE.afterStart(span); final ClientCall result; @@ -41,45 +39,43 @@ public class TracingClientInterceptor implements ClientInterceptor { } catch (final Throwable e) { DECORATE.onError(span, e); DECORATE.beforeFinish(span); - span.finish(); + span.end(); throw e; } - return new TracingClientCall<>(span, result); } } static final class TracingClientCall extends ForwardingClientCall.SimpleForwardingClientCall { - final AgentSpan span; + final Span span; - TracingClientCall(final AgentSpan span, final ClientCall delegate) { + TracingClientCall(final Span span, final ClientCall delegate) { super(delegate); this.span = span; } @Override public void start(final Listener responseListener, final Metadata headers) { - propagate().inject(span, headers, SETTER); - - try (final AgentScope scope = activateSpan(span, false)) { + TRACER.getHttpTextFormat().inject(span.getContext(), headers, SETTER); + try (final Scope scope = TRACER.withSpan(span)) { super.start(new TracingClientCallListener<>(span, responseListener), headers); } catch (final Throwable e) { DECORATE.onError(span, e); DECORATE.beforeFinish(span); - span.finish(); + span.end(); throw e; } } @Override public void sendMessage(final ReqT message) { - try (final AgentScope scope = activateSpan(span, false)) { + try (final Scope scope = TRACER.withSpan(span)) { super.sendMessage(message); } catch (final Throwable e) { DECORATE.onError(span, e); DECORATE.beforeFinish(span); - span.finish(); + span.end(); throw e; } } @@ -87,28 +83,26 @@ public class TracingClientInterceptor implements ClientInterceptor { static final class TracingClientCallListener extends ForwardingClientCallListener.SimpleForwardingClientCallListener { - final AgentSpan span; + final Span span; - TracingClientCallListener(final AgentSpan span, final ClientCall.Listener delegate) { + TracingClientCallListener(final Span span, final ClientCall.Listener delegate) { super(delegate); this.span = span; } @Override public void onMessage(final RespT message) { - final AgentSpan messageSpan = - startSpan("grpc.message", span.context()) - .setAttribute("message.type", message.getClass().getName()); + final Span messageSpan = TRACER.spanBuilder("grpc.message").setParent(span).startSpan(); + messageSpan.setAttribute("message.type", message.getClass().getName()); DECORATE.afterStart(messageSpan); - final AgentScope scope = activateSpan(messageSpan, true); - try { + try (final Scope scope = TRACER.withSpan(messageSpan)) { delegate().onMessage(message); } catch (final Throwable e) { DECORATE.onError(messageSpan, e); throw e; } finally { DECORATE.beforeFinish(messageSpan); - scope.close(); + messageSpan.end(); } } @@ -116,25 +110,25 @@ public class TracingClientInterceptor implements ClientInterceptor { public void onClose(final Status status, final Metadata trailers) { DECORATE.onClose(span, status); // Finishes span. - try (final AgentScope scope = activateSpan(span, false)) { + try (final Scope scope = TRACER.withSpan(span)) { delegate().onClose(status, trailers); } catch (final Throwable e) { DECORATE.onError(span, e); throw e; } finally { DECORATE.beforeFinish(span); - span.finish(); + span.end(); } } @Override public void onReady() { - try (final AgentScope scope = activateSpan(span, false)) { + try (final Scope scope = TRACER.withSpan(span)) { delegate().onReady(); } catch (final Throwable e) { DECORATE.onError(span, e); DECORATE.beforeFinish(span); - span.finish(); + span.end(); throw e; } } diff --git a/java-agent/instrumentation/grpc-1.5/src/main/java/io/opentelemetry/auto/instrumentation/grpc/server/GrpcExtractAdapter.java b/java-agent/instrumentation/grpc-1.5/src/main/java/io/opentelemetry/auto/instrumentation/grpc/server/GrpcExtractAdapter.java index 0d9991ad56..8998635777 100644 --- a/java-agent/instrumentation/grpc-1.5/src/main/java/io/opentelemetry/auto/instrumentation/grpc/server/GrpcExtractAdapter.java +++ b/java-agent/instrumentation/grpc-1.5/src/main/java/io/opentelemetry/auto/instrumentation/grpc/server/GrpcExtractAdapter.java @@ -1,27 +1,12 @@ package io.opentelemetry.auto.instrumentation.grpc.server; import io.grpc.Metadata; -import io.opentelemetry.auto.instrumentation.api.AgentPropagation; -import java.util.ArrayList; -import java.util.List; +import io.opentelemetry.context.propagation.HttpTextFormat; -public final class GrpcExtractAdapter implements AgentPropagation.Getter { +public final class GrpcExtractAdapter implements HttpTextFormat.Getter { public static final GrpcExtractAdapter GETTER = new GrpcExtractAdapter(); - @Override - public Iterable keys(final Metadata carrier) { - final List keys = new ArrayList<>(); - - for (final String key : carrier.keys()) { - if (!key.endsWith(Metadata.BINARY_HEADER_SUFFIX)) { - keys.add(key); - } - } - - return keys; - } - @Override public String get(final Metadata carrier, final String key) { return carrier.get(Metadata.Key.of(key, Metadata.ASCII_STRING_MARSHALLER)); diff --git a/java-agent/instrumentation/grpc-1.5/src/main/java/io/opentelemetry/auto/instrumentation/grpc/server/GrpcServerDecorator.java b/java-agent/instrumentation/grpc-1.5/src/main/java/io/opentelemetry/auto/instrumentation/grpc/server/GrpcServerDecorator.java index 3d3905bc88..0ac1cc7765 100644 --- a/java-agent/instrumentation/grpc-1.5/src/main/java/io/opentelemetry/auto/instrumentation/grpc/server/GrpcServerDecorator.java +++ b/java-agent/instrumentation/grpc-1.5/src/main/java/io/opentelemetry/auto/instrumentation/grpc/server/GrpcServerDecorator.java @@ -1,12 +1,15 @@ package io.opentelemetry.auto.instrumentation.grpc.server; import io.grpc.Status; +import io.opentelemetry.OpenTelemetry; import io.opentelemetry.auto.api.SpanTypes; import io.opentelemetry.auto.decorator.ServerDecorator; -import io.opentelemetry.auto.instrumentation.api.AgentSpan; +import io.opentelemetry.trace.Span; +import io.opentelemetry.trace.Tracer; public class GrpcServerDecorator extends ServerDecorator { public static final GrpcServerDecorator DECORATE = new GrpcServerDecorator(); + public static final Tracer TRACER = OpenTelemetry.getTracerFactory().get("io.opentelemetry.auto"); @Override protected String[] instrumentationNames() { @@ -23,16 +26,16 @@ public class GrpcServerDecorator extends ServerDecorator { return "grpc-server"; } - public AgentSpan onClose(final AgentSpan span, final Status status) { + public Span onClose(final Span span, final Status status) { span.setAttribute("status.code", status.getCode().name()); - span.setAttribute("status.description", status.getDescription()); - + if (status.getDescription() != null) { + span.setAttribute("status.description", status.getDescription()); + } onError(span, status.getCause()); if (!status.isOk()) { - span.setError(true); + span.setStatus(io.opentelemetry.trace.Status.UNKNOWN); } - return span; } } diff --git a/java-agent/instrumentation/grpc-1.5/src/main/java/io/opentelemetry/auto/instrumentation/grpc/server/TracingServerInterceptor.java b/java-agent/instrumentation/grpc-1.5/src/main/java/io/opentelemetry/auto/instrumentation/grpc/server/TracingServerInterceptor.java index 4c2665e259..10a7f44ebf 100644 --- a/java-agent/instrumentation/grpc-1.5/src/main/java/io/opentelemetry/auto/instrumentation/grpc/server/TracingServerInterceptor.java +++ b/java-agent/instrumentation/grpc-1.5/src/main/java/io/opentelemetry/auto/instrumentation/grpc/server/TracingServerInterceptor.java @@ -1,10 +1,8 @@ package io.opentelemetry.auto.instrumentation.grpc.server; -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.grpc.server.GrpcExtractAdapter.GETTER; import static io.opentelemetry.auto.instrumentation.grpc.server.GrpcServerDecorator.DECORATE; +import static io.opentelemetry.auto.instrumentation.grpc.server.GrpcServerDecorator.TRACER; import io.grpc.ForwardingServerCall; import io.grpc.ForwardingServerCallListener; @@ -14,9 +12,9 @@ import io.grpc.ServerCallHandler; import io.grpc.ServerInterceptor; import io.grpc.Status; import io.opentelemetry.auto.api.MoreTags; -import io.opentelemetry.auto.instrumentation.api.AgentScope; -import io.opentelemetry.auto.instrumentation.api.AgentSpan; -import io.opentelemetry.auto.instrumentation.api.AgentSpan.Context; +import io.opentelemetry.context.Scope; +import io.opentelemetry.trace.Span; +import io.opentelemetry.trace.SpanContext; public class TracingServerInterceptor implements ServerInterceptor { @@ -30,29 +28,29 @@ public class TracingServerInterceptor implements ServerInterceptor { final Metadata headers, final ServerCallHandler next) { - final Context spanContext = propagate().extract(headers, GETTER); - final AgentSpan span = - startSpan("grpc.server", spanContext) - .setAttribute(MoreTags.RESOURCE_NAME, call.getMethodDescriptor().getFullMethodName()); + final SpanContext spanContext = TRACER.getHttpTextFormat().extract(headers, GETTER); + final Span span = TRACER.spanBuilder("grpc.server").setParent(spanContext).startSpan(); + span.setAttribute(MoreTags.RESOURCE_NAME, call.getMethodDescriptor().getFullMethodName()); + DECORATE.afterStart(span); - final AgentScope scope = activateSpan(span, false); - final ServerCall.Listener result; - try { - // Wrap the server call so that we can decorate the span - // with the resulting status - final TracingServerCall tracingServerCall = new TracingServerCall<>(span, call); + try (final Scope scope = TRACER.withSpan(span)) { - // call other interceptors - result = next.startCall(tracingServerCall, headers); - } catch (final Throwable e) { - DECORATE.onError(span, e); - DECORATE.beforeFinish(span); - span.finish(); - throw e; - } finally { - scope.close(); + try { + // Wrap the server call so that we can decorate the span + // with the resulting status + final TracingServerCall tracingServerCall = + new TracingServerCall<>(span, call); + + // call other interceptors + result = next.startCall(tracingServerCall, headers); + } catch (final Throwable e) { + DECORATE.onError(span, e); + DECORATE.beforeFinish(span); + span.end(); + throw e; + } } // This ensures the server implementation can see the span in scope @@ -61,9 +59,9 @@ public class TracingServerInterceptor implements ServerInterceptor { static final class TracingServerCall extends ForwardingServerCall.SimpleForwardingServerCall { - final AgentSpan span; + final Span span; - TracingServerCall(final AgentSpan span, final ServerCall delegate) { + TracingServerCall(final Span span, final ServerCall delegate) { super(delegate); this.span = span; } @@ -71,7 +69,7 @@ public class TracingServerInterceptor implements ServerInterceptor { @Override public void close(final Status status, final Metadata trailers) { DECORATE.onClose(span, status); - try (final AgentScope scope = activateSpan(span, false)) { + try (final Scope scope = TRACER.withSpan(span)) { delegate().close(status, trailers); } catch (final Throwable e) { DECORATE.onError(span, e); @@ -82,41 +80,42 @@ public class TracingServerInterceptor implements ServerInterceptor { static final class TracingServerCallListener extends ForwardingServerCallListener.SimpleForwardingServerCallListener { - private final AgentSpan span; + private final Span span; - TracingServerCallListener(final AgentSpan span, final ServerCall.Listener delegate) { + TracingServerCallListener(final Span span, final ServerCall.Listener delegate) { super(delegate); this.span = span; } @Override public void onMessage(final ReqT message) { - final AgentSpan span = - startSpan("grpc.message", this.span.context()) - .setAttribute("message.type", message.getClass().getName()); + final Span span = + TRACER.spanBuilder("grpc.message").setParent(this.span.getContext()).startSpan(); + span.setAttribute("message.type", message.getClass().getName()); DECORATE.afterStart(span); - final AgentScope scope = activateSpan(span, true); + final Scope scope = TRACER.withSpan(span); try { delegate().onMessage(message); } catch (final Throwable e) { DECORATE.onError(span, e); DECORATE.beforeFinish(this.span); - this.span.finish(); + this.span.end(); throw e; } finally { DECORATE.beforeFinish(span); + span.end(); scope.close(); } } @Override public void onHalfClose() { - try (final AgentScope scope = activateSpan(span, false)) { + try (final Scope scope = TRACER.withSpan(span)) { delegate().onHalfClose(); } catch (final Throwable e) { DECORATE.onError(span, e); DECORATE.beforeFinish(span); - span.finish(); + span.end(); throw e; } } @@ -124,7 +123,7 @@ public class TracingServerInterceptor implements ServerInterceptor { @Override public void onCancel() { // Finishes span. - try (final AgentScope scope = activateSpan(span, false)) { + try (final Scope scope = TRACER.withSpan(span)) { delegate().onCancel(); span.setAttribute("canceled", true); } catch (final Throwable e) { @@ -132,32 +131,32 @@ public class TracingServerInterceptor implements ServerInterceptor { throw e; } finally { DECORATE.beforeFinish(span); - span.finish(); + span.end(); } } @Override public void onComplete() { // Finishes span. - try (final AgentScope scope = activateSpan(span, false)) { + try (final Scope scope = TRACER.withSpan(span)) { delegate().onComplete(); } catch (final Throwable e) { DECORATE.onError(span, e); throw e; } finally { DECORATE.beforeFinish(span); - span.finish(); + span.end(); } } @Override public void onReady() { - try (final AgentScope scope = activateSpan(span, false)) { + try (final Scope scope = TRACER.withSpan(span)) { delegate().onReady(); } catch (final Throwable e) { DECORATE.onError(span, e); DECORATE.beforeFinish(span); - span.finish(); + span.end(); throw e; } } diff --git a/java-agent/instrumentation/grpc-1.5/src/test/groovy/GrpcTest.groovy b/java-agent/instrumentation/grpc-1.5/src/test/groovy/GrpcTest.groovy index 1ec6452867..ca0476fe31 100644 --- a/java-agent/instrumentation/grpc-1.5/src/test/groovy/GrpcTest.groovy +++ b/java-agent/instrumentation/grpc-1.5/src/test/groovy/GrpcTest.groovy @@ -2,7 +2,6 @@ import example.GreeterGrpc import example.Helloworld import io.grpc.BindableService import io.grpc.ManagedChannel -import io.grpc.Metadata import io.grpc.Server import io.grpc.Status import io.grpc.StatusRuntimeException @@ -12,7 +11,6 @@ import io.grpc.stub.StreamObserver import io.opentelemetry.auto.api.MoreTags import io.opentelemetry.auto.api.SpanTypes import io.opentelemetry.auto.instrumentation.api.Tags -import io.opentelemetry.auto.instrumentation.grpc.server.GrpcExtractAdapter import io.opentelemetry.auto.test.AgentTestRunner import io.opentelemetry.sdk.trace.SpanData @@ -270,17 +268,4 @@ class GrpcTest extends AgentTestRunner { "Status - description" | Status.PERMISSION_DENIED.withDescription("some description") "StatusRuntime - description" | Status.UNIMPLEMENTED.withDescription("some description") } - - def "skip binary headers"() { - setup: - def meta = new Metadata() - meta.put(Metadata.Key. of("test", Metadata.ASCII_STRING_MARSHALLER), "val") - meta.put(Metadata.Key. of("test-bin", Metadata.BINARY_BYTE_MARSHALLER), "bin-val".bytes) - - when: - def keys = GrpcExtractAdapter.GETTER.keys(meta) - - then: - keys == ["test"] - } } diff --git a/java-agent/testing/src/main/groovy/io/opentelemetry/auto/test/ListWriter.java b/java-agent/testing/src/main/groovy/io/opentelemetry/auto/test/ListWriter.java index 33478682d2..e46d21129e 100644 --- a/java-agent/testing/src/main/groovy/io/opentelemetry/auto/test/ListWriter.java +++ b/java-agent/testing/src/main/groovy/io/opentelemetry/auto/test/ListWriter.java @@ -24,7 +24,9 @@ import java.util.concurrent.CopyOnWriteArrayList; import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; import java.util.concurrent.atomic.AtomicInteger; +import lombok.extern.slf4j.Slf4j; +@Slf4j public class ListWriter implements SpanProcessor { private volatile List> traces = new CopyOnWriteArrayList<>(); @@ -40,11 +42,25 @@ public class ListWriter implements SpanProcessor { @Override public void onStart(final ReadableSpan readableSpan) { + final SpanData sd = readableSpan.toSpanData(); + log.debug( + ">>> SPAN START: {} id={} traceid={} parent={}", + sd.getName(), + sd.getSpanId().toLowerBase16(), + sd.getTraceId().toLowerBase16(), + sd.getParentSpanId().toLowerBase16()); spanOrders.put(readableSpan.getSpanContext().getSpanId(), nextSpanOrder.getAndIncrement()); } @Override public void onEnd(final ReadableSpan readableSpan) { + final SpanData sd = readableSpan.toSpanData(); + log.debug( + "<<< SPAN END: {} id={} traceid={} parent={}", + sd.getName(), + sd.getSpanId().toLowerBase16(), + sd.getTraceId().toLowerBase16(), + sd.getParentSpanId().toLowerBase16()); final SpanData span = readableSpan.toSpanData(); synchronized (structuralChangeLock) { boolean found = false;