@Test public void propagates_sampledFalse() throws Exception { brave = braveBuilder(Sampler.NEVER_SAMPLE).build(); close(); client = newClient(server.getPort()); server.enqueue(new MockResponse()); get(client, "/foo"); RecordedRequest request = server.takeRequest(); assertThat(request.getHeaders().toMultimap()) .doesNotContainKeys("x-b3-traceId", "x-b3-parentSpanId", "x-b3-spanId") .containsEntry("x-b3-sampled", asList("0")); }
@After public void close() throws IOException { closeClient(client); }
@Test public void supportsSpanNameProvider() throws Exception { close(); client = newClient(server.getPort(), r -> r.getUri().getPath()); server.enqueue(new MockResponse()); get(client, "/foo"); assertThat(collectedSpans()) .extracting(Span::name) .containsExactly("/foo"); }
@Before public void setup() { brave = braveBuilder(Sampler.ALWAYS_SAMPLE).build(); client = newClient(server.getPort()); }
@Test public void addsErrorTagOnTransportException() throws Exception { reportsSpanOnTransportException(); assertThat(collectedSpans()) .flatExtracting(s -> s.tags().keySet()) .contains("error"); }
@Test public void reportsSpanOnTransportException() throws Exception { server.enqueue(new MockResponse().setSocketPolicy(SocketPolicy.DISCONNECT_AT_START)); try { get(client, "/foo"); } catch (Exception e) { // ok, but the span should include an error! } assertThat(collectedSpans()).hasSize(1); }
@Test public void propagatesSpan() throws Exception { server.enqueue(new MockResponse()); get(client, "/foo"); RecordedRequest request = server.takeRequest(); assertThat(request.getHeaders().toMultimap()) .containsKeys("x-b3-traceId", "x-b3-spanId") .containsEntry("x-b3-sampled", asList("1")); }
/** * This tests that the parent is determined at the time the request was made, not when the request * was executed. */ @Test public void usesParentFromInvocationTime_local() throws Exception { server.enqueue(new MockResponse().setBodyDelay(1, TimeUnit.SECONDS)); server.enqueue(new MockResponse()); SpanId parent = brave.localTracer().startNewSpan(getClass().getSimpleName(), "test"); try { getAsync(client, "/foo"); getAsync(client, "/foo"); } finally { brave.localTracer().finishSpan(); } // changing the local span after the fact! brave.localTracer().startNewSpan(getClass().getSimpleName(), "test"); try { for (int i = 0; i < 2; i++) { RecordedRequest request = server.takeRequest(); assertThat(request.getHeader("x-b3-traceId")) .isEqualTo(parent.traceIdString()); assertThat(request.getHeader("x-b3-parentspanid")) .endsWith(IdConversion.convertToString(parent.spanId)); } } finally { brave.localTracer().finishSpan(); } }
@Test public void defaultSpanNameIsMethodName() throws Exception { server.enqueue(new MockResponse()); get(client, "/foo"); assertThat(collectedSpans()) .extracting(Span::name) .containsExactly("get"); }
@Test public void usesExistingTraceId_local() throws Exception { server.enqueue(new MockResponse()); SpanId parent = brave.localTracer().startNewSpan(getClass().getSimpleName(), "test"); try { get(client, "/foo"); } finally { brave.localTracer().finishSpan(); } RecordedRequest request = server.takeRequest(); assertThat(request.getHeader("x-b3-traceId")) .isEqualTo(parent.traceIdString()); assertThat(request.getHeader("x-b3-parentspanid")) .endsWith(IdConversion.convertToString(parent.spanId)); }
@Test public void usesParentFromInvocationTime_server() throws Exception { server.enqueue(new MockResponse().setBodyDelay(1, TimeUnit.SECONDS)); server.enqueue(new MockResponse()); brave.serverTracer().setStateUnknown("test"); ServerSpan parent = brave.serverSpanThreadBinder().getCurrentServerSpan(); try { getAsync(client, "/foo"); getAsync(client, "/foo"); } finally { brave.serverTracer().clearCurrentSpan(); } // changing the server span after the fact! brave.serverTracer().setStateUnknown("test"); try { for (int i = 0; i < 2; i++) { RecordedRequest request = server.takeRequest(); assertThat(request.getHeader("x-b3-traceId")) .endsWith(IdConversion.convertToString(parent.getSpan().getTrace_id())); assertThat(request.getHeader("x-b3-parentspanid")) .endsWith(IdConversion.convertToString(parent.getSpan().getId())); } } finally { brave.serverTracer().clearCurrentSpan(); } }
@Test public void reportsClientAnnotationsToZipkin() throws Exception { server.enqueue(new MockResponse()); get(client, "/foo"); assertThat(collectedSpans()) .extracting(Span::kind) .containsOnly(Span.Kind.CLIENT); }
@Test public void usesExistingTraceId_server() throws Exception { server.enqueue(new MockResponse()); brave.serverTracer().setStateUnknown("test"); ServerSpan parent = brave.serverSpanThreadBinder().getCurrentServerSpan(); try { get(client, "/foo"); } finally { brave.serverTracer().clearCurrentSpan(); } RecordedRequest request = server.takeRequest(); assertThat(request.getHeader("x-b3-traceId")) .endsWith(IdConversion.convertToString(parent.getSpan().getTrace_id())); assertThat(request.getHeader("x-b3-parentspanid")) .endsWith(IdConversion.convertToString(parent.getSpan().getId())); }
@Test public void httpUrlTagIncludesQueryParams() throws Exception { String path = "/foo?z=2&yAA=1"; server.enqueue(new MockResponse()); get(client, path); assertThat(collectedSpans()) .flatExtracting(s -> s.tags().entrySet()) .contains(entry("http.url", server.url(path).toString())); }
@Test public void addsStatusCodeWhenNotOk() throws Exception { server.enqueue(new MockResponse().setResponseCode(404)); try { get(client, "/foo"); } catch (RuntimeException e) { // some clients think 404 is an error } assertThat(collectedSpans()) .flatExtracting(s -> s.tags().entrySet()) .contains(entry("http.status_code", "404")); }