springcloud微服务-sleuth
链路追踪的功能
sleuth工作方式:
MDC+logpattern,MDC底层是inheritable threadLocal,底层是一个map结构,用来保存当前线程的上下文信息,sleuth通过AOP机制在方法调用的时候,将追踪信息记录到MDC中,日志打印的时候将MDC中的信息取出,记录到日志。
sleuth数据结构:
1.traceId,全局唯一链路id
2.spanId,单元id,一个链路分为多个单元。
3.annotation,一个span中包含多个独立事件,client send,server received,server send,client received。
在上下游传递的过程中,通过放在http请求的header中来实现traceid,spanId,parent spanId等的传递
怎么集成sleuth?
引入相关依赖包即可
zipkin是什么?链路追踪信息的可视化组件,分布式监控组件,类似于hystrix的turbine
zipkin使用步骤
1.引入相关依赖
2.启动类加上@EnableZipkinServer注解
3.配置文件添加配置
4.访问zipkin页面即可
sleuth集成zipkin步骤
1.引入依赖
2.配置文件添加配置,zipkin地址和采样率(1代表100%采样)
sleuth集成ELK步骤
1.docker搭建ELK
1. 下载镜像(时间很久,耐心要足):
docker pull sebp/elk
2. 创建Docker容器(只用在第一次使用的时候才创建)
docker run -p 5601:5601 -p 9200:9200 -p 5044:5044 -e ES_MIN_MEM=128m -e ES_MAX_MEM=1024m -it --name elk sebp/elk
3. 进入docker容器:
docker exec -it elk /bin/bash
4. 修改配置文件
配置文件的位置:/etc/logstash/conf.d/02-beats-input.conf
将其中的内容都删掉,替换成下面的配置
input {
tcp {
port => 5044
codec => json_lines
}
}
output{
elasticsearch {
hosts => ["localhost:9200"]
}
}
5. 重启docker容器(大概等5-10分钟,等待服务重启)
docker restart elk
6. 访问Kibana
http://localhost:5601/
2.sleuth项目引入logstash依赖
3.配置日志文件,输出json格式日志到logstash
<?xml version="1.0" encoding="UTF-8"?>
<!--该日志将日志级别不同的log信息保存到不同的文件中 -->
<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{HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}" />
<!-- 控制台输出 -->
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>INFO</level>
</filter>
<!-- 日志输出编码 -->
<encoder>
<pattern>${CONSOLE_LOG_PATTERN}</pattern>
<charset>utf8</charset>
</encoder>
</appender>
<!-- Logstash -->
<!-- 为logstash输出的JSON格式的Appender -->
<appender name="logstash"
class="net.logstash.logback.appender.LogstashTcpSocketAppender">
<destination>127.0.0.1:5044</destination>
<!-- 日志输出编码 -->
<encoder
class="net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder">
<providers>
<timestamp>
<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": "${PID:-}",
"thread": "%thread",
"class": "%logger{40}",
"rest": "%message"
}
</pattern>
</pattern>
</providers>
</encoder>
</appender>
<!-- 日志输出级别 -->
<root level="INFO">
<appender-ref ref="console" />
<appender-ref ref="logstash" />
</root>
</configuration>