全链路追踪组件追踪的数据遵循的规则:
1,Span:基本单元;
执行一次服务调用就生成一个span,用于记录当时的情况 ,以一个64位ID作为唯一标识.span还有其他数据标识如摘要,时间戳信息,关键tag等;
2,Trace:一次请求;
以一个64位ID为唯一标识,可以是一个业务号,通过该ID标识多个span为同一个业务请求,会以一个树状图的形式展示服务的调用;
3,Annotation:注解;
代表调用的客户端和服务端的行为,
Cs :客户端发起一个服务调用,即span的开始
Sr:服务端获取请求信息,并开始处理,sr-cs的时间得到一个时间戳即网络延迟时间;
Ss:服务端处理完请求,将结果返回客户端 ss-sr 的时间得到一个时间戳,即服务端处理请求的所用时间;
Cr:客户端成功接收到服务端的恢复,cr-cs得到的时间戳即客户端从服务端获取响应的时间;
日志部分:
spring-cloud-sleuth-learn: spring-cloud-sleuth全链路追踪 (gitee.com)
搭建之后重点看一下全链路追踪的zipkin部分:
选择服务名就可以查看服务的调用情况:
请求的链路耗时,以及经理了哪些服务的调用;
如果我们要在网管中记录是否是Get请求,我们可以使用网关过滤器:
配置过滤器---zuul模块中继承ZuulFilter
@Slf4j
@Component
public class TraceFilter extends ZuulFilter {
@Autowired
private Tracer tracer;
/**
* 过滤器类型
*
* @return
*/
@Override
public String filterType() {
return FilterConstants.PRE_TYPE;
}
/**
* 过滤器顺序
*
* @return
*/
@Override
public int filterOrder() {
return FilterConstants.PRE_DECORATION_FILTER_ORDER + 10;
}
@Override
public boolean shouldFilter() {
RequestContext currentContext = RequestContext.getCurrentContext();
return "GET".equalsIgnoreCase(currentContext.getRequest().getMethod());
}
@Override
public Object run() throws ZuulException {
tracer.currentSpan().tag("1001", "GET请求");
String traceId = tracer.currentSpan().context().traceIdString();
String spanId = tracer.currentSpan().context().spanIdString();
log.info("当前追踪参数: traceId={},spanId={}", traceId, spanId);
return null;
}
}
Zipkin中找到该请求
上面的全链路追踪的数据保存在zipkin服务器中,服务器出现故障/重启数据就丢失了,因此我们可以考虑全链路数据的保存---持久化:
Zipkin模块中引入相关依赖:
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-webartifactId>
dependency>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-netflix-eureka-clientartifactId>
<version>2.1.0.RELEASEversion>
dependency>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-zipkinartifactId>
<version>2.1.0.RELEASEversion>
dependency>
<dependency>
<groupId>io.zipkin.javagroupId>
<artifactId>zipkin-serverartifactId>
<version>2.12.3version>
dependency>
<dependency>
<groupId>io.zipkin.javagroupId>
<artifactId>zipkin-autoconfigure-uiartifactId>
<version>2.12.3version>
dependency>
<dependency>
<groupId>io.zipkin.javagroupId>
<artifactId>zipkin-autoconfigure-storage-mysqlartifactId>
<version>2.12.3version>
dependency>
<dependency>
<groupId>mysqlgroupId>
<artifactId>mysql-connector-javaartifactId>
<version>8.0.27version>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-jdbcartifactId>
<version>2.1.0.RELEASEversion>
dependency>
建立数据库表:
springcloudsleuth全链路追踪数据表资源-CSDN文库
表的位置:
配置文件:
@Configuration
public class ZipKinMysqlConfig {
@Bean
public MySQLStorage mySQLStorage(DataSource datasource) {
return MySQLStorage.newBuilder().datasource(datasource).executor(Runnable::run).build();
}
}
配置文件:
spring:
application:
name: sleuth-zipkin
datasource:
url: jdbc:mysql://172.21.114.22:3306/seluth
driver-class-name: com.mysql.cj.jdbc.Driver
username: root
password: ******
tomcat:
min-idle: 10
max-active: 50
max-idle: 20
#zipkin持久化配置
zipkin:
storeage:
type: mysql
eureka:
client:
serviceUrl:
defaultZone: http://localhost:1001/eureka,http://localhost:1002/eureka
management:
metrics:
web:
server:
# 取消自动定时,如果不设置,时间序列数量可能会比较长,导致异常
auto-time-requests: false
server:
port: 5001
写入数据库的操作并不是实时性的,而是异步操作;