From 860622fb571befcd89d3f72883b19ccd2f13c789 Mon Sep 17 00:00:00 2001 From: Adrian Cole Date: Mon, 18 Jan 2016 14:09:55 +0800 Subject: [PATCH] Pares down default http tags, but opens apis for adding more Previously, sleuth logged more data than necessary. This led to issues including spans approaching megabytes each. This pares down default keys to a minimal set, but allows users to opt-into logging more by extending `TraceFilter`. --- .../cloud/sleuth/TraceManager.java | 4 +- .../cloud/sleuth/instrument/TraceKeys.java | 95 +++++++++++++++++++ .../sleuth/instrument/web/TraceFilter.java | 66 ++++++------- .../web/TraceWebAutoConfiguration.java | 10 +- .../sleuth/trace/DefaultTraceManager.java | 2 +- .../instrument/web/TraceFilterTests.java | 48 ++++++---- .../main/java/sample/SampleBackground.java | 2 +- .../main/java/sample/SampleBackground.java | 2 +- .../main/java/sample/SampleController.java | 8 +- .../main/java/sample/SampleBackground.java | 2 +- .../main/java/sample/SampleController.java | 8 +- .../main/java/sample/SampleBackground.java | 2 +- .../main/java/sample/SampleController.java | 8 +- 13 files changed, 182 insertions(+), 75 deletions(-) create mode 100644 spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/TraceKeys.java diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/TraceManager.java b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/TraceManager.java index 0e150adad..408216630 100644 --- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/TraceManager.java +++ b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/TraceManager.java @@ -90,9 +90,9 @@ public interface TraceManager extends TraceAccessor { Trace continueSpan(Span s); /** - * Adds a data annotation to the current span if tracing is currently on. + * Adds a tag to the current span if tracing is currently on. */ - void addAnnotation(String key, String value); + void addTag(String key, String value); /** * Remove this span from the current thread, but don't stop it yet or send it for diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/TraceKeys.java b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/TraceKeys.java new file mode 100644 index 000000000..edc580f3b --- /dev/null +++ b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/TraceKeys.java @@ -0,0 +1,95 @@ +/* + * Copyright 2013-2016 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.cloud.sleuth.instrument; + +/** + * Well-known {@link org.springframework.cloud.sleuth.Span#tag(String, String) span tag} keys. + * + *

Overhead of adding Trace Data

+ * + * Overhead is directly related to the size of trace data exported out of process. Accordingly, it + * is better to tag what's important for latency troubleshooting, ie a whitelist, vs collecting + * everything and filtering downstream. The keys listed here are very common in tracing tools, and + * are considerate to the issue of overhead. + * + *

When evaluating new keys, consider how much additional data it implies, and if that data is + * critical to classifying, filtering or displaying traces. More data often means larger systems, + * less retention, or a lower sample rate. + * + *

For example, in zipkin, a thrift-encoded span with an "sr" annotation is 82 bytes plus the + * size of its name and associated service. The maximum size of an HTTP cookie is 4096 bytes, + * roughly 50x that. Even if compression helps, if you aren't analyzing based on cookies, storing + * them displaces resources that could be used for more traces. Meanwhile, you have another system + * storing private data! The takeaway isn't never store cookies, as there are valid cases for this. + * The takeaway is to be conscious about what's you are storing. + */ +public final class TraceKeys { + + /** + * The domain portion of the URL or host header. Ex. "mybucket.s3.amazonaws.com" + * + *

Used to filter by host as opposed to ip address. + */ + public static final String HTTP_HOST = "http/host"; + + /** + * The HTTP method, or verb, such as "GET" or "POST". + * + *

Used to filter against an http route. + */ + public static final String HTTP_METHOD = "http/method"; + + /** + * The absolute http path, without any query parameters. Ex. "/objects/abcd-ff" + * + *

Used to filter against an http route, portably with zipkin v1. + * + *

In zipkin v1, only equals filters are supported. Dropping query parameters makes the number + * of distinct URIs less. For example, one can query for the same resource, regardless of signing + * parameters encoded in the query line. This does not reduce cardinality to a HTTP single route. + * For example, it is common to express a route as an http URI template like + * "/resource/{resource_id}". In systems where only equals queries are available, searching for + * {@code http.uri=/resource} won't match if the actual request was "/resource/abcd-ff". + * + *

Historical note: This was commonly expressed as "http.uri" in zipkin, eventhough it was most + * often just a path. + */ + public static final String HTTP_PATH = "http/path"; + + /** + * The entire URL, including the scheme, host and query parameters if available. Ex. + * "https://mybucket.s3.amazonaws.com/objects/abcd-ff?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Algorithm=AWS4-HMAC-SHA256..." + * + *

Combined with {@link #HTTP_METHOD}, you can understand the fully-qualified request line. + * + *

This is optional as it may include private data or be of considerable length. + */ + public static final String HTTP_URL = "http/url"; + + /** + * The HTTP response code, when not in 2xx range. Ex. "503" + * + *

Used to filter for error status. + * + *

2xx range are not logged as success codes are less interesting for latency troubleshooting. + * Omitting saves at least 20 bytes per span. + */ + public static final String HTTP_STATUS_CODE = "http/status_code"; + + private TraceKeys() { // no instances + } +} diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/TraceFilter.java b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/TraceFilter.java index 88f8a0cf0..9fe15281a 100644 --- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/TraceFilter.java +++ b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/TraceFilter.java @@ -18,7 +18,6 @@ package org.springframework.cloud.sleuth.instrument.web; import static org.springframework.util.StringUtils.hasText; import java.io.IOException; -import java.util.Enumeration; import java.util.Random; import java.util.regex.Pattern; @@ -34,6 +33,7 @@ import org.springframework.cloud.sleuth.Trace; import org.springframework.cloud.sleuth.TraceManager; import org.springframework.cloud.sleuth.event.ServerReceivedEvent; import org.springframework.cloud.sleuth.event.ServerSentEvent; +import org.springframework.cloud.sleuth.instrument.TraceKeys; import org.springframework.cloud.sleuth.sampler.IsTracingSampler; import org.springframework.cloud.sleuth.trace.TraceContextHolder; import org.springframework.context.ApplicationEvent; @@ -50,7 +50,13 @@ import org.springframework.web.util.UrlPathHelper; * {@link Trace#TRACE_ID_NAME} header from either request or response and uses them to * create a new span. * + *

In order to keep the size of spans manageable, this only add tags defined in {@link TraceKeys}. + * If you need to add additional tags, such as headers subtype this and override + * {@link #addRequestTags} or {@link #addResponseTags}. + * * @see TraceManager + * @see TraceKeys + * @see TraceWebAutoConfiguration#traceWebFilter(TraceFilter) * * @author Jakub Nabrdalik, 4financeIT * @author Tomasz Nurkiewicz, 4financeIT @@ -156,7 +162,7 @@ public class TraceFilter extends OncePerRequestFilter Throwable exception = null; try { - addRequestAnnotations(request); + addRequestTags(request); filterChain.doFilter(request, response); } @@ -173,7 +179,7 @@ public class TraceFilter extends OncePerRequestFilter addToResponseIfNotPresent(response, Trace.NOT_SAMPLED_NAME, ""); } if (trace != null) { - addResponseAnnotations(response, exception); + addResponseTags(response, exception); addResponseHeaders(response, trace.getSpan()); if (trace.getSaved() != null) { publish(new ServerSentEvent(this, trace.getSaved().getSpan(), @@ -198,45 +204,28 @@ public class TraceFilter extends OncePerRequestFilter } } - // TODO: move annotation keys to constants - protected void addRequestAnnotations(HttpServletRequest request) { + /** Override to add annotations not defined in {@link TraceKeys}. */ + protected void addRequestTags(HttpServletRequest request) { String uri = this.urlPathHelper.getPathWithinApplication(request); - this.traceManager.addAnnotation("/http/request/uri", - request.getRequestURL().toString()); - this.traceManager.addAnnotation("/http/request/endpoint", uri); - this.traceManager.addAnnotation("/http/request/method", request.getMethod()); - - Enumeration headerNames = request.getHeaderNames(); - while (headerNames.hasMoreElements()) { - String name = headerNames.nextElement(); - Enumeration values = request.getHeaders(name); - while (values.hasMoreElements()) { - String value = values.nextElement(); - String key = "/http/request/headers/" + name.toLowerCase(); - this.traceManager.addAnnotation(key, value); - - } - } + this.traceManager.addTag(TraceKeys.HTTP_URL, getFullUrl(request)); + this.traceManager.addTag(TraceKeys.HTTP_HOST, request.getServerName()); + this.traceManager.addTag(TraceKeys.HTTP_PATH, uri); + this.traceManager.addTag(TraceKeys.HTTP_METHOD, request.getMethod()); } - private void addResponseAnnotations(HttpServletResponse response, Throwable e) { - if (response.getStatus() == HttpServletResponse.SC_OK && e != null) { + /** Override to add annotations not defined in {@link TraceKeys}. */ + protected void addResponseTags(HttpServletResponse response, Throwable e) { + int httpStatus = response.getStatus(); + if (httpStatus == HttpServletResponse.SC_OK && e != null) { // Filter chain threw exception but the response status may not have been set // yet, so we have to guess. - this.traceManager.addAnnotation("/http/response/status_code", + this.traceManager.addTag(TraceKeys.HTTP_STATUS_CODE, String.valueOf(HttpServletResponse.SC_INTERNAL_SERVER_ERROR)); } - else { - this.traceManager.addAnnotation("/http/response/status_code", + else if ((httpStatus < 200) || (httpStatus > 299)){ + this.traceManager.addTag(TraceKeys.HTTP_STATUS_CODE, String.valueOf(response.getStatus())); } - - for (String name : response.getHeaderNames()) { - for (String value : response.getHeaders(name)) { - String key = "/http/response/headers/" + name.toLowerCase(); - this.traceManager.addAnnotation(key, value); - } - } } private boolean hasHeader(HttpServletRequest request, HttpServletResponse response, @@ -262,4 +251,15 @@ public class TraceFilter extends OncePerRequestFilter protected boolean shouldNotFilterAsyncDispatch() { return false; } + + private String getFullUrl(HttpServletRequest request) { + StringBuffer requestURI = request.getRequestURL(); + String queryString = request.getQueryString(); + + if (queryString == null) { + return requestURI.toString(); + } else { + return requestURI.append('?').append(queryString).toString(); + } + } } diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/TraceWebAutoConfiguration.java b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/TraceWebAutoConfiguration.java index f848ee25d..b6775dea4 100644 --- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/TraceWebAutoConfiguration.java +++ b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/TraceWebAutoConfiguration.java @@ -22,6 +22,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.autoconfigure.AutoConfigureAfter; import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication; import org.springframework.boot.context.embedded.FilterRegistrationBean; @@ -66,12 +67,17 @@ public class TraceWebAutoConfiguration { } @Bean - public FilterRegistrationBean traceWebFilter(ApplicationEventPublisher publisher, Random random) { + @ConditionalOnMissingBean + public TraceFilter traceFilter(ApplicationEventPublisher publisher, Random random) { Pattern pattern = StringUtils.hasText(this.skipPattern) ? Pattern.compile(this.skipPattern) : TraceFilter.DEFAULT_SKIP_PATTERN; TraceFilter filter = new TraceFilter(this.traceManager, pattern, random); filter.setApplicationEventPublisher(publisher); - return new FilterRegistrationBean(filter); + return filter; } + @Bean + public FilterRegistrationBean traceWebFilter(TraceFilter filter) { + return new FilterRegistrationBean(filter); + } } diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/trace/DefaultTraceManager.java b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/trace/DefaultTraceManager.java index f136b375d..b5e3cb040 100644 --- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/trace/DefaultTraceManager.java +++ b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/trace/DefaultTraceManager.java @@ -198,7 +198,7 @@ public class DefaultTraceManager implements TraceManager { } @Override - public void addAnnotation(String key, String value) { + public void addTag(String key, String value) { Span s = getCurrentSpan(); if (s != null && s.isExportable()) { s.tag(key, value); diff --git a/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/web/TraceFilterTests.java b/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/web/TraceFilterTests.java index ee4a0fc8b..29ce5f14a 100644 --- a/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/web/TraceFilterTests.java +++ b/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/web/TraceFilterTests.java @@ -39,6 +39,8 @@ import org.springframework.test.web.servlet.request.MockHttpServletRequestBuilde import java.util.Random; +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.entry; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNull; @@ -80,7 +82,7 @@ public class TraceFilterTests { } public MockHttpServletRequestBuilder builder() { - return get("/").accept(MediaType.APPLICATION_JSON).header("User-Agent", + return get("/?foo=bar").accept(MediaType.APPLICATION_JSON).header("User-Agent", "MockMvc"); } @@ -102,7 +104,7 @@ public class TraceFilterTests { public void startsNewTrace() throws Exception { TraceFilter filter = new TraceFilter(this.traceManager); filter.doFilter(this.request, this.response, this.filterChain); - verifyHttpAnnotations(); + verifyHttpTags(); assertNull(TraceContextHolder.getCurrentTrace()); } @@ -115,7 +117,7 @@ public class TraceFilterTests { TraceFilter filter = new TraceFilter(this.traceManager); filter.doFilter(this.request, this.response, this.filterChain); - verifyHttpAnnotations(); + verifyHttpTags(); assertNull(TraceContextHolder.getCurrentTrace()); } @@ -129,7 +131,7 @@ public class TraceFilterTests { TraceFilter filter = new TraceFilter(this.traceManager); filter.doFilter(this.request, this.response, this.filterChain); - verifyHttpAnnotations(); + verifyHttpTags(); assertNull(TraceContextHolder.getCurrentTrace()); } @@ -151,30 +153,34 @@ public class TraceFilterTests { catch (RuntimeException e) { assertEquals("Planned", e.getMessage()); } - verifyHttpAnnotations(HttpStatus.INTERNAL_SERVER_ERROR); + verifyHttpTags(HttpStatus.INTERNAL_SERVER_ERROR); assertNull(TraceContextHolder.getCurrentTrace()); } - public void verifyHttpAnnotations() { - verifyHttpAnnotations(HttpStatus.OK); + public void verifyHttpTags() { + verifyHttpTags(HttpStatus.OK); } - public void verifyHttpAnnotations(HttpStatus status) { - hasAnnotation(this.span, "/http/request/uri", "http://localhost/"); - hasAnnotation(this.span, "/http/request/endpoint", "/"); - hasAnnotation(this.span, "/http/request/method", "GET"); - hasAnnotation(this.span, "/http/request/headers/accept", - MediaType.APPLICATION_JSON_VALUE); - hasAnnotation(this.span, "/http/request/headers/user-agent", "MockMvc"); + /** + * Shows the expansion of {@link import org.springframework.cloud.sleuth.instrument.TraceKeys}. + */ + public void verifyHttpTags(HttpStatus status) { + assertThat(this.span.tags()).contains( + entry("http/host", "localhost"), + entry("http/url", "http://localhost/?foo=bar"), + entry("http/path", "/"), + entry("http/method", "GET") + ); - hasAnnotation(this.span, "/http/response/status_code", status.toString()); - hasAnnotation(this.span, "/http/response/headers/content-type", - MediaType.APPLICATION_JSON_VALUE); - } - - private void hasAnnotation(Span span, String name, String value) { - assertEquals(value, span.tags().get(name)); + // Status is only interesting in non-success case. Omitting it saves at least 20bytes per span. + if (status.is2xxSuccessful()) { + assertThat(this.span.tags()) + .doesNotContainKey("http/status_code"); + } else { + assertThat(this.span.tags()) + .containsEntry("http/status_code", status.toString()); + } } private class DelegateSampler implements Sampler { diff --git a/spring-cloud-sleuth-samples/spring-cloud-sleuth-sample-messaging/src/main/java/sample/SampleBackground.java b/spring-cloud-sleuth-samples/spring-cloud-sleuth-sample-messaging/src/main/java/sample/SampleBackground.java index 61152ba4e..0a625f579 100644 --- a/spring-cloud-sleuth-samples/spring-cloud-sleuth-sample-messaging/src/main/java/sample/SampleBackground.java +++ b/spring-cloud-sleuth-samples/spring-cloud-sleuth-sample-messaging/src/main/java/sample/SampleBackground.java @@ -40,7 +40,7 @@ public class SampleBackground { public void background() { int millis = random.nextInt(1000); Thread.sleep(millis); - this.traceManager.addAnnotation("background-sleep-millis", String.valueOf(millis)); + this.traceManager.addTag("background-sleep-millis", String.valueOf(millis)); } } diff --git a/spring-cloud-sleuth-samples/spring-cloud-sleuth-sample-stream/src/main/java/sample/SampleBackground.java b/spring-cloud-sleuth-samples/spring-cloud-sleuth-sample-stream/src/main/java/sample/SampleBackground.java index d7d1fa6d7..e988d5064 100644 --- a/spring-cloud-sleuth-samples/spring-cloud-sleuth-sample-stream/src/main/java/sample/SampleBackground.java +++ b/spring-cloud-sleuth-samples/spring-cloud-sleuth-sample-stream/src/main/java/sample/SampleBackground.java @@ -40,7 +40,7 @@ public class SampleBackground { final Random random = new Random(); int millis = random.nextInt(1000); Thread.sleep(millis); - this.traceManager.addAnnotation("background-sleep-millis", String.valueOf(millis)); + this.traceManager.addTag("background-sleep-millis", String.valueOf(millis)); } } diff --git a/spring-cloud-sleuth-samples/spring-cloud-sleuth-sample-stream/src/main/java/sample/SampleController.java b/spring-cloud-sleuth-samples/spring-cloud-sleuth-sample-stream/src/main/java/sample/SampleController.java index 38de64a39..5ffa1980c 100644 --- a/spring-cloud-sleuth-samples/spring-cloud-sleuth-sample-stream/src/main/java/sample/SampleController.java +++ b/spring-cloud-sleuth-samples/spring-cloud-sleuth-sample-stream/src/main/java/sample/SampleController.java @@ -69,7 +69,7 @@ ApplicationListener { public String call() throws Exception { int millis = random.nextInt(1000); Thread.sleep(millis); - SampleController.this.traceManager.addAnnotation("callable-sleep-millis", String.valueOf(millis)); + SampleController.this.traceManager.addTag("callable-sleep-millis", String.valueOf(millis)); Span currentSpan = SampleController.this.accessor.getCurrentSpan(); return "async hi: " + currentSpan; } @@ -87,7 +87,7 @@ ApplicationListener { public String hi2() { int millis = random.nextInt(1000); Thread.sleep(millis); - this.traceManager.addAnnotation("random-sleep-millis", String.valueOf(millis)); + this.traceManager.addTag("random-sleep-millis", String.valueOf(millis)); return "hi2"; } @@ -99,7 +99,7 @@ ApplicationListener { int millis = random.nextInt(1000); log.info("Sleeping for {} millis", millis); Thread.sleep(millis); - this.traceManager.addAnnotation("random-sleep-millis", String.valueOf(millis)); + this.traceManager.addTag("random-sleep-millis", String.valueOf(millis)); String s = this.restTemplate.getForObject("http://localhost:" + this.port + "/call", String.class); @@ -113,7 +113,7 @@ ApplicationListener { int millis = random.nextInt(1000); log.info("Sleeping for {} millis", millis); Thread.sleep(millis); - this.traceManager.addAnnotation("random-sleep-millis", String.valueOf(millis)); + this.traceManager.addTag("random-sleep-millis", String.valueOf(millis)); String s = this.restTemplate.getForObject("http://localhost:" + this.port + "/call", String.class); diff --git a/spring-cloud-sleuth-samples/spring-cloud-sleuth-sample-zipkin/src/main/java/sample/SampleBackground.java b/spring-cloud-sleuth-samples/spring-cloud-sleuth-sample-zipkin/src/main/java/sample/SampleBackground.java index 61152ba4e..0a625f579 100644 --- a/spring-cloud-sleuth-samples/spring-cloud-sleuth-sample-zipkin/src/main/java/sample/SampleBackground.java +++ b/spring-cloud-sleuth-samples/spring-cloud-sleuth-sample-zipkin/src/main/java/sample/SampleBackground.java @@ -40,7 +40,7 @@ public class SampleBackground { public void background() { int millis = random.nextInt(1000); Thread.sleep(millis); - this.traceManager.addAnnotation("background-sleep-millis", String.valueOf(millis)); + this.traceManager.addTag("background-sleep-millis", String.valueOf(millis)); } } diff --git a/spring-cloud-sleuth-samples/spring-cloud-sleuth-sample-zipkin/src/main/java/sample/SampleController.java b/spring-cloud-sleuth-samples/spring-cloud-sleuth-sample-zipkin/src/main/java/sample/SampleController.java index 38de64a39..5ffa1980c 100644 --- a/spring-cloud-sleuth-samples/spring-cloud-sleuth-sample-zipkin/src/main/java/sample/SampleController.java +++ b/spring-cloud-sleuth-samples/spring-cloud-sleuth-sample-zipkin/src/main/java/sample/SampleController.java @@ -69,7 +69,7 @@ ApplicationListener { public String call() throws Exception { int millis = random.nextInt(1000); Thread.sleep(millis); - SampleController.this.traceManager.addAnnotation("callable-sleep-millis", String.valueOf(millis)); + SampleController.this.traceManager.addTag("callable-sleep-millis", String.valueOf(millis)); Span currentSpan = SampleController.this.accessor.getCurrentSpan(); return "async hi: " + currentSpan; } @@ -87,7 +87,7 @@ ApplicationListener { public String hi2() { int millis = random.nextInt(1000); Thread.sleep(millis); - this.traceManager.addAnnotation("random-sleep-millis", String.valueOf(millis)); + this.traceManager.addTag("random-sleep-millis", String.valueOf(millis)); return "hi2"; } @@ -99,7 +99,7 @@ ApplicationListener { int millis = random.nextInt(1000); log.info("Sleeping for {} millis", millis); Thread.sleep(millis); - this.traceManager.addAnnotation("random-sleep-millis", String.valueOf(millis)); + this.traceManager.addTag("random-sleep-millis", String.valueOf(millis)); String s = this.restTemplate.getForObject("http://localhost:" + this.port + "/call", String.class); @@ -113,7 +113,7 @@ ApplicationListener { int millis = random.nextInt(1000); log.info("Sleeping for {} millis", millis); Thread.sleep(millis); - this.traceManager.addAnnotation("random-sleep-millis", String.valueOf(millis)); + this.traceManager.addTag("random-sleep-millis", String.valueOf(millis)); String s = this.restTemplate.getForObject("http://localhost:" + this.port + "/call", String.class); diff --git a/spring-cloud-sleuth-samples/spring-cloud-sleuth-sample/src/main/java/sample/SampleBackground.java b/spring-cloud-sleuth-samples/spring-cloud-sleuth-sample/src/main/java/sample/SampleBackground.java index 61152ba4e..0a625f579 100644 --- a/spring-cloud-sleuth-samples/spring-cloud-sleuth-sample/src/main/java/sample/SampleBackground.java +++ b/spring-cloud-sleuth-samples/spring-cloud-sleuth-sample/src/main/java/sample/SampleBackground.java @@ -40,7 +40,7 @@ public class SampleBackground { public void background() { int millis = random.nextInt(1000); Thread.sleep(millis); - this.traceManager.addAnnotation("background-sleep-millis", String.valueOf(millis)); + this.traceManager.addTag("background-sleep-millis", String.valueOf(millis)); } } diff --git a/spring-cloud-sleuth-samples/spring-cloud-sleuth-sample/src/main/java/sample/SampleController.java b/spring-cloud-sleuth-samples/spring-cloud-sleuth-sample/src/main/java/sample/SampleController.java index 38de64a39..5ffa1980c 100644 --- a/spring-cloud-sleuth-samples/spring-cloud-sleuth-sample/src/main/java/sample/SampleController.java +++ b/spring-cloud-sleuth-samples/spring-cloud-sleuth-sample/src/main/java/sample/SampleController.java @@ -69,7 +69,7 @@ ApplicationListener { public String call() throws Exception { int millis = random.nextInt(1000); Thread.sleep(millis); - SampleController.this.traceManager.addAnnotation("callable-sleep-millis", String.valueOf(millis)); + SampleController.this.traceManager.addTag("callable-sleep-millis", String.valueOf(millis)); Span currentSpan = SampleController.this.accessor.getCurrentSpan(); return "async hi: " + currentSpan; } @@ -87,7 +87,7 @@ ApplicationListener { public String hi2() { int millis = random.nextInt(1000); Thread.sleep(millis); - this.traceManager.addAnnotation("random-sleep-millis", String.valueOf(millis)); + this.traceManager.addTag("random-sleep-millis", String.valueOf(millis)); return "hi2"; } @@ -99,7 +99,7 @@ ApplicationListener { int millis = random.nextInt(1000); log.info("Sleeping for {} millis", millis); Thread.sleep(millis); - this.traceManager.addAnnotation("random-sleep-millis", String.valueOf(millis)); + this.traceManager.addTag("random-sleep-millis", String.valueOf(millis)); String s = this.restTemplate.getForObject("http://localhost:" + this.port + "/call", String.class); @@ -113,7 +113,7 @@ ApplicationListener { int millis = random.nextInt(1000); log.info("Sleeping for {} millis", millis); Thread.sleep(millis); - this.traceManager.addAnnotation("random-sleep-millis", String.valueOf(millis)); + this.traceManager.addTag("random-sleep-millis", String.valueOf(millis)); String s = this.restTemplate.getForObject("http://localhost:" + this.port + "/call", String.class);