@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 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 defaultSpanNameIsMethodName() throws Exception { server.enqueue(new MockResponse()); get(client, "/foo"); assertThat(collectedSpans()) .extracting(Span::name) .containsExactly("get"); }
@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 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")); }
@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")); }
@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"); }
@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 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")); }
@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())); }