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 使用的更多相关文章

  1. 使用Spring Sleuth和Zipkin跟踪微服务

    随着微服务数量不断增长,需要跟踪一个请求从一个微服务到下一个微服务的传播过程, Spring Cloud Sleuth 正是解决这个问题,它在日志中引入唯一ID,以保证微服务调用之间的一致性,这样你就 ...

  2. 链接测试工具xenu link sleuth的使用

    链接测试工具xenu link sleuth的使用很简单. 可以从这里下载 http://home.snafu.de/tilman/xenulink.html 但是注意到: 如果需要登录才能进入所有的 ...

  3. SpringCloud学习笔记(7)——Sleuth

    Part VII. Spring Cloud Sleuth 46. Introduction Spring Cloud Sleuth为Spring Cloud实现了分布式的跟踪解决方案 46.1 Te ...

  4. springcloud(十二):使用Spring Cloud Sleuth和Zipkin进行分布式链路跟踪

    随着业务发展,系统拆分导致系统调用链路愈发复杂一个前端请求可能最终需要调用很多次后端服务才能完成,当整个请求变慢或不可用时,我们是无法得知该请求是由某个或某些后端服务引起的,这时就需要解决如何快读定位 ...

  5. SpringCloud学习之sleuth&zipkin【二】

    这篇文章我们解决上篇链路跟踪的遗留问题 一.将追踪数据存放到MySQL数据库中 默认情况下zipkin将收集到的数据存放在内存中(In-Memeroy),但是不可避免带来了几个问题: 在服务重新启动后 ...

  6. SpringCloud学习之sleuth&zipkin

    一.调用链跟踪的必要性 首先我们简单来看一下下单到支付的过程,别的不多说,在业务复杂的时候往往服务会一层接一层的调用,当某一服务环节出现响应缓慢时会影响整个服务的响应速度,由于业务调用层次很“深”,那 ...

  7. Spring Cloud(十二):分布式链路跟踪 Sleuth 与 Zipkin【Finchley 版】

    Spring Cloud(十二):分布式链路跟踪 Sleuth 与 Zipkin[Finchley 版]  发表于 2018-04-24 |  随着业务发展,系统拆分导致系统调用链路愈发复杂一个前端请 ...

  8. Spring Cloud Sleuth服务链路追踪(zipkin)(转)

    这篇文章主要讲述服务追踪组件zipkin,Spring Cloud Sleuth集成了zipkin组件. 一.简介 Spring Cloud Sleuth 主要功能就是在分布式系统中提供追踪解决方案, ...

  9. SpringCloud(7)服务链路追踪Spring Cloud Sleuth

    1.简介 Spring Cloud Sleuth 主要功能就是在分布式系统中提供追踪解决方案,并且兼容支持了 zipkin,你只需要在pom文件中引入相应的依赖即可.本文主要讲述服务追踪组件zipki ...

  10. 第八篇: 服务链路追踪(Spring Cloud Sleuth)

    一.简介 一个分布式系统由若干分布式服务构成,每一个请求会经过多个业务系统并留下足迹,但是这些分散的数据对于问题排查,或是流程优化都很有限.   要能做到追踪每个请求的完整链路调用,收集链路调用上每个 ...

随机推荐

  1. java乱码处理

    package com.zhouhe.util; import java.io.UnsupportedEncodingException; /** * 自定义工具类 * @Author zhouhe ...

  2. 2022-04-18内部群每日三题-清辉PMP

    1.在为一个有预算限制的项目生成状态报告时,项目经理发现该项目比进度计划落后一周.若要将项目拉回正轨,项目经理应该怎么做? A.重新分配关键路径活动的团队成员. B.向项目发起人要求额外的时间. C. ...

  3. mongoengine模型字段非严格校验FieldDoesNotExist

    背景 最近需要从mongoDB中查询数据用于数据分析,一开始就用了pymongo后来发现使用起来很不方便,后面了解到有类似SQLAlchemy的ORM模块mongoengine能够操mongo 简单看 ...

  4. 摘抄笔记 centos内核优化

  5. C语言II一作业02

    1.作业头 | 这个作业属于哪个课程 | < https://edu.cnblogs.com/campus/zswxy/SE2020-3> | | ---- | ---- | ---- | ...

  6. Flask默认配置参数

    方式一:字段赋值方式导入 1 2 3 4 5 6 7 8 9 10 11 12 13 14 from flask import Flask   app = Flask(__name__)   app. ...

  7. adaptsegnet 论文分析比较好的

    https://blog.csdn.net/weixin_43795588/article/details/118058775 常用的语义分割一般是由两部分组成:一部分是特征提取器,比如可以用Resn ...

  8. c++学习7 指针与数组

    一 二维数组与数组指针的关系 二维数组名,代表的是第0行的行地址,"+1"是跳过一个行.而取" * "的话,则是在当前行地址基础上再取列地址,那么如果我们再取一 ...

  9. CSS手册

    3. CSS背景 1. 颜色 body {background-color:#b0c4de;} 十六进制 - 如:"#ff0000" RGB - 如:"rgb(255,0 ...

  10. Redis Template部分接口学习记录

    Redis Template是操作redis的一个封装模板,让我们更加简便的去操作redis. 操作键类型的接口: GeoOperations Redis的地理空间操作,如GEOADD,GEORADI ...