Sleuth 使用
sleuth是spring cloud中日志链(调用链解决方案),自动添加traceId,spanId。
sleuth包也可单独引入,和其它藕合度小。sleuth + zipkin 实现APM管理。
Sleuth 引入文档
从其它文章web压测结果获悉:sleuth在webmvc下没多大损失,在webflux下损失较大。需注意。
参见:Spring Cloud Sleuth 性能测试_Apple_zhl的博客-CSDN博客
MDC写入信息是在Slf4jScopeDecorator中。
MDC会放入以下内容:
final String previousTraceId = MDC.get("traceId");
final String previousParentId = MDC.get("parentId");
final String previousSpanId = MDC.get("spanId");
final String spanExportable = MDC.get("spanExportable");
final String legacyPreviousTraceId = MDC.get(LEGACY_TRACE_ID_NAME);
final String legacyPreviousParentId = MDC.get(LEGACY_PARENT_ID_NAME);
final String legacyPreviousSpanId = MDC.get(LEGACY_SPAN_ID_NAME);
final String legacySpanExportable = MDC.get(LEGACY_EXPORTABLE_NAME);
private static final String LEGACY_EXPORTABLE_NAME = "X-Span-Export";
private static final String LEGACY_PARENT_ID_NAME = "X-B3-ParentSpanId";
private static final String LEGACY_TRACE_ID_NAME = "X-B3-TraceId";
private static final String LEGACY_SPAN_ID_NAME = "X-B3-SpanId";
Web访问:
sleuth通过在web的请求增加TraceFilter来开启一个新的spanId 和 traceId,在离开时调用close方法关闭之前的trace.
参见类:
TraceWebServletAutoConfiguration -> TracingFilter
将TracingFilter增加到Web的Filter中,同时设置Filter的Order级别为Integer.MIN + 5.也即基本为最前。
因 TracingFilter是建立在Server级别的, 因此加载顺序会优先于Spring程序在Interceptor上设置的拦截器。
Scheduler:
sleuth使用AOP切面拦截所有的scheduler,使用TraceSchedulingAspect类控制生成新的traceId
WebClient数据传递:
TraceRestTemplateCustomizer -> TracingClientHttpRequestInterceptor
因此,只要使用RestTemplate.Builder生成的信息,都会默认会执行RestTemplateCustomizer。而自己new RestTemplate出来的对象则没有此功能。
以上都会自动添加。
pom.xml 引入:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-sleuth-core</artifactId>
<version>2.1.0.RELEASE</version>
</dependency>
线程和线程池使用:
线程-依托TraceRunnable 或 TraceCallable:
public class ThreadTestController {
@Autowired
private Tracing tracing;
@Autowired
private SpanNamer spanNamer;
@RequestMapping("/thread")
public String starterThread() throws InterruptedException {
log.info("trace parent...");
Runnable runnable = new Runnable() {
@Override
public void run() {
log.info("thread test");
}
};
TraceRunnable traceRunnable = new TraceRunnable(tracing, spanNamer, runnable, "myRunnable");
//TraceCallable
Thread thread = new Thread(traceRunnable);
thread.start();
return"OK";
}
}
线程池依托:
内部调用
@Autowired
private BeanFactory beanFactory;
ThreadPoolExecutor myThreadPool = new ThreadPoolExecutor(2, 2,0L,TimeUnit.MILLISECONDS,new LinkedBlockingQueue<Runnable>());
@RequestMapping("/executor2")
public String executor2() throws InterruptedException {
TraceableExecutorService executorService = new TraceableExecutorService(beanFactory, myThreadPool, "1234");
log.info("executor2 parent...");
//TraceCallable
//TraceCallable
for(int i=0;i< 30;i++){
executorService.submit(new SpanRunnable());
}
return"OK";
}
}
bean定义:
@Configuration
@Slf4j
public class BeanConfiguration {
/**
* 切换链接池
* @param beanFactory
* @return
*/
@Bean("myTestExecutor")
public ExecutorService executorService(@Autowired BeanFactory beanFactory){
ThreadPoolExecutor poolExecutor = new ThreadPoolExecutor(5, 5, 100, TimeUnit.SECONDS, new LinkedBlockingQueue<Runnable>());
log.info("poolExecutor:--------------{}",poolExecutor);
TraceableExecutorService executorService = new TraceableExecutorService(beanFactory, poolExecutor, "executePool");
return executorService;
}
}
@Autowired
@Qualifier("myTestExecutor")
private ExecutorService executorService;
/**
*
* @return
* @throws InterruptedException
*/
@RequestMapping("/executor3")
public String executor3() throws InterruptedException {
log.info("executor3 parent...");
log.info("taskExecutor:{}", taskExecutor);
//TraceCallable
//TraceCallable
for(int i=0;i< 30;i++){
executorService.submit(new SpanRunnable());
}
return"OK";
}
Sleuth 使用的更多相关文章
- 使用Spring Sleuth和Zipkin跟踪微服务
随着微服务数量不断增长,需要跟踪一个请求从一个微服务到下一个微服务的传播过程, Spring Cloud Sleuth 正是解决这个问题,它在日志中引入唯一ID,以保证微服务调用之间的一致性,这样你就 ...
- 链接测试工具xenu link sleuth的使用
链接测试工具xenu link sleuth的使用很简单. 可以从这里下载 http://home.snafu.de/tilman/xenulink.html 但是注意到: 如果需要登录才能进入所有的 ...
- SpringCloud学习笔记(7)——Sleuth
Part VII. Spring Cloud Sleuth 46. Introduction Spring Cloud Sleuth为Spring Cloud实现了分布式的跟踪解决方案 46.1 Te ...
- springcloud(十二):使用Spring Cloud Sleuth和Zipkin进行分布式链路跟踪
随着业务发展,系统拆分导致系统调用链路愈发复杂一个前端请求可能最终需要调用很多次后端服务才能完成,当整个请求变慢或不可用时,我们是无法得知该请求是由某个或某些后端服务引起的,这时就需要解决如何快读定位 ...
- SpringCloud学习之sleuth&zipkin【二】
这篇文章我们解决上篇链路跟踪的遗留问题 一.将追踪数据存放到MySQL数据库中 默认情况下zipkin将收集到的数据存放在内存中(In-Memeroy),但是不可避免带来了几个问题: 在服务重新启动后 ...
- SpringCloud学习之sleuth&zipkin
一.调用链跟踪的必要性 首先我们简单来看一下下单到支付的过程,别的不多说,在业务复杂的时候往往服务会一层接一层的调用,当某一服务环节出现响应缓慢时会影响整个服务的响应速度,由于业务调用层次很“深”,那 ...
- Spring Cloud(十二):分布式链路跟踪 Sleuth 与 Zipkin【Finchley 版】
Spring Cloud(十二):分布式链路跟踪 Sleuth 与 Zipkin[Finchley 版] 发表于 2018-04-24 | 随着业务发展,系统拆分导致系统调用链路愈发复杂一个前端请 ...
- Spring Cloud Sleuth服务链路追踪(zipkin)(转)
这篇文章主要讲述服务追踪组件zipkin,Spring Cloud Sleuth集成了zipkin组件. 一.简介 Spring Cloud Sleuth 主要功能就是在分布式系统中提供追踪解决方案, ...
- SpringCloud(7)服务链路追踪Spring Cloud Sleuth
1.简介 Spring Cloud Sleuth 主要功能就是在分布式系统中提供追踪解决方案,并且兼容支持了 zipkin,你只需要在pom文件中引入相应的依赖即可.本文主要讲述服务追踪组件zipki ...
- 第八篇: 服务链路追踪(Spring Cloud Sleuth)
一.简介 一个分布式系统由若干分布式服务构成,每一个请求会经过多个业务系统并留下足迹,但是这些分散的数据对于问题排查,或是流程优化都很有限. 要能做到追踪每个请求的完整链路调用,收集链路调用上每个 ...
随机推荐
- JAVASCRIPT 对有符号整型、无符号整型、浮点型、十六进制、二进制的数据处理
1.十六进制字符串转有符号整型,支持S8.S16.S32: function hexToInt(hex) { if(hex.length % 2 != 0) { hex = "0" ...
- TypeScript - 安装,类型
// 要使用typescript需要全局安装 通过tsc -v 来验证是否安装成功 npm i -g typescript// ts 文件中完全可以写js语法, 完全兼容js // ts 本身在运行时 ...
- 逆向学习物联网-网关ESP8266-01硬件原理及平台搭建
1.系统原理 2.ESP8266网关的内部原理框图 1)STM32通过COM2以AT指令与ESP-01进行通讯,实现MQTT协议, 2)将COM3收到的JSON数据,透明传输到云端 3)通过COM2收 ...
- ThreadPoolTaskExecutor线程池创建
package com.xx.xx.config; import java.util.concurrent.ThreadPoolExecutor; import org.slf4j.Logger; i ...
- 「SOL」E-Lite (Ural Championship 2013)
为什么这数据能水到可以枚举角度 ac 啊 # 题面 给你 \(n\) 个平面向量 \((x_i,y_i)\),对于每个 \(k=1\sim n\),求「从给出的 \(n\) 个向量中不重复地选择 \( ...
- 20192305 王梓全Python程序设计实验一报告
20192305 王梓全Python程序设计实验一报告 课程:<Python程序设计> 班级: 1923 姓名: 王梓全 学号:20192305 实验教师:王志强 实验日期:2021年4月 ...
- Epoll的使用例子
本篇文章在上一篇的基础上,使用 epoll 实现了一个事件监听和回调处理的模块.如何编写一个使用该模块的例子呢? 监测什么类型的fd,监测什么类型的事件,监测到事件以后需要做什么?后来可以看看如何将 ...
- Windows+svn +Jenkins+发布NetCore/VUE项目
1. NetCore环境下载,注意是下载SDK,不是Runtime:https://dotnet.microsoft.com/download/dotnet-core?utm_source=getdo ...
- c++学习9 结构体
一 结构体赋值 结构体赋值的方法有三种,逐个成员赋值,整体赋值和拷贝赋值. 设一个结构体有struck student{ int age;char ch[32]; }: 逐个成员赋值:student ...
- 【已解决】Jenkins构建成功但发送邮件失败,报错“Not sending mail to unregistered user xxx@xxx.com because your SCM claimed this was associated with a user ID ‘xxx which your security realm does not recognize; ”
问题描述:构建成后,但发送邮件失败,具体报错截图如下: 原因:用户在jenkins中名称与发送邮件汇总设置不一样且没有勾选"Allow sending to unregistered use ...