core: Update gRPC to use span kind and raw full method. (#5328)

This commit is contained in:
Bogdan Drutu 2019-02-11 11:04:20 -08:00 committed by Kun Zhang
parent b03a793405
commit d47379947f
2 changed files with 22 additions and 38 deletions

View File

@ -37,6 +37,7 @@ import io.opencensus.trace.EndSpanOptions;
import io.opencensus.trace.MessageEvent; import io.opencensus.trace.MessageEvent;
import io.opencensus.trace.MessageEvent.Type; import io.opencensus.trace.MessageEvent.Type;
import io.opencensus.trace.Span; import io.opencensus.trace.Span;
import io.opencensus.trace.Span.Kind;
import io.opencensus.trace.SpanContext; import io.opencensus.trace.SpanContext;
import io.opencensus.trace.Status; import io.opencensus.trace.Status;
import io.opencensus.trace.Tracer; import io.opencensus.trace.Tracer;
@ -234,10 +235,9 @@ final class CensusTracingModule {
this.isSampledToLocalTracing = method.isSampledToLocalTracing(); this.isSampledToLocalTracing = method.isSampledToLocalTracing();
this.span = this.span =
censusTracer censusTracer
.spanBuilderWithExplicitParent( .spanBuilderWithExplicitParent(method.getFullMethodName(), parentSpan)
generateTraceSpanName(false, method.getFullMethodName()),
parentSpan)
.setRecordEvents(true) .setRecordEvents(true)
.setSpanKind(Kind.CLIENT)
.startSpan(); .startSpan();
} }
@ -303,10 +303,9 @@ final class CensusTracingModule {
checkNotNull(fullMethodName, "fullMethodName"); checkNotNull(fullMethodName, "fullMethodName");
this.span = this.span =
censusTracer censusTracer
.spanBuilderWithRemoteParent( .spanBuilderWithRemoteParent(fullMethodName, remoteSpan)
generateTraceSpanName(true, fullMethodName),
remoteSpan)
.setRecordEvents(true) .setRecordEvents(true)
.setSpanKind(Kind.SERVER)
.startSpan(); .startSpan();
} }
@ -402,19 +401,4 @@ final class CensusTracingModule {
}; };
} }
} }
/**
* Convert a full method name to a tracing span name.
*
* @param isServer {@code false} if the span is on the client-side, {@code true} if on the
* server-side
* @param fullMethodName the method name as returned by
* {@link MethodDescriptor#getFullMethodName}.
*/
@VisibleForTesting
static String generateTraceSpanName(boolean isServer, String fullMethodName) {
String prefix = isServer ? "Recv" : "Sent";
return prefix + "." + fullMethodName.replace('/', '.');
}
} }

View File

@ -72,6 +72,7 @@ import io.opencensus.trace.EndSpanOptions;
import io.opencensus.trace.MessageEvent; import io.opencensus.trace.MessageEvent;
import io.opencensus.trace.MessageEvent.Type; import io.opencensus.trace.MessageEvent.Type;
import io.opencensus.trace.Span; import io.opencensus.trace.Span;
import io.opencensus.trace.Span.Kind;
import io.opencensus.trace.SpanBuilder; import io.opencensus.trace.SpanBuilder;
import io.opencensus.trace.SpanContext; import io.opencensus.trace.SpanContext;
import io.opencensus.trace.Tracer; import io.opencensus.trace.Tracer;
@ -294,12 +295,14 @@ public class CensusModulesTest {
if (nonDefaultContext) { if (nonDefaultContext) {
verify(tracer).spanBuilderWithExplicitParent( verify(tracer).spanBuilderWithExplicitParent(
eq("Sent.package1.service2.method3"), same(fakeClientParentSpan)); eq("package1.service2/method3"), same(fakeClientParentSpan));
verify(spyClientSpanBuilder).setRecordEvents(eq(true)); verify(spyClientSpanBuilder).setRecordEvents(eq(true));
verify(spyClientSpanBuilder).setSpanKind(eq(Kind.CLIENT));
} else { } else {
verify(tracer).spanBuilderWithExplicitParent( verify(tracer).spanBuilderWithExplicitParent(
eq("Sent.package1.service2.method3"), isNull(Span.class)); eq("package1.service2/method3"), isNull(Span.class));
verify(spyClientSpanBuilder).setRecordEvents(eq(true)); verify(spyClientSpanBuilder).setRecordEvents(eq(true));
verify(spyClientSpanBuilder).setSpanKind(eq(Kind.CLIENT));
} }
verify(spyClientSpan, never()).end(any(EndSpanOptions.class)); verify(spyClientSpan, never()).end(any(EndSpanOptions.class));
@ -497,7 +500,7 @@ public class CensusModulesTest {
ClientStreamTracer clientStreamTracer = ClientStreamTracer clientStreamTracer =
callTracer.newClientStreamTracer(CallOptions.DEFAULT, headers); callTracer.newClientStreamTracer(CallOptions.DEFAULT, headers);
verify(tracer).spanBuilderWithExplicitParent( verify(tracer).spanBuilderWithExplicitParent(
eq("Sent.package1.service2.method3"), isNull(Span.class)); eq("package1.service2/method3"), isNull(Span.class));
verify(spyClientSpan, never()).end(any(EndSpanOptions.class)); verify(spyClientSpan, never()).end(any(EndSpanOptions.class));
clientStreamTracer.outboundMessage(0); clientStreamTracer.outboundMessage(0);
@ -604,8 +607,9 @@ public class CensusModulesTest {
CensusTracingModule.ClientCallTracer callTracer = CensusTracingModule.ClientCallTracer callTracer =
censusTracing.newClientCallTracer(fakeClientParentSpan, method); censusTracing.newClientCallTracer(fakeClientParentSpan, method);
verify(tracer).spanBuilderWithExplicitParent( verify(tracer).spanBuilderWithExplicitParent(
eq("Sent.package1.service2.method3"), same(fakeClientParentSpan)); eq("package1.service2/method3"), same(fakeClientParentSpan));
verify(spyClientSpanBuilder).setRecordEvents(eq(true)); verify(spyClientSpanBuilder).setRecordEvents(eq(true));
verify(spyClientSpanBuilder).setSpanKind(eq(Kind.CLIENT));
callTracer.callEnded(Status.DEADLINE_EXCEEDED.withDescription("3 seconds")); callTracer.callEnded(Status.DEADLINE_EXCEEDED.withDescription("3 seconds"));
verify(spyClientSpan).end( verify(spyClientSpan).end(
@ -780,8 +784,9 @@ public class CensusModulesTest {
verify(mockTracingPropagationHandler).toByteArray(same(fakeClientSpanContext)); verify(mockTracingPropagationHandler).toByteArray(same(fakeClientSpanContext));
verifyNoMoreInteractions(mockTracingPropagationHandler); verifyNoMoreInteractions(mockTracingPropagationHandler);
verify(tracer).spanBuilderWithExplicitParent( verify(tracer).spanBuilderWithExplicitParent(
eq("Sent.package1.service2.method3"), same(fakeClientParentSpan)); eq("package1.service2/method3"), same(fakeClientParentSpan));
verify(spyClientSpanBuilder).setRecordEvents(eq(true)); verify(spyClientSpanBuilder).setRecordEvents(eq(true));
verify(spyClientSpanBuilder).setSpanKind(eq(Kind.CLIENT));
verifyNoMoreInteractions(tracer); verifyNoMoreInteractions(tracer);
assertTrue(headers.containsKey(censusTracing.tracingHeader)); assertTrue(headers.containsKey(censusTracing.tracingHeader));
@ -790,8 +795,9 @@ public class CensusModulesTest {
method.getFullMethodName(), headers); method.getFullMethodName(), headers);
verify(mockTracingPropagationHandler).fromByteArray(same(binarySpanContext)); verify(mockTracingPropagationHandler).fromByteArray(same(binarySpanContext));
verify(tracer).spanBuilderWithRemoteParent( verify(tracer).spanBuilderWithRemoteParent(
eq("Recv.package1.service2.method3"), same(spyClientSpan.getContext())); eq("package1.service2/method3"), same(spyClientSpan.getContext()));
verify(spyServerSpanBuilder).setRecordEvents(eq(true)); verify(spyServerSpanBuilder).setRecordEvents(eq(true));
verify(spyServerSpanBuilder).setSpanKind(eq(Kind.SERVER));
Context filteredContext = serverTracer.filterContext(Context.ROOT); Context filteredContext = serverTracer.filterContext(Context.ROOT);
assertSame(spyServerSpan, ContextUtils.CONTEXT_SPAN_KEY.get(filteredContext)); assertSame(spyServerSpan, ContextUtils.CONTEXT_SPAN_KEY.get(filteredContext));
@ -861,8 +867,10 @@ public class CensusModulesTest {
censusTracing.getServerTracerFactory().newServerStreamTracer( censusTracing.getServerTracerFactory().newServerStreamTracer(
method.getFullMethodName(), headers); method.getFullMethodName(), headers);
verify(tracer).spanBuilderWithRemoteParent( verify(tracer).spanBuilderWithRemoteParent(
eq("Recv.package1.service2.method3"), isNull(SpanContext.class)); eq("package1.service2/method3"), isNull(SpanContext.class));
verify(spyServerSpanBuilder).setRecordEvents(eq(true)); verify(spyServerSpanBuilder).setRecordEvents(eq(true));
verify(spyServerSpanBuilder).setSpanKind(eq(Kind.SERVER));
} }
@Test @Test
@ -1013,8 +1021,9 @@ public class CensusModulesTest {
tracerFactory.newServerStreamTracer(method.getFullMethodName(), new Metadata()); tracerFactory.newServerStreamTracer(method.getFullMethodName(), new Metadata());
verifyZeroInteractions(mockTracingPropagationHandler); verifyZeroInteractions(mockTracingPropagationHandler);
verify(tracer).spanBuilderWithRemoteParent( verify(tracer).spanBuilderWithRemoteParent(
eq("Recv.package1.service2.method3"), isNull(SpanContext.class)); eq("package1.service2/method3"), isNull(SpanContext.class));
verify(spyServerSpanBuilder).setRecordEvents(eq(true)); verify(spyServerSpanBuilder).setRecordEvents(eq(true));
verify(spyServerSpanBuilder).setSpanKind(eq(Kind.SERVER));
Context filteredContext = serverStreamTracer.filterContext(Context.ROOT); Context filteredContext = serverStreamTracer.filterContext(Context.ROOT);
assertSame(spyServerSpan, ContextUtils.CONTEXT_SPAN_KEY.get(filteredContext)); assertSame(spyServerSpan, ContextUtils.CONTEXT_SPAN_KEY.get(filteredContext));
@ -1110,15 +1119,6 @@ public class CensusModulesTest {
} }
} }
@Test
public void generateTraceSpanName() {
assertEquals(
"Sent.io.grpc.Foo", CensusTracingModule.generateTraceSpanName(false, "io.grpc/Foo"));
assertEquals(
"Recv.io.grpc.Bar", CensusTracingModule.generateTraceSpanName(true, "io.grpc/Bar"));
}
private static void assertNoServerContent(StatsTestUtils.MetricsRecord record) { private static void assertNoServerContent(StatsTestUtils.MetricsRecord record) {
assertNull(record.getMetric(DeprecatedCensusConstants.RPC_SERVER_ERROR_COUNT)); assertNull(record.getMetric(DeprecatedCensusConstants.RPC_SERVER_ERROR_COUNT));
assertNull(record.getMetric(DeprecatedCensusConstants.RPC_SERVER_REQUEST_COUNT)); assertNull(record.getMetric(DeprecatedCensusConstants.RPC_SERVER_REQUEST_COUNT));