Spring Cloud Sleuth 特点
-
将跟踪和跨度ID添加到Slf4J MDC,因此您可以在日志聚合器中从给定的跟踪或跨度提取所有日志,如以下示例日志所示:
2016-02-02 15:30:57.902 INFO [bar,6bfd228dc00d216b,6bfd228dc00d216b,false] 23030 --- [nio-8081-exec-3] ... 2016-02-02 15:30:58.372 ERROR [bar,6bfd228dc00d216b,6bfd228dc00d216b,false] 23030 --- [nio-8081-exec-3] ... 2016-02-02 15:31:01.936 INFO [bar,46ab0d418373cbc9,46ab0d418373cbc9,false] 23030 --- [nio-8081-exec-4] ...
请注意来自MDC的
[appname,traceId,spanId,exportable]
条目:spanId
:发生的特定操作的ID。appname
:记录跨度的应用程序的名称。traceId
:包含跨度的延迟图的ID。exportable
:是否应将日志导出到Zipkin。您何时希望跨度不可导出?当您要将某些操作包装在Span中并且仅将其写入日志时。
- 提供对常见的分布式跟踪数据模型的抽象:跟踪,spans(形成DAG),注释和键值注释。Spring Cloud Sleuth大致基于HTrace,但与Zipkin(Dapper)兼容。
- Sleuth记录计时信息以帮助进行延迟分析。通过使用侦探,您可以查明应用程序中延迟的原因。
-
编写Sleuth时不要过多记录日志,也不会导致生产应用程序崩溃。为此,Sleuth:
- 在带内传播有关调用图的结构数据,并在带外传播其余数据。
- 包括对诸如HTTP之类的层的自觉检测。
- 包括用于管理数量的采样策略。
- 可以向Zipkin系统报告以进行查询和可视化。
- 从Spring应用程序(servlet过滤器,异步端点,休息模板,计划的操作,消息通道,Zuul过滤器和Feign客户端)中检测常见的入口和出口点。
- Sleuth包含默认逻辑以跨HTTP或消息传递边界加入跟踪。例如,HTTP传播适用于Zipkin兼容的请求标头。
- 侦查可以在进程之间传播上下文(也称为行李)。因此,如果您在Span上设置了行李元素,则该元素将通过HTTP或消息传递被下游发送到其他进程。
- 提供一种创建或继续spans以及通过注释添加标签和日志的方法。
-
如果
spring-cloud-sleuth-zipkin
在类路径上,则该应用生成并收集Zipkin兼容的跟踪。默认情况下,它通过HTTP将它们发送到本地主机(端口9411)上的Zipkin服务器。您可以通过设置spring.zipkin.baseUrl
来配置服务的位置。- 如果您依赖
spring-rabbit
,则您的应用会将跟踪发送到RabbitMQ代理,而不是HTTP。 - 如果您依赖
spring-kafka
并设置为spring.zipkin.sender.type: kafka
,则您的应用会将跟踪发送到Kafka代理而不是HTTP。
- 如果您依赖
spring-cloud-sleuth-stream
已过时,不应再使用。
- Spring Cloud Sleuth与OpenTracing兼容。
如果使用Zipkin,请通过设置
spring.sleuth.sampler.probability
(默认值:0.1,即10%)来配置spans导出的概率。否则,您可能会认为Sleuth无法正常工作,因为它忽略了一些spans。
始终设置SLF4J MDC,并且按先前显示的示例,登录用户可以立即在日志中看到跟踪和跨度ID。其他日志记录系统必须配置自己的格式化程序才能获得相同的结果。默认值如下:
logging.pattern.level
设置为%5p [${spring.zipkin.service.name:${spring.application.name:-}},%X{X-B3-TraceId:-},%X{X-B3-SpanId:-},%X{X-Span-Export:-}]
(这是Logback用户的Spring Boot功能)。如果您不使用SLF4J,则不会自动应用此模式。
更多建议: