spring cloud sleuth

作用:分布式服务链路跟踪监控

使用

增加依赖

<dependency>
<groupid>org.springframework.cloud</groupid>
<artifactid>spring-cloud-starter-sleuth</artifactid>
</dependency>

跟踪原理

• 为了实现请求跟踪,当请求发送到分布式系统的入口端点时,只需要服务跟踪框架为该请求创建 一 个唯 一 的跟踪标识,同时在分布式系统内部流转的时候,框架始终保待传递 该唯 一 标识,直到返回给请求方为止,这个唯一标识就是前文中提到的Trace ID.通过TraceID的记录, 我们就能将所有请求过程的日志关联起来。
• 为了统计各处理单元的时间延, 当请求到达各个服务组件, 或是处理逻辑到达某个状态,也通过 一 个唯 一 标识来标记它的开, 具体过程以及结束,该标识就是前文中提到的SpanID。 对于每个Span来说, 它必须有开始和结束两个节点,通过记录开始 Span和结束Span的时间戳,就能统计出该Span的时间延迟,除了时间戳记录之外,它还可以包含一些其他元数据,比如事件名称,请求信息等。

抽样收集

  • 在分布式系统中,日志如果全部打出来,会很多,很消耗系统性能,在sleuth中采取了抽样收集的方式,其抽样收集的策略是通过smapler接口实现的

通过实现 isSarnpled 方法, Spring Cloud Sleuth 会在产生跟踪信息的时候调用它来为跟踪信息生成是否要被收集的标志.需要注意的, 即使 isSampled 返回了false, 它仅代表该跟踪信息不被输出到后续对接的远程分析系统(比如 Zipkin), 对于请求的跟踪活动依然会进行,所以我们在日志中还是能看到收集标识为 false 的记录
默认情况下, Sleuth 会使用 PercentageBasedSarnpler 实现的抽样策略,以请求百分比的方式配置和收集跟踪信息。 我们可以通过在 application.properties 中配置下面的参数对其百分比值进行设置

spring.sleuth.sampler.percentage = 0.1
如果是要百分百收集跟踪信息,可以把上面的值设置为1,也可以用下面的方式

@Bean
public AlwaysSampler defaultSampler () (
return new AlwaysSampler();
}

和logstash整合


分布式中日志也只是存在各自的服务器上,最好是整合在一个服务器上,可以使用ELK平台,
1:导入依赖

<dependency>
<groupid>net.logstash.logback</groupid>
<artifactid>logstash-logback-encoder</artifactid>
<version>4.6</version>
</dependency>

2:在bootstrap.properties文件中配置

spring.application.name = trace-1

3:配置 logback-spring.xml

<?xml version = "l. 0" encoding = "UTF - 8"?>
<configuration>
<include resource = "org/springframework/boot/logging/logback/defaults.xml"/>
<springProperty scope = "context" name = "springAppName" source = "spring.
application.name"/>
<'-- 日志在工程中的出位置-- >
<property name = "LOG_FILE" value = "${BUILD_FOLDER:-build}/${springAppName}"/>
<! - -控制台的日志捡出样式-->
<property name = "CONSOLE_LOG_PATTERN"
value = "%clr(%d(yyyy-MM-dd HH:mm:ss.SSS}) (faint}% clr(${LOG_LEVEL_PATTERN:
-%Sp}) %clr([${springAppName:-},%X{X-B3-Traceid:-},%X(X-B3-Spanid:-},%X{X-Span-Expo
rt:-}]) (yellow}%clr(${PID:- }) (magenta} %clr(---) {faint}%clr([15.15t]) { faint) %c
lr(%-40.40logger{39}) {cyan) %clr(:) (faint}%m%n${LOG_EXCEPTI0N_CONVERSION一_ WORD:-%wE
x} "/>
<! -- 控制台Appender -->
<appender name = "console" class = "ch.qos.logback.core.ConsoleAppender">
<filter class = "ch.qos.logback.classic.filter.ThresholdFilter">
<level>INFO</level>
</filter>
<encoder>
<pattern>${CONS0LE_LOG—PATTERN}</pattern>
<charset>utf8</charset>
</encoder>
</appender>
<'
--
为logstash输出的JSON格式的Appender
一 >
<appender name = " logstash" class = "ch.qos.logback.core.rolling.RollingFileAppender">
 
<file>${LOG_ FILE}. json</ file>
<rollingPolicy class = "ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${LOG—FILE}. json. %d{yyyy-MM-dd}. gz</fileNamePattern>
<maxHistory>7</maxHistory>
</rollingPolicy>
<encoder class = "net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder">
<providers>
<times tamp>
<timeZone>UTC</timeZone>
</timestamp>
<pattern>
<pattern>
"severity": "%level",
"service" : "$ { springAppName: -} ",
"trace": "%X{X-B3-Traceid:-} ",
"span": "%X{X-B3-Spanid:-} ",
"exportable": "%X{X-Span-Export: 一}
” ,
"pid": "${PIO:-}",
"thread": "%thread",
"class": "%logger{40}",
"rest": "%message"
</pattern>
</pa七tern>
</providers>
</encoder>
</appender>
<root level="INFO">
<appender-ref ref = "console"/>
<appender-ref ref="logstash"/>
</root>

和Zipkin整合


HTTP整合

消息中间件整合

收集原理