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)
一.简介 一个分布式系统由若干分布式服务构成,每一个请求会经过多个业务系统并留下足迹,但是这些分散的数据对于问题排查,或是流程优化都很有限. 要能做到追踪每个请求的完整链路调用,收集链路调用上每个 ...
随机推荐
- this.$refs 获取的值是undefined
以下是父组件内的代码截图 如果想取子组件内的方法,参数,等可以试以下两种方法 1.在mounted内使用this.$nextTick(()=>{ }) 2.直接再undated() {} 内 ...
- python 的sys.argv 和 sys.path.append() 用法和PYTHONPATH环境变量
sys.argv 我们编写一个测试用例test.py ,内容如下 imoprt sys a = sys.argv b = len(sys.argv) c = sys.argv[0] d = sys.a ...
- 访问不了github解决方案
1.首先通过网址https://github.com.ipaddress.com/www.github.com查看当前github.com对应的IP地址,查到的信息如下图所示 修改hosts文件,wi ...
- Jquery_002
6.$.ajax方法 $.ajax([options]) options是一个json格式的对象,参数是通过键值对的形式存在的 常用的参数如下: async:(默认: true) 默认设置下,所有请求 ...
- jdk版本与项目依赖jar包不兼容
这两天出现了一个 java.lang.RuntimeException: java.io.IOException: invalid constant type: 18 tomcat启动出现这个问题的原 ...
- DNS服务器(简)
服务端:192.168.182.187 客户端:192.168.182.16 windows客户端:192.168.182.17 1.安装相关服务 yum -y install bind bind-c ...
- Application.HandleMessage与Application.ProcessMessage
HandleMessage: HandleMessage中断应用程序的执行,以便Windows可以在将控制权返回给应用程序之前处理来自Windows消息队列的单个消息. 如果消息队列为空,则Handl ...
- 网页制作02--banner制作
样本: 第一步:先做一个超大的通栏banner盒子. 第二步:在通栏盒子里面做一个版心的盒子 第三部:版心盒子里面在分左边盒子和右边盒子 1号盒子是通栏的大盒子banner,不给宽度,给高度.给一个蓝 ...
- Unity Editor 扩展入门1
教程来源:https://www.youtube.com/watch?v=491TSNwXTIg&t=204s 一个点击物体修改材质颜色的简单editor扩展工具 using UnityEng ...
- 将map转为Bean的工具类 BeanUtil
Map<String,Object> pbclwhMainMap = (Map<String,Object>)param.get("pbclwhMain") ...