集成
可运行和可调用
如果你在Runnable
或Callable
中包含你的逻辑,就可以将这些类包装在他们的Sleuth代表中。
Runnable
的示例:
Runnable runnable = new Runnable() {
@Override
public void run() {
// do some work
}
@Override
public String toString() {
return "spanNameFromToStringMethod";
}
};
// Manual `TraceRunnable` creation with explicit "calculateTax" Span name
Runnable traceRunnable = new TraceRunnable(tracer, spanNamer, runnable, "calculateTax");
// Wrapping `Runnable` with `Tracer`. The Span name will be taken either from the
// `@SpanName` annotation or from `toString` method
Runnable traceRunnableFromTracer = tracer.wrap(runnable);
Callable
的示例:
Callable<String> callable = new Callable<String>() {
@Override
public String call() throws Exception {
return someLogic();
}
@Override
public String toString() {
return "spanNameFromToStringMethod";
}
};
// Manual `TraceCallable` creation with explicit "calculateTax" Span name
Callable<String> traceCallable = new TraceCallable<>(tracer, spanNamer, callable, "calculateTax");
// Wrapping `Callable` with `Tracer`. The Span name will be taken either from the
// `@SpanName` annotation or from `toString` method
Callable<String> traceCallableFromTracer = tracer.wrap(callable);
这样,您将确保为每次执行创建并关闭新的Span。
Hystrix
自定义并发策略
我们正在注册HystrixConcurrencyStrategy
将所有Callable
实例包装到他们的Sleuth代表 - TraceCallable
中的定制。该策略是启动或继续跨越,这取决于调用Hystrix命令之前跟踪是否已经进行的事实。要禁用自定义Hystrix并发策略,将spring.sleuth.hystrix.strategy.enabled
设置为false
。
手动命令设置
假设您有以下HystrixCommand
:
HystrixCommand<String> hystrixCommand = new HystrixCommand<String>(setter) {
@Override
protected String run() throws Exception {
return someLogic();
}
};
为了传递跟踪信息,您必须在HystrixCommand
的HystrixCommand
的Sleuth版本中包装相同的逻辑:
TraceCommand<String> traceCommand = new TraceCommand<String>(tracer, traceKeys, setter) {
@Override
public String doRun() throws Exception {
return someLogic();
}
};
RxJava
我们正在注册RxJavaSchedulersHook
将所有Action0
实例包装到他们的Sleuth代表 - TraceAction
中的定制。钩子起动或继续一个跨度取决于跟踪在Action被安排之前是否已经进行的事实。要禁用自定义RxJavaSchedulersHook,将spring.sleuth.rxjava.schedulers.hook.enabled
设置为false
。
您可以定义线程名称的正则表达式列表,您不希望创建一个Span。只需在spring.sleuth.rxjava.schedulers.ignoredthreads
属性中提供逗号分隔的正则表达式列表。
HTTP集成
可以通过提供值等于false
的spring.sleuth.web.enabled
属性来禁用此部分的功能。
HTTP过滤器
通过TraceFilter
所有采样的进入请求导致创建Span。Span的名称是http:
+发送请求的路径。例如,如果请求已发送到/foo/bar
,则该名称将为http:/foo/bar
。您可以通过spring.sleuth.web.skipPattern
属性配置要跳过的URI。如果您在类路径上有ManagementServerProperties
,则其值contextPath
将附加到提供的跳过模式。
的HandlerInterceptor
由于我们希望跨度名称是精确的,我们使用的TraceHandlerInterceptor
包装现有的HandlerInterceptor
,或直接添加到现有的HandlerInterceptors
列表中。TraceHandlerInterceptor
向给定的HttpServletRequest
添加了一个特殊请求属性。如果TraceFilter
没有看到此属性集,它将创建一个“后备”跨度,这是在服务器端创建的一个额外的跨度,以便在UI中正确显示跟踪。看到最有可能意味着有一个缺失的仪器。在这种情况下,请在Spring Cloud Sleuth中提出问题。
异步Servlet支持
如果您的控制器返回Callable
或WebAsyncTask
Spring Cloud,Sleuth将继续现有的跨度,而不是创建一个新的跨度。
HTTP客户端集成
同步休息模板
我们注入一个RestTemplate
拦截器,确保所有跟踪信息都传递给请求。每次呼叫都会创建一个新的Span。收到回应后关闭。为了阻止将spring.sleuth.web.client.enabled
设置为false
的同步RestTemplate
功能。
重要 | 你必须注册RestTemplate 作为一个bean,以便拦截器被注入。如果您使用new 关键字创建RestTemplate 实例,那么该工具将不工作。 |
异步休息模板
重要 | 一个AsyncRestTemplate bean的跟踪版本是为您开箱即用的。如果你有自己的bean,你必须用TraceAsyncRestTemplate 表示来包装它。最好的解决方案是只定制ClientHttpRequestFactory 和/或AsyncClientHttpRequestFactory 。 如果您有自己的AsyncRestTemplate ,并且您不要包装您的电话将不会被追踪。 |
定制仪器设置为在发送和接收请求时创建和关闭跨度。您可以通过注册您的bean来自定义ClientHttpRequestFactory
和AsyncClientHttpRequestFactory
。记住使用跟踪兼容的实现(例如,不要忘记在TraceAsyncListenableTaskExecutor
中包装ThreadPoolTaskScheduler
)。自定义请求工厂示例:
@EnableAutoConfiguration
@Configuration
public static class TestConfiguration {
@Bean
ClientHttpRequestFactory mySyncClientFactory() {
return new MySyncClientHttpRequestFactory();
}
@Bean
AsyncClientHttpRequestFactory myAsyncClientFactory() {
return new MyAsyncClientHttpRequestFactory();
}
}
将AsyncRestTemplate
功能集spring.sleuth.web.async.client.enabled
阻止为false
。禁用TraceAsyncClientHttpRequestFactoryWrapper
设置spring.sleuth.web.async.client.factory.enabled
设置为false
。如果您不想将所有spring.sleuth.web.async.client.template.enabled
false
的AsyncRestClient
创建为false
。
Feign
默认情况下,Spring Cloud Sleuth通过TraceFeignClientAutoConfiguration
提供与feign的集成。您可以通过将spring.sleuth.feign.enabled
设置为false来完全禁用它。如果这样做,那么不会发生Feign相关的仪器。
Feign仪器的一部分是通过FeignBeanPostProcessor
完成的。您可以通过提供spring.sleuth.feign.processor.enabled
等于false
来禁用它。如果你这样设置,那么Spring Cloud Sleuth不会调整你的任何自定义Feign组件。然而,所有默认的工具仍然存在。
异步通信
@Async注释方法
在Spring Cloud Sleuth中,我们正在调用异步相关组件,以便跟踪信息在线程之间传递。您可以通过将spring.sleuth.async.enabled
的值设置为false
来禁用此行为。
如果您使用@Async
注释方法,那么我们将自动创建一个具有以下特征的新的Span:
- Span名称将是注释方法名称
- Span将被该方法的类名称和方法名称标记
@Scheduled注释方法
在Spring Cloud Sleuth中,我们正在调试计划的方法执行,以便跟踪信息在线程之间传递。您可以通过将spring.sleuth.scheduled.enabled
的值设置为false
来禁用此行为。
如果您使用@Scheduled
注释方法,那么我们将自动创建一个具有以下特征的新的Span:
- Span名称将是注释方法名称
- Span将被该方法的类名称和方法名称标记
如果要跳过某些@Scheduled
注释类的Span创建,您可以使用与@Scheduled
注释类的完全限定名称匹配的正则表达式来设置spring.sleuth.scheduled.skipPattern
。
提示 | 如果您一起使用spring-cloud-sleuth-stream 和spring-cloud-netflix-hystrix-stream ,将为每个Hystrix指标创建Span并发送到Zipkin。这可能是恼人的。您可以设置spring.sleuth.scheduled.skipPattern=org.springframework.cloud.netflix.hystrix.stream.HystrixStreamTask |
Executor,ExecutorService和ScheduledExecutorService
我们提供LazyTraceExecutor
,TraceableExecutorService
和TraceableScheduledExecutorService
。每次提交,调用或调度新任务时,这些实现都将创建Spans。
在这里,您可以看到使用CompletableFuture
使用TraceableExecutorService
传递跟踪信息的示例:
CompletableFuture<Long> completableFuture = CompletableFuture.supplyAsync(() -> {
// perform some logic
return 1_000_000L;
}, new TraceableExecutorService(executorService,
// 'calculateTax' explicitly names the span - this param is optional
tracer, traceKeys, spanNamer, "calculateTax"));
消息
Spring Cloud Sleuth与Spring Integration集成。它创建spans发布和订阅事件。要禁用Spring Integration检测,请将spring.sleuth.integration.enabled
设置为false。
您可以提供spring.sleuth.integration.patterns
模式,以明确提供要包括的用于跟踪的通道的名称。默认情况下,所有通道都包含在内。
重要 | 当使用Executor 构建Spring Integration IntegrationFlow 时,请记住使用Executor 的未跟踪版本。用TraceableExecutorService 装饰Spring Integration执行者频道将导致spans被关闭。 |
Zuul
我们正在注册Zuul过滤器来传播跟踪信息(请求标头丰富了跟踪数据)。要禁用Zuul支持,请将spring.sleuth.zuul.enabled
属性设置为false
。