You can also modify the behaviour of the TraceFilter - the component that is responsible
for processing the input HTTP request and adding tags basing on the HTTP response. You can customize
the tags, or modify the response headers by registering your own instance of the TraceFilter bean.
In the following example we will register the TraceFilter bean and we will add the
ZIPKIN-TRACE-ID response header containing the current Span’s trace id. Also we will
add to the Span a tag with key custom and a value tag.
@Component @Order(TraceFilter.ORDER + 1) class MyFilter extends GenericFilterBean { private final Tracer tracer; MyFilter(Tracer tracer) { this.tracer = tracer; } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { Span currentSpan = this.tracer.currentSpan(); then(currentSpan).isNotNull(); // for readability we're returning trace id in a hex form ((HttpServletResponse) response) .addHeader("ZIPKIN-TRACE-ID", currentSpan.context().traceIdString()); // we can also add some custom tags currentSpan.tag("custom", "tag"); chain.doFilter(request, response); } }
By default Sleuth assumes that when you send a span to Zipkin, you want the span’s service name
to be equal to spring.application.name value. That’s not always the case though. There
are situations in which you want to explicitly provide a different service name for all spans coming
from your application. To achieve that it’s enough to just pass the following property
to your application to override that value (example for foo service name):
spring.zipkin.service.name: fooBefore reporting spans to e.g. Zipkin you can be interested in modifying that span in some way.
You can achieve that by using the SpanAdjuster interface.
In Sleuth we’re generating spans with a fixed name. Some users want to modify the name depending on values
of tags. Implementation of the SpanAdjuster interface can be used to alter that name. Example:
Example. If you register two beans of SpanAdjuster type:
@Bean SpanAdjuster adjusterOne() { return span -> span.toBuilder().name("foo").build(); } @Bean SpanAdjuster adjusterTwo() { return span -> span.toBuilder().name(span.name() + " bar").build(); }
This will lead in changing the name of the reported span to foo bar, just before it gets reported (e.g. to Zipkin).
![]() | Important |
|---|---|
This section is about defining host from service discovery. It’s NOT about finding Zipkin in service discovery. |
In order to define the host that is corresponding to a particular span we need to resolve the host name and port. The default approach is to take it from server properties. If those for some reason are not set then we’re trying to retrieve the host name from the network interfaces.
If you have the discovery client enabled and prefer to retrieve the host address from the registered instance in a service registry then you have to set the property (it’s applicable for both HTTP and Stream based span reporting).
spring.zipkin.locator.discovery.enabled: true