Bitryon Logger Docs
GitHub
Guides

Tracing over HTTP

No more MDC
Tracing requires writing step log id through clients and reading it in servers
With bitryon-logger library, developers can customize tracing over any RPC or protocols

Configuration YAML file

In spring web, it's to write step log id or trace id in the response header

bitryon:
  app-node: 
    http-header-id-type: 1 # write log/trace id to the http response header; 0 default no write header, 1 trace id, 2 step log id

Write step log id - trace id

// write step log id (trace id) header to the HTTP client, in your bean
import io.bitryon.logger.Logger;
import io.bitryon.logger.provider.LoggerFactory;
import io.bitryon.logger.provider.LoggerProvider;

public class ExampleWebHTTPClient {
	@Resource
	LoggerProvider bitryonLoggerProvider;
	//private static final Logger logger = LoggerFactory.getLogger();// in java project, logger.getLoggerProvider() or LoggerFactory.getLoggerProvider()
	
	public RestClient getRestClient() {
		return RestClient
			.builder(new RestTemplate(new HttpComponentsClientHttpRequestFactory(httpClient())))
			.baseUrl(getBaseUrl())
			
			// write step log id to the http request header to the next app/service to form traces
			.requestInterceptor(new LoggingHttpClientHeaderWriterInterceptor(bitryonLoggerProvider))
			.build();
	}
}

Read step log id - trace id

// read step log id (trace id) header by filter in spring web 
import io.bitryon.logger.Logger;
import io.bitryon.logger.provider.LoggerFactory;
import io.bitryon.logger.provider.LoggerProvider;

@Configuration
@Import(value= {
	AutoConfigurationBitryonLogger.class, // to load the configs from application.yml for logging related beans
})
public class ExampleWebServerConfiguration {

	@Resource
	LoggerProvider bitryonLoggerProvider;
	//private static final Logger logger = LoggerFactory.getLogger();// in java project, logger.getLoggerProvider() or LoggerFactory.getLoggerProvider()

	// read step log id from last app/service/http request header to form traces, and log http payload for specific paths
	@Bean
	FilterRegistrationBean<LoggingHttpRequestWebFilter> loggingResetInFilter() {
		FilterRegistrationBean<LoggingHttpRequestWebFilter> reg = new FilterRegistrationBean<>(
				new LoggingHttpRequestWebFilter(bitryonLoggerProvider, true));
		reg.setOrder(Ordered.HIGHEST_PRECEDENCE);
		reg.addUrlPatterns("/api", "/api/*", "/remote_api/*");
		return reg;
	}
}

Tracing by HTTP headers

TypeKeyDefaultDescription
HTTP_HEADER_STEP_LOG_IDX-Step-Log-Idnull

Pass the step log id to the next service to track all of the traces.

HTTP_HEADER_STEP_TRACE_IDX-Step-Trace-Idnull

Expose the trace id to HTTP headers

HTTP_HEADER_STEP_LOG_SKIPX-Step-Log-Skipfalse

to tell the next service to skip the trace, true skip, null or false not skip

How to use step log id / trace id

Step log id = trace id sequence id.

To HTTP client, if no skip,
X-Step-Log-Id will always be writing to request header to the next service, 
reading by web server from request header to continue the stack. 
Eventually forming the tracing.

To display & test the trace, a web server 
when bitryon.app-node.http-header-id-type = 
  1, writes X-Step-Trace-Id to HTTP response header,
  2, writes X-Step-Log-Id to HTTP response header,
  0, writes no ids in HTTP response header

Pick up ids from HTTP response header, 
connect to stack view https://dev-portal.bitryon.io/trace.html?id=[X-Step-Trace-Id] / [X-Step-Log-Id]