Spring Cloud Sleuth

Spring Cloud Sleuth为Spring Cloud提供了分布式追踪方案,借用了Dapper,Zipkin和HTrace。对于大多数用户来说Sleuth应该是看不见的,与外部系统的相互作用是自动的。您可以简单地在日志中捕获数据,或将数据发送到远程收集服务。

For full documentation visit spring cloud Sleuth.

Features

Span是一个基本单位,例如,发送一个RPC是一个新的Span。Span是由一个64位的SpanID和一个64位的traceID组成,Span也有其他数据,如描述,键值注释,SpanID,processID(通常是IP地址)。Span有开始和停止,并且跟踪他们的时间信息。一旦你创建一个Span,你必须在未来的某一点停止它。一组Span形成一个树状结构称为一个跟踪,例如,如果运行一个分布式大数据存储,则可能由一个放请求形成一个跟踪。

Spring Cloud Sleuth features:

  • 在Slf4J的MDC中添加traceId和spanId,所以在日志汇总处你可以提取trace或span信息。
  • 提供了一个抽象数据模型:traces, spans (forming a DAG), annotations, key-value annotations。轻易的基于HTrace, 和Zipkin (Dapper)兼容。
  • Spring应用通用的入口和出口工具(servlet filter, rest template, scheduled actions, message channels, zuul filters, feign client).
  • 如果激活spring-cloud-sleuth-zipkin,应用程序将生成并通过HTTP收集兼容Zipkin的traces。默认情况下发送到本地的Zipkin,可以通过spring.zipkin.[host,port]去配置正确的地址。

Quick Start

项目中使用spring-cloud-sleuth推荐基于一个依赖管理系统—下面的代码段可以被复制和粘贴到您的构建。需要帮助吗?看看我们基于MavenGradle构建的入门指南。

  1. <dependencyManagement>
  2. <dependencies>
  3. <dependency>
  4. <groupId>org.springframework.cloud</groupId>
  5. <artifactId>spring-cloud-sleuth</artifactId>
  6. <version>1.1.0.BUILD-SNAPSHOT</version>
  7. <type>pom</type>
  8. <scope>import</scope>
  9. </dependency>
  10. </dependencies>
  11. </dependencyManagement>
  12. <dependencies>
  13. <dependency>
  14. <groupId>org.springframework.cloud</groupId>
  15. <artifactId>spring-cloud-starter-sleuth</artifactId>
  16. </dependency>
  17. </dependencies><repositories>
  18. <repository>
  19. <id>spring-snapshots</id>
  20. <name>Spring Snapshots</name>
  21. <url>https://repo.spring.io/libs-snapshot</url>
  22. <snapshots>
  23. <enabled>true</enabled>
  24. </snapshots>
  25. </repository>
  26. </repositories>

只要classpath中包含Spring Cloud Sleuth,Spring Boot应用将产生trace数据。

  1. @SpringBootApplication
  2. @RestController
  3. public class Application {
  4. private static Logger log = LoggerFactory.getLogger(DemoController.class);
  5. @RequestMapping("/")
  6. public String home() {
  7. log.info("Handling home");
  8. return "Hello World";
  9. }
  10. public static void main(String[] args) {
  11. SpringApplication.run(Application.class, args);
  12. }
  13. }

运行这个程序并进入主页,你将会看到日志中的traceId和spanId,如果这个程序调用了另一个(例如RestTemplate)它将在headers中发送跟踪数据,如果接收器是一个Sleuth应用你会持续看到trace。

NOTE: instead of logging the request in the handler explicitly, you could set logging.level.org.springframework.web.servlet.DispatcherServlet=DEBUG

NOTE: Set spring.application.name=bar (for instance) to see the service name as well as the trace and span ids.

Sample Projects

Simple HTTP appthat calls back to itself

Using Zipkin to collect traces

Messaging with Spring Integration