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>

 

posted @ 2020-09-04 17:21  红嘴鲤鱼  阅读(724)  评论(0编辑  收藏  举报