Skip to content

Instantly share code, notes, and snippets.

@marcingrzejszczak
Last active April 21, 2021 11:48
Show Gist options
  • Select an option

  • Save marcingrzejszczak/d3c15a0c11dda71970e42c513c9c0e09 to your computer and use it in GitHub Desktop.

Select an option

Save marcingrzejszczak/d3c15a0c11dda71970e42c513c9c0e09 to your computer and use it in GitHub Desktop.
Notes on Sleuth to Brave migration

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 spring-cloud/spring-cloud-sleuth#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) {
		//
	}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment