全链路追踪traceId,ThreadLocal与ExecutorService
关于全链路追踪traceId遇到线程池的问题,做过架构的估计都遇到过,现在以写个demo,总体思想就是获取父线程traceId,给子线程,子线程用完移除掉。
mac上的chrome时不时崩溃,写了一大半的博客没了,直接贴源码和注释吧
import org.slf4j.Logger;
import org.slf4j.LoggerFactory; public class ThreadPoolTracing { private static final Logger logger = LoggerFactory.getLogger(ThreadPoolTracing.class);
public static ThreadLocal<String> threadLocalTraceId = new ThreadLocal<>(); static class Task implements Runnable { @Override
public void run() {
String traceId=threadLocalTraceId.get();
logger.info("traceId={}",traceId);
}
}
}
public class MyTest2 { private static final Logger loger = LoggerFactory.getLogger(MyTest2.class);
//线程池大小设置为一,保证是同一个线程run之前获取traceId,run后删除,便于测试
private static ExecutorService executorService = Executors.newFixedThreadPool(1); @Test
public void test1() { String traceId = UUID.randomUUID().toString().replace("-", "");
ThreadPoolTracing.threadLocalTraceId.set(traceId);
loger.info("父线程={};traceId={}",Thread.currentThread().getName(),traceId); Runnable runnable=new Runnable() {
@Override
public void run() {
//ThreadLocal 拿不到值;如果是InheritableThreadLocal,可以拿到值
String id0 = ThreadPoolTracing.threadLocalTraceId.get();
loger.info("子线程={},traceId={}",Thread.currentThread().getName(),id0);
}
};
executorService.execute(runnable);//结果为空
executorService.execute(new ThreadPoolTracing.Task());//结果为空 Runnable wrap= wrap( runnable);
executorService.execute(wrap);//可以获取traceId
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
traceId = UUID.randomUUID().toString().replace("-", "");
//traceId 重新复制
ThreadPoolTracing.threadLocalTraceId.set(traceId);
loger.info("父线程={};traceId={}",Thread.currentThread().getName(),traceId);
//线程池中的traceId跟着变更
wrap= wrap( runnable);
executorService.execute(wrap); try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
} public Runnable wrap(Runnable task) {
//获取父线程中的Trace
String id0 = ThreadPoolTracing.threadLocalTraceId.get();
class CurrentTraceContextRunnable implements Runnable {
@Override
public void run() {
//traceId 给子线程
ThreadPoolTracing.threadLocalTraceId.set(id0);
task.run();
//子线程用完删除
ThreadPoolTracing.threadLocalTraceId.remove();
}
}
return new CurrentTraceContextRunnable(); } }
全链路追踪traceId,ThreadLocal与ExecutorService的更多相关文章
- 基于SLF4J的MDC机制和Dubbo的Filter机制,实现分布式系统的日志全链路追踪
原文链接:基于SLF4J的MDC机制和Dubbo的Filter机制,实现分布式系统的日志全链路追踪 一.日志系统 1.日志框架 在每个系统应用中,我们都会使用日志系统,主要是为了记录必要的信息和方便排 ...
- Node.js 应用全链路追踪技术——[全链路信息获取]
全链路追踪技术的两个核心要素分别是 全链路信息获取 和 全链路信息存储展示. Node.js 应用也不例外,这里将分成两篇文章进行介绍:第一篇介绍 Node.js 应用全链路信息获取, 第二篇介绍 N ...
- go微服务框架kratos学习笔记九(kratos 全链路追踪 zipkin)
目录 go微服务框架kratos学习笔记九(kratos 全链路追踪 zipkin) zipkin使用demo 数据持久化 go微服务框架kratos学习笔记九(kratos 全链路追踪 zipkin ...
- skywalking与pinpoint全链路追踪方案对比
由于公司目前有200多微服务,微服务之间的调用关系错综复杂,调用关系人工维护基本不可能实现,需要调研一套全链路追踪方案,初步调研之后选取了skywalking和pinpoint进行对比; 选取skyw ...
- 【AWS】使用X-Ray做AWS云上全链路追踪监控系统
功能 AWS X-Ray 是一项服务,收集应用程序所请求的相关数据,并提供用于查看.筛选和获取数据洞察力的工具,以确定问题和发现优化的机会. 对于任何被跟踪的对您应用程序的请求,不仅可以查看请求和响应 ...
- 全链路追踪体验—最简陋TraceId的生成
对于后端开发来说,排查问题是常有的事情.而排查问题时最常用的就是看日志,看一次调用中经过了哪些系统,是那个系统出问题了.这就需要业务日志中关联调用链的TraceId信息,从而在应用出现问题时,能够通过 ...
- 全链路跟踪TraceId
数据库主键:标示唯一一条数据,譬如唯一商品,唯一订单 全局事务ID:实现分布式事务一致性的必备良药 请求ID:requestId,seesionId,标示一个请求或者一次会话的生命周期 身份证ID:代 ...
- Spring Cloud全链路追踪实现(Sleuth+Zipkin+RabbitMQ+ES+Kibana)
简介 在微服务架构下存在多个服务之间的相互调用,当某个请求变慢或不可用时,我们如何快速定位服务故障点呢?链路追踪的实现就是为了解决这一问题,本文采用Sleuth+Zipkin+RabbitMQ+ES+ ...
- Spring Cloud 全链路追踪实现
简介 在微服务架构下存在多个服务之间的相互调用,当某个请求变慢或不可用时,我们如何快速定位服务故障点呢?链路追踪的实现就是为了解决这一问题,本文采用Sleuth+Zipkin+RabbitMQ+ES+ ...
随机推荐
- [并查集] 1118. Birds in Forest (25)
1118. Birds in Forest (25) Some scientists took pictures of thousands of birds in a forest. Assume t ...
- Powershell笔记之MVA课程
很早之前看过MVA的Powershell课程,最近准备回顾一下,还是有一些意外的收获. <<快速入门 : PowerShell 3.0 高级工具和脚本>> 1. Invoke- ...
- elasticsearch6 学习之安装
安装环境:centos6.5 64位 jdk1.8 elasticsearch6.1.1 一.启动 [root@localhost bin]# ./elasticsearch - ...
- 使用userData兼容IE6-10,chrome,FF 及360等浏览器的本地存储
开发过程中涉及本地存储的使用,IE很多版本都不支持localStorage,没办法,就得兼容使用userData了.废话不说了,看代码: (function(window){var LS;(funct ...
- jmeter 正则表达式提取
引用名称:自己定义的变量名称,后续请求将要引用到的变量名,如填写的是:id,后面的引用方式是${id} 正则表达式:提取内容的正则表达式,相当于lr中的关联函数 [() 括起来的部分就是需要提 ...
- 用SQL查询方式显示GROUP BY中的TOP解决方法[转]
用SQL查询方式显示GROUP BY中的TOP怎样用一个SQL语句来显示 分组后每个组的前几位 比如把一个学校所有学生的成绩按班级分组,再显示每个班级前五名的信息. 班级 学生 成绩 一班 ...
- Python学习---基础篇
###打开文件并打印: #!/usr/bin/python3 f = open('F://myproject/test.txt', encoding='utf-8',mode='r') content ...
- 3.11 - 3.12 A day with Google
补了一番游记. 找了一个本科学弟一起去上海游玩.本来老板还要我周一过去讨论寒假阅读的论文,总算是把讨论时间挪到周六了. 兴冲冲地买好车票后就开始期待上海Google office的神秘之旅. upda ...
- BZOJ 2738 子矩阵第k大 | 二维树状数组 整体二分 分治
BZOJ 2738 "矩阵乘法"(子矩阵第k大) 题意 给出一个矩阵,多次询问子矩阵中第k大的数是多少. 题解 我做这道题之前先照着这道题出了一道题,是这道题的一维版本,在这里:h ...
- Java EE之JSTL(下)
3.使用国际化和格式化标签库(FMT命名空间) 如果你希望创建部署在Web上,并面向庞大的国际化用户的企业级Java应用程序,那么你最终需要为世界的特定区域进行应用程序本地化.这将通过国际化实现(通常 ...