# Notes ## TODO: - Web Server - Async servlet - Reactive servlet - Zuul - Web Clients - Reactive WebClient - Feign - Hystrix - Messaging - Reactor - RxJava Discuss what do we do with the `TraceKeys` in callables / runnables ## Done: - Web Server - Simple handler interceptor - Web Clients - RestTemplate - Slf4j - with Brave in place it will also work for any other implementation (e.g. log4j) - Async - Runnable / Callable - TraceExecutors etc. - @Async - Scheduling ## Removed features - `SpanLogger` - Name pattern of Span Logger will not be applicable - `Sampler` - TODO: describe the new sampling mechanism - `Metric` - TODO: discuss what happens to `SpanMetricReporter` - is anybody actually using it? # Migrations ## Core With Brave instrumentation there are 2 different lifecycles. - Span creation and stopping and span reporting. - Span hooking to current context When `brave.Span.finish()` is called the span gets stopped and reported. In order to hook in the span to current context you need to call the try-with-resources clause via `withSpanInScope` `try (Tracer.SpanInScope ws = this.tracing.tracer().withSpanInScope(this.span.start())) { // do sth with the span } finally { this.span.finish(); }` ### Sleuth's Tracer to brave.Tracing Before ``` import org.springframework.cloud.sleuth.Tracer; Tracer tracer; ``` After ``` import brave.Tracing; Tracing tracing; ``` ### Child span creation Before ``` Span child = tracer.createSpan("name"); ``` After ``` // tracing is brave.Tracing injected instead of Sleuth's Tracer brave.Span span = tracing.tracer().nextSpan().name("name"); ``` ### Span closing Before ``` Span child = tracer.createSpan("name"); try { // do sth } finally { tracer.close(child); } ``` After ``` // tracing is brave.Tracing injected instead of Sleuth's Tracer brave.Span span = this.tracing.tracer().nextSpan().name("name"); try { // do sth } finally { span.finish(); } ``` ### Span tagging Before ``` tracer.addTag("foo", "bar"); ``` After ``` // tracing is brave.Tracing injected instead of Sleuth's Tracer this.tracing.tracer().currentSpan().tag("foo", "bar"); ``` ## `ArayListSpanAccumulator` renamed to `ArrayListSpanReporter` Before ``` org.springframework.cloud.sleuth.util.ArrayListSpanAccumulator ``` After ``` org.springframework.cloud.sleuth.util.ArrayListSpanReporter ``` ## Percentage -> Probability `org.springframework.cloud.brave.sampler.SamplerProperties#percentage` renamed to `org.springframework.cloud.brave.sampler.SamplerProperties#probability` and `org.springframework.cloud.sleuth.sampler.PercentageBasedSampler` renamed to `org.springframework.cloud.sleuth.sampler.ProbabilityBasedSampler` Related to https://github.com/spring-cloud/spring-cloud-sleuth/issues/397 ## Async ### `TraceRunnable` and `TraceCallable` moved to `instrument.async` Before ``` org.springframework.cloud.sleuth.TraceRunnable org.springframework.cloud.sleuth.TraceCallable ``` After ``` org.springframework.cloud.sleuth.instrument.async.TraceRunnable org.springframework.cloud.sleuth.instrument.async.TraceCallable ``` ### `TraceableExecutorService` has the constructor with `BeanFactory` remaining Before ``` public TraceableExecutorService(final ExecutorService delegate, final Tracer tracer, TraceKeys traceKeys, SpanNamer spanNamer) { //... } public TraceableExecutorService(BeanFactory beanFactory, final ExecutorService delegate) { //... } public TraceableExecutorService(final ExecutorService delegate, final Tracer tracer, TraceKeys traceKeys, SpanNamer spanNamer, String spanName) { //... } ``` After ``` public TraceableExecutorService(BeanFactory beanFactory, final ExecutorService delegate) { //... } public TraceableExecutorService(BeanFactory beanFactory, final ExecutorService delegate, String spanName) { //... } ``` ### `TraceableScheduledExecutorService` changed constructor Before ``` public TraceableScheduledExecutorService(ScheduledExecutorService delegate, Tracer tracer, TraceKeys traceKeys, SpanNamer spanNamer) { super(delegate, tracer, traceKeys, spanNamer); } ``` After ``` public TraceableScheduledExecutorService(BeanFactory beanFactory, final ExecutorService delegate) { super(beanFactory, delegate); } ``` ### `TraceAsyncAspect` changed constructor Before ``` @Deprecated public TraceAsyncAspect(Tracer tracer, TraceKeys traceKeys, BeanFactory beanFactory) { this.tracer = tracer; this.traceKeys = traceKeys; this.beanFactory = beanFactory; } public TraceAsyncAspect(Tracer tracer, TraceKeys traceKeys, SpanNamer spanNamer) { this.tracer = tracer; this.traceKeys = traceKeys; this.spanNamer = spanNamer; this.beanFactory = null; } ``` After ``` public TraceAsyncAspect(Tracing tracing, SpanNamer spanNamer, TraceKeys traceKeys) { // } ```