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)
一.简介 一个分布式系统由若干分布式服务构成,每一个请求会经过多个业务系统并留下足迹,但是这些分散的数据对于问题排查,或是流程优化都很有限. 要能做到追踪每个请求的完整链路调用,收集链路调用上每个 ...
随机推荐
- tidb自动处理僵尸进程脚本
[root@host-2 wj]# vi kill_tidb_zombie.sh #!/bin/bash source /etc/profile cat /dev/null > /tmp/sql ...
- Python标准库模块之heapq
创建堆 heapq有两种方式创建堆, 一种是使用一个空列表,然后使用heapq.heappush()函数把值加入堆中,另外一种就是使用heap.heapify(list)转换列表成为堆结构 #创建堆方 ...
- pythonn全栈学习笔记--logging模块学习(四)
一.logging相关配置 1 import logging 2 """ 3 asctime:运行时间 4 name:主模块名称 5 levelname:日志级别 INF ...
- 2D 消隐效果
在触发消隐的物体(比如玩家)挂下面的代码,以及box collider,rigidbody 2d using UnityEngine; public class ColliderFader : Mon ...
- postman收藏 -大佬玩法。
请求顺序: https://www.cnblogs.com/superhin/p/11454832.html 在Postman脚本中发送请求(pm.sendRequest) : https:// ...
- luogu 1344
首先题意就是裸的最小割啦 然后考虑如何统计边数 这里有一个trick: 我们设定一个大于$m$的阈值,对于每条边的边权我们乘这个阈值+1后跑最小割,得到的答案除以阈值就是真正的最小割,取模阈值后就是最 ...
- mysql零基础-1
数据库概述 为什么要使用数据库 持久化 DB:数据库 DBMS:数据库管理系统 SQL:结构化查询语言 数据库与数据库管理系统关系 数据库管理系统(DBMS)可以管理多个数据库,一般开发人员会针对每一 ...
- 初步学习UE网络同步
UE 网络同步和框架介绍 为一个UE引擎的初学者基于现有知识储备和见识的限制下,对UE网络和游戏框架的粗鄙之见,文中多有错误敬请指出以较后文. 1.网络复制 不论是服务端还是客户端,代码都是一样的 ...
- 人森第一个iOS app,写给我家baby的!纪念一下
用python写的,对于非专业iOS开发来说,py是个不错的选择,使用beeware框架,感觉和写前端差不多
- EXCEL之VLOOKUP函数——查找、分组、排序
1,VLOOKUP查找 新建excel,输入测试数据,F列打乱A顺序,查找他们各自对应的学号 选中目标单元格(此处是G2),点击插入函数: 选择VLOOKUP: 我们要查找F列在A列对应的学号,所以G ...