借鉴于Dapper(谷歌), Zipkin(twitter)和Htrace(Apache).

介绍

sleuth介绍

sleuth的术语源自 Dapper, 主要概念如下:

  • Span: 基本工作单位, 每次rpc请求或者响应就是一个span. 每个span有64个位id, 同时有个64位traceId.

  • Trace: 一系列span构成的调用树.

  • Annotation: 实时记录事件. 事件类型如下:

    • cs: Client Sent, 客户端发送

    • sr: Server Received, 服务端接收

    • ss: Server Sent, 服务端发送

    • cr: Client Received, 客户端接收

sleuth主要实现了以下功能:

  • 为日志增加MDC(traceId, spanId)

  • 提供分布式追踪模型的抽象

  • 为spring应用调用方式(servlet filter, rest template, feign等)提供接入和接出点

  • 如果集成spring-cloud-sleuth-zipkin, 可以通过http将追踪信息同步到zipkin服务器

目的: 微服务链路追踪, 错误可视化

zipkin介绍

openZipkin是分布式追踪系统. 可以帮助可视化跟踪整个调用链路, 发现微服务的延时问题.

zipkin是基于SpringBoot构建的, 1.x版本支持构建自定义的zipkin服务器. 自zipkin2.0开始, 官方不推荐使用自定义服务器, 建议直接通过docker或者jar运行.

系统框架如下图所示:
分布式日志追踪 - 图1
其中:

  • instrumented client/server: 集成了追踪系统的微服务

    • Java: brave

    • Go: zipkin-go

    • js: zipkin-js

  • transport: 数据传输方式

  • database: 数据库

  • Zipkin:

    • Collector: 收集器

    • Storage: 存储

    • Api: 接口服务

    • UI: 展示界面

使用

添加maven依赖:

  1. <dependency>
  2. <groupId>org.springframework.cloud</groupId>
  3. <artifactId>spring-cloud-starter-sleuth</artifactId>
  4. </dependency>
  5. <dependency>
  6. <groupId>org.springframework.cloud</groupId>
  7. <artifactId>spring-cloud-sleuth-zipkin</artifactId>
  8. </dependency>

日志格式:

  1. 2016-02-02 15:30:57.902 INFO [bar,6bfd228dc00d216b,6bfd228dc00d216b,false] 23030 --- [nio-8081-exec-3] ...
  2. 2016-02-02 15:30:58.372 ERROR [bar,6bfd228dc00d216b,6bfd228dc00d216b,false] 23030 --- [nio-8081-exec-3] ...
  3. 2016-02-02 15:31:01.936 INFO [bar,46ab0d418373cbc9,46ab0d418373cbc9,false] 23030 --- [nio-8081-exec-4] ...

其中MDC格式为: [appname,traceId,spanId,exportable]

至此所有logback日志框架打印的日志均会带有上述traceid信息.

添加bootstrap.yml添加配置(替换localhost)

  1. spring:
  2. zipkin:
  3. baseUrl: localhost:9411

添加后在trace服务器就能看到调用日志了.