15. 积分
15.1. 开放追踪
Spring Cloud Sleuth 兼容 OpenTracing。
如果你在类路径上有 OpenTracs,我们会自动注册 OpenTracs。示 踪豆。
如果你想禁用这个功能,设置spring.sleuth.opentracing.enabled自false
15.2. 可跑与可叫
如果你把逻辑包裹在可跑或调用你可以将这些类包裹在其侦探代表中,如下示例所示可跑:
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(this.tracing, spanNamer, runnable,
"calculateTax");
// Wrapping `Runnable` with `Tracing`. That way the current span will be available
// in the thread of `Runnable`
Runnable traceRunnableFromTracer = this.tracing.currentTraceContext()
.wrap(runnable);
以下示例展示了如何满足调用:
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<>(this.tracing, spanNamer,
callable, "calculateTax");
// Wrapping `Callable` with `Tracing`. That way the current span will be available
// in the thread of `Callable`
Callable<String> traceCallableFromTracer = this.tracing.currentTraceContext()
.wrap(callable);
这样,你就能确保每次执行都创建一个新的区间并关闭。
15.3. 春季云断路器
如果你的类路径上有 Spring Cloud CircuitBreaker,我们会封装已传递的命令提供商以及后备功能在其迹表征中。为了禁用该仪器集spring.sleuth.circuitbreaker.enabled自false.
15.4. 海斯特里克斯
15.4.1. 自定义并发策略
我们登记了一个习俗Hystrix并发策略叫可追踪呼叫以上内容调用在他们的侦探代表中。
该策略要么开始,要么继续一个时段,取决于在调用Hystrix命令之前是否已经开始追踪。
你可以选择设置spring.sleuth.hystrix.strategy.passthrough自true如果你不想新建一个 span,只需将 trace 上下文传播到 Hystrix 执行线程。
要禁用自定义的Hystrix并发策略,请设置spring.sleuth.hystrix.strategy.enabled自false.
15.4.2. 手动命令设置
假设你拥有以下条件海斯特里克斯指挥官:
HystrixCommand<String> hystrixCommand = new HystrixCommand<String>(setter) {
@Override
protected String run() throws Exception {
return someLogic();
}
};
要传递追踪信息,你必须将相同的逻辑包裹在 Sleuth 版本中海斯特里克斯指挥官,称为TraceCommand如下例所示:
TraceCommand<String> traceCommand = new TraceCommand<String>(tracer, setter) {
@Override
public String doRun() throws Exception {
return someLogic();
}
};
15.5. RxJava
我们正在注册一个习惯RxJavaSchedulersHook以上内容动作0实例在他们的侦探代表中,称为TraceAction.
钩子要么开始,要么延续一段,取决于在行动安排前是否已经开始描摹。
以禁用自定义RxJavaSchedulersHook,设spring.sleuth.rxjava.schedulers.hook.enabled自false.
你可以为不希望创建跨度的线程名称定义正则表达式列表。
为此,提供一个逗号分隔的正则表达式列表spring.sleuth.rxjava.schedulers.ignoredthreads财产。
| 对响应式编程和侦探的建议方法如下: 反应堆支持。 |
15.6. HTTP 集成
本节的功能可以通过设置spring.sleuth.web.enabled其值为false.
15.6.1. HTTP 过滤器
通过追踪Filter,所有采样的入请求都会导致生成一个Span。该Span的名称为http:+ 请求发送到的路径。例如,如果请求发送到/这个/那个那么名称将为http:/这个/那个.
你可以通过设置spring.sleuth.web.skip模式财产。 如果你有ManagementServerProperties在 classpath 上,其值为上下文路径会附加到提供的跳跃模式中。
如果你想复用侦探的默认跳过模式,并添加你自己的模式,可以通过以下方式传递这些模式spring.sleuth.web.additionalSkipPattern.
默认情况下,所有Spring Boot执行器的端点都会自动添加到跳跃模式中。
如果你想禁用这个行为集Spring.sleuth.web.ignore-auto-configured-skip-patterns自true.
要更改追踪过滤器注册顺序,请设置spring.sleuth.web.filter-order财产。
要禁用记录未捕获异常的过滤器,可以禁用spring.sleuth.web.exception-throwing-filter-enabled财产。
15.6.2. 拦截者操作员
由于我们希望张成名称精确,我们使用追踪处理拦截者该 要么包裹现有的拦截者或直接加入现有列表拦截者处理机.
这追踪处理拦截者为给定的 添加了特殊请求属性HttpServletRequest.
如果追踪Filter不认识这个属性,它会生成一个”后备“span”,这是服务器端为跟踪在UI中正确呈现而创建的额外span。
如果发生这种情况,可能是缺少仪器。
如果是这样,请在Spring Cloud Sleuth上提交问题。
15.6.3. 异步 Servlet 支持
如果你的手柄返回调用或者WebAsync任务春云侦探延续了现有的跨度,而不是新建一个新跨度。
15.6.4. WebFlux 支持
通过TraceWebFilter,所有采样的入请求都会导致生成一个Span。该Span的名称为http:+ 请求发送到的路径。例如,如果请求发送到/这个/那个,名称为http:/这个/那个. 你可以通过使用spring.sleuth.web.skip模式财产。 如果你有ManagementServerProperties在类路径上,其值为上下文路径会附加到提供的跳过模式中。如果你想复用Sleuth的默认跳过模式并添加自己的,可以通过以下方式传递这些模式spring.sleuth.web.additionalSkipPattern.
要更改追踪过滤器注册顺序,请设置spring.sleuth.web.filter-order财产。
15.6.5. Dubbo RPC 支持
通过与Brave的集成,Spring Cloud Sleuth支持Dubbo。只需添加勇敢乐器配音Dependency:
<dependency>
<groupId>io.zipkin.brave</groupId>
<artifactId>brave-instrumentation-dubbo</artifactId>
</dependency>
你还需要设置一个dubbo.properties文件内容如下:
dubbo.provider.filter=tracing
dubbo.consumer.filter=tracing
15.7. HTTP 客户端集成
15.7.1. 同步休止模板
我们注入一个Rest模板拦截器确保所有追踪信息都传递给请求。每次调用时,都会创建一个新的 Span。收到响应后,该 Span 会被关闭。以阻断同步Rest模板特色、布景spring.sleuth.web.client.enabled自false.
你必须注册Rest模板作为一颗豆子,这样拦截器就会被注入。如果你创造一个Rest模板实例新增功能关键词是,仪器设备根本不起作用。 |
15.7.2. 异步静止模板
从《侦探》开始2.0.0,我们不再记录一个豆子非同步休息模板类型。 创造这样的豆子就靠你了。然后我们给它做仪器。 |
阻止非同步休息模板特色、布景spring.sleuth.web.async.client.enabled自false. 要禁用默认创建TraceAsyncClientHttpRequestFactoryWrapper设置spring.sleuth.web.async.client.factory.enabled自false. 如果你不想创造非同步安置客户端一点都不行,准备好了spring.sleuth.web.async.client.template.enabled自false.
多重异步静止模板
有时你需要使用多个异步休息模板的实现。在下面的摘要中,你可以看到如何设置此类自定义的示例非同步休息模板:
@Configuration
@EnableAutoConfiguration
static class Config {
@Bean(name = "customAsyncRestTemplate")
public AsyncRestTemplate traceAsyncRestTemplate() {
return new AsyncRestTemplate(asyncClientFactory(),
clientHttpRequestFactory());
}
private ClientHttpRequestFactory clientHttpRequestFactory() {
ClientHttpRequestFactory clientHttpRequestFactory = new CustomClientHttpRequestFactory();
// CUSTOMIZE HERE
return clientHttpRequestFactory;
}
private AsyncClientHttpRequestFactory asyncClientFactory() {
AsyncClientHttpRequestFactory factory = new CustomAsyncClientHttpRequestFactory();
// CUSTOMIZE HERE
return factory;
}
}
15.7.3.Web客户端
我们注入一个交换滤波函数实现时创建一个跨度,并通过成功时和错误时回调,处理客户端的关闭跨度。
要阻止此功能,设置spring.sleuth.web.client.enabled自false.
你必须注册以下一种Web客户端或WebClient.Builder作为一个 bean,这样追踪仪表就能应用。如果你手动创建Web客户端或WebClient.Builder,仪器根本无法使用。 |
15.7.4. 特拉弗森
如果你使用 Traverson 库,可以注入Rest模板作为一个豆子进入你的Traverson对象。 因为Rest模板已经被拦截了,你就能在客户端中获得对追踪的全面支持。以下伪代码展示了如何实现这一点:
@Autowired RestTemplate restTemplate;
Traverson traverson = new Traverson(URI.create("https://some/address"),
MediaType.APPLICATION_JSON, MediaType.APPLICATION_JSON_UTF8).setRestOperations(restTemplate);
// use Traverson
15.7.5. ApacheHttpClientBuilder和HttpAsyncClientBuilder
我们会为HttpClientBuilder和HttpAsyncClientBuilder因此 追踪上下文会注入发送请求。
要阻止这些功能,设置spring.sleuth.web.client.enabled自false.
15.7.6. NettyHttp客户端
我们给Netty's做仪器Http客户端.
要阻止此功能,设置spring.sleuth.web.client.enabled自false.
你必须注册Http客户端作为豆子,这样仪器就会发生。如果你创建了一个Http客户端实例新增功能关键词是,仪器设备根本不起作用。 |
15.7.7.UserInfoRestTemplateCustomizer
我们给春季安全装备UserInfoRestTemplateCustomizer.
要阻止此功能,设置spring.sleuth.web.client.enabled自false.
15.8. 假装
默认情况下,Spring Cloud Sleuth 通过以下方式与 Feign 集成TraceFeignClientAutoConfiguration. 你可以通过设置完全禁用它Spring侦探。假装。启用自false. 如果这样做,就不会有与假装相关的乐器使用。
假装乐器的一部分是通过假豆后处理器. 你可以通过设置来禁用它spring.sleuth.feign.processor.enabled自false. 如果你设置为false,Spring Cloud Sleuth 不会为你自定义的任何 Feign 组件安装仪表。不过,所有默认的仪表依然存在。
15.9. gRPC
Spring Cloud Sleuth 为 gRPC 提供了仪器支持TraceGrpcAutoConfiguration. 你可以通过设置完全禁用它spring.sleuth.grpc.enabled自false.
15.9.1. 变体1
依赖
| gRPC集成依赖两个外部库来实现仪器客户端和服务器,且这两个库都必须在类路径上才能启用仪器化。 |
Maven:
<dependency>
<groupId>io.github.lognet</groupId>
<artifactId>grpc-spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>io.zipkin.brave</groupId>
<artifactId>brave-instrumentation-grpc</artifactId>
</dependency>
Gradle:
compile("io.github.lognet:grpc-spring-boot-starter")
compile("io.zipkin.brave:brave-instrumentation-grpc")
服务器仪表
Spring Cloud Sleuth 利用 grpc-spring-boot-starter 注册 Brave 的 gRPC 服务器拦截器,所有服务都标注为@GRpcService.
客户仪器
gRPC客户端利用ManagedChannelBuilder构造一个托管频道用于与gRPC服务器通信。原生ManagedChannelBuilder提供静态方法作为构建 的入口点。托管频道然而,这种机制在 Spring 应用上下文的影响之外。
《春云侦探》提供了SpringAwareManagedChannelBuilder这些功能可以通过 Spring 应用上下文进行定制,并由 gRPC 客户端注入。创作时必须使用该构建器托管频道实例。
|
侦探创造了TracingManagedChannelBuilderCustomizer该装置将勇士的客户拦截器注入SpringAwareManagedChannelBuilder.
15.9.2. 变体2
Grpc Spring Boot Starter 自动检测 Spring Cloud Sleuth 和 Brave 的 gRPC 检测工具,并注册必要的客户端和/或服务器工具。
15.10. 异步通信
15.10.1.@Async注释方法
在 Spring Cloud Sleuth 中,我们对异步相关组件进行监测,使追踪信息在线程之间传递。您可以通过设置 的值来禁用此行为spring.sleuth.async.enabled自false.
如果你在注释中用@Async,我们会自动修改现有的张成如下:
-
如果该方法被注释为
@SpanName,注释的值即为该Span的名称。 -
如果该方法没有注释
@SpanName,Span 名称是带注释的方法名称。 -
该区间被标记为方法的类名和方法名。
既然我们正在修改现有的 span,如果你想保留它的原始名称(例如通过接收 HTTP 请求创建的 span)你应该对你的@Async带注释的方法,带有@NewSpan注释或手动创建新的跨度。
15.10.2.@Scheduled注释方法
在 Spring Cloud Sleuth 中,我们对方法执行进行调度,使追踪信息在线程间传递。您可以通过设置 的值来禁用此行为spring.sleuth.scheduled.enabled自false.
如果你在注释中用@Scheduled,我们会自动创建一个具有以下特性的新跨度:
-
张成名称即为注释方法名称。
-
该区间被标记为方法的类名和方法名。
如果你想跳过部分跨度创建@Scheduled注释类,你可以设置Spring侦探。预约。跳过模式其正则表达式与完全限定的名称相匹配@Scheduled注释类。如果你使用春云侦探溪流和春云-Netflix-Hystrix-Stream每个 Hystrix 指标都会创建一个跨度并发送给 Zipkin。这种行为可能令人烦恼。这就是为什么默认情况下,spring.sleuth.scheduled.skipPattern=org.springframework.cloud.netflix.hystrix.stream.HystrixStream.HystrixStreamTask.
15.10.3. 执行人、执行人服务和预定执行人服务
我们提供懒惰追踪执行者,可追踪执行者服务和TraceableScheduledExecutorService. 这些实现每次提交、调用或调度新任务时都会创建时间段。
以下示例展示了如何传递追踪信息可追踪执行者服务在与完成未来:
CompletableFuture<Long> completableFuture = CompletableFuture.supplyAsync(() -> {
// perform some logic
return 1_000_000L;
}, new TraceableExecutorService(beanFactory, executorService,
// 'calculateTax' explicitly names the span - this param is optional
"calculateTax"));
侦探不合作parallelStream()开箱即用。如果你想让追踪信息通过流传播,你必须使用以下方法supplyAsync(...),如前所述。 |
如果有豆子实现了执行者你希望的接口为了排除 span 创建,你可以使用Spring侦探。同步。忽略豆你可以提供Beans名称列表。
执行者的定制化
有时,你需要设置一个自定义实例异步执行器. 以下示例展示了如何设置这样的自定义执行者:
@Configuration
@EnableAutoConfiguration
@EnableAsync
// add the infrastructure role to ensure that the bean gets auto-proxied
@Role(BeanDefinition.ROLE_INFRASTRUCTURE)
static class CustomExecutorConfig extends AsyncConfigurerSupport {
@Autowired
BeanFactory beanFactory;
@Override
public Executor getAsyncExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
// CUSTOMIZE HERE
executor.setCorePoolSize(7);
executor.setMaxPoolSize(42);
executor.setQueueCapacity(11);
executor.setThreadNamePrefix("MyExecutor-");
// DON'T FORGET TO INITIALIZE
executor.initialize();
return new LazyTraceExecutor(this.beanFactory, executor);
}
}
为了确保你的配置得到后处理,请记住添加@Role(BeanDefinition.ROLE_INFRASTRUCTURE)在你的@Configuration类 |
15.11. 信息传递
本节的功能可以通过设置spring.sleuth.messaging.enabled其值为false.
15.11.1. 春季集成与春季云流
Spring Cloud Sleuth 与 Spring Integration 集成。
它为发布和订阅活动创建了多个时间段。
要禁用 Spring Integration 的仪器,请设置spring.sleuth.integration.enabled自false.
你可以提供spring.sleuth.integration.patterns模式中明确提供你想包含用于追踪的频道名称。
默认情况下,所有通道 buthystrixStream输出频道也包含在内。
当使用执行者构建一个 Spring 集成集成流程,你必须使用未追踪版本的执行者.
装饰 Spring 集成执行器通道可追踪执行者服务导致跨距关闭不当。 |
如果你想自定义从消息头部读取和写入上下文的方式, 你只需识别以下类型的豆子:
-
Propagation.Setter<MessageHeaderAccessor, String>- 用于为消息写入头部 -
Propagation.Getter<MessageHeaderAccessor, String>- 用于从消息中读取头部
15.11.3. 春季卡夫卡
我们为春季卡夫卡的作品配乐器生产工厂和消费者工厂以便将描摹标题注入生成的春季卡夫卡制作人和消费者.
要阻止此功能,设置spring.sleuth.messaging.kafka.enabled自false.
15.11.4. 春季卡夫卡流
我们会为卡夫卡流 KafkaClientSupplier因此,追踪标题
被注射进去制作人和消费者的。一个“卡夫卡流追踪”豆
通过额外的设备支持进一步的仪器安装转换器提供商和处理器提供商方法。
要阻止此功能,设置spring.sleuth.messaging.kafka.streams.enabled自false.
15.11.5. 春季JMS
我们会为Jms模板这样可以注入追踪头
进入信息中。我们也支持@JmsListener消费者端的注释方法。
要阻止此功能,设置spring.sleuth.messaging.jms.enabled自false.
| 我们不支持JMS的行李传播 |
15.11.6. Spring Cloud AWS 消息SQS
我们是仪器@SqsListener由org.springframework.cloud:spring-cloud-aws-messaging这样追踪头就能从消息中提取,并将追踪放到上下文中。
要阻止此功能,设置spring.sleuth.messaging.sqs.enabled自false.
15.12. 祖尔
我们通过丰富带线请求的追踪信息来增强 Zuul Ribbon 集成。
要禁用 Zuul 支持,请设置spring.sleuth.zuul.enabled属性到false.
15.13. Redis
我们开始了描图归莱特丘所有的财产客户端资源实例中启用了内置的 Brave 追踪。
要禁用 Redis 支持,请设置spring.sleuth.redis.enabled属性到false.
15.14. Quartz
我们通过向Quartz调度器添加作业/触发监听器来对Quartz作业进行监测。
要关闭此功能,请设置spring.sleuth.quartz.enabled属性到false.
15.15. 反应堆项目
15.15.1. 摘自《春云侦探》2.2.8(含)
通过新的 Reactor 队列包装机制(Reactor 3.3.14),我们正在对 Reactor 交换线程的方式进行监测。你应该会看到性能的显著提升。要启用此功能,您必须设置spring.sleuth.reactor.decorate-queues选项true.
15.15.2。致《春云侦探》2.2.8(独家)
对于依赖Project Reactor的项目,如Spring Cloud Gateway,我们建议将Spring侦探。反应器。装饰点选项false.这样,相较于标准仪器机制,性能提升应当更高。这个选项的作用是会包裹装饰最后算符代替在每个人这会导致生成的对象数量大大减少。缺点是当 Project Reactor 更换线程时,跟踪传播会继续且无问题,但任何依赖于ThreadLocal例如,MDC条目可能存在bug。