SkyWalking8.x监控异步跨线程问题

  • 一. 异步多线程问题
    • 添加依赖
    • 开启异步多线程
    • 测试类方法
    • Controller层处理
    • 分析
  • 二. 指定跟踪上下文的K-V
  • 制作不易,求一个点赞+关注~~

一. 异步多线程问题

首先,Skywalking是一款基于java代理的监控系统,但是在监控多线程跨线程的时候却会意外失联,这就让我们没办法去追踪调用链路问题

类似于下图

@GetMapping("/task1")public CommonReturnType task1() throws Exception {for (int i = 0; i < 5; i++) {new Thread(()->{log.info("1");});}return CommonReturnType.creat(1);}


当然,只是为了演示简单,就没有写异步多线程,SkyWalking默认情况下只会采集同一线程的调用链路,如果应用里面采用了多线程,同时希望追踪链路能将多个线程的链路关联起来。则需要使用插件apm-toolkit-trace,下面通过一个小Demo来进行演示

添加依赖

 <dependency><groupId>org.apache.skywalking</groupId><artifactId>apm-toolkit-trace</artifactId><version>8.4.0</version></dependency>

开启异步多线程

主动启动类添加

@SpringBootApplication
@EnableAsync
public class IotMain8239 {public static void main( String[] args ){SpringApplication.run(IotMain8239.class,args);}
}

测试类方法

import com.fehead.Iot.mapper.GwKkkTest1Mapper;
import lombok.extern.slf4j.Slf4j;
import org.apache.skywalking.apm.toolkit.trace.ActiveSpan;
import org.apache.skywalking.apm.toolkit.trace.RunnableWrapper;
import org.apache.skywalking.apm.toolkit.trace.TraceContext;
import org.apache.skywalking.apm.toolkit.trace.TraceCrossThread;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component;import java.util.Optional;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;@Component
@Slf4j
public class HelloTask {@AutowiredGwKkkTest1Mapper gwKkkTest1Mapper;ExecutorService executorService = Executors.newCachedThreadPool();@Asyncpublic void asynchelloWorld(){try {Thread.sleep(5000);//插入数据库用户GwKkkTest1 gwKkkTest1 = new GwKkkTest1(40000, "s", "s", "s");executorService.submit(RunnableWrapper.of(()->{gwKkkTest1Mapper.insert(gwKkkTest1);try {Thread.sleep(5000);} catch (InterruptedException e) {e.printStackTrace();}Optional<String> value = TraceContext.getCorrelation("key");  //拿到同一链路的指定keylog.info("down : insert1 + " +value.get());}) );executorService.submit(RunnableWrapper.of(()->{gwKkkTest1Mapper.insert(gwKkkTest1);try {Thread.sleep(7000);} catch (InterruptedException e) {e.printStackTrace();}Optional<String> value = TraceContext.getCorrelation("jia"); //拿到同一链路的指定keylog.info("down : insert2 + " +value.get());}) );log.info("down : HelloTask");//            ActiveSpan.tag("intask", "王凯艺"); 打标记k,v}catch (Exception e){e.printStackTrace();}}}

Controller层处理

@AutowiredHelloTask helloTask;@GetMapping("/task")public CommonReturnType task() throws Exception {ActiveSpan.tag("type", "异步任务多线程任务");log.info("come in : /task");TraceContext.putCorrelation("key", "kaikai");TraceContext.putCorrelation("jia", "jiajia");helloTask.asynchelloWorld();return CommonReturnType.creat(1);}
  • 我们可以通过 ActiveSpan.tag(“type”, “异步任务多线程任务”) 去追踪里面添加相应的标签指定K-V
  • 在跟踪方法的上下文中添加自定义标签ActiveSpan.tag(“key”, “val”)。
  • ActiveSpan.error() 将当前范围标记为错误状态。
  • ActiveSpan.error(String errorMsg) 通过消息将当前范围标记为错误状态。
  • ActiveSpan.error(Throwable throwable) 使用Throwable将当前范围标记为错误状态。
  • ActiveSpan.debug(String debugMsg) 在当前范围中添加调试级别日志消息。
  • ActiveSpan.info(String infoMsg) 在当前范围内添加信息级别日志消息。
  • ActiveSpan.setOperationName(String operationName) 自定义操作名称。

  • 再来查看控制台发现已经打印出异步多线程的路线了,并且追踪ID相同

分析

主要添加RunnableWrapper.of()来指定跟踪线程

  executorService.submit(RunnableWrapper.of(()->{gwKkkTest1Mapper.insert(gwKkkTest1);try {Thread.sleep(5000);} catch (InterruptedException e) {e.printStackTrace();}Optional<String> value = TraceContext.getCorrelation("key");  //拿到同一链路的指定keylog.info("down : insert1 + " +value.get());}) );

也可以添加其他多线程方法

CallableWrapper.of()
CompletableFuture.supplyAsync(() ->{});

也可以添加指定实现多线程的类上注解 @TraceCrossThread

    @TraceCrossThreadpublic static class MyTask<String> implements Callable<String> {}

二. 指定跟踪上下文的K-V

类似于ThreadLocal

使用TraceContext.putCorrelation()API将自定义数据放在跟踪上下文中。

Optional<String> previous = TraceContext.putCorrelation("customKey", "customValue");

当值是null或为空时,CorrelationContext将删除该项目。

Optional<String> value = TraceContext.getCorrelation("customKey");

使用TraceContext.getCorrelation()API获取自定义数据。

制作不易,求一个点赞+关注~~

SkyWalking8.4监控跨线程问题解决相关推荐

  1. ZeroMq实现跨线程通信

    ZeroMq实现跨线程通信 之前在技术崇拜的技术经理指导下阅读了ZeroMq的基础代码,现在就将阅读的心得与成果记录一下,并重新模仿实现了一下经理的异步队列. 1.对外接口 //主要接口(1)void ...

  2. c#中如何跨线程调用windows窗体控件?

    我们在做winform应用的时候,大部分情况下都会碰到使用多线程控制界面上控件信息的问题.然而我们并不能用传统方法来做这个问题,下面我将详细的介绍. 首先来看传统方法: public partial ...

  3. js 原生跨页面通信_DOM操作是跨线程的你知道吗?

    在JS世界里面浏览器有两个重要的功能,分为渲染引擎和JS引擎.渲染引擎专门负责渲染Html和css的,JS引擎是专门用来执行JS的.这两个引擎是在不同的线程里面,它们都自己做着自己的事情,互不打扰. ...

  4. Logback日志跨线程追踪实践

    Logback日志跨线程追踪实践 当我们程序在服务器上面跑的时候,是不是很多时候很难定位问题? 当一大堆繁杂的日志文件丢给你的时候,你如何能从中定位到问题? 本项目源码已经上传Github: gith ...

  5. C# 跨线程赋值的简单做法

    通常,C#是不许跨线程赋值的,如:Form1中有个textbox, 若开辟一个新的线程来给 这个textbox赋值时,会出现异常. MSDN中提出了具体的做法,较为繁琐,就不说了. 我这里有个简单办法 ...

  6. jmeter全局变量传参_Jmeter 将正则表达式提取的参数传给全局(跨线程组使用变量)...

    一.使用正则表达式提取sessionId 1.在测试计划(跨线程组使用变量)--> 线程组(登录)--> 添加HTTP请求(登录接口) (1)创建测试计划: 勾选独立运行每个线程组(例如在 ...

  7. 【原创】modb 功能设计之“跨线程通信”

    2019独角兽企业重金招聘Python工程师标准>>> 在< modb 功能设计之"支持多消费者单生产者" >中曾提到,需要解决"rabbi ...

  8. jmeter跨线程组传值

    在测试过程中,有时候需要jmeter跨线程组传值,jmeter本身又不具备此功能,那么,又该如何实现呢? 其实,我们可以通过BeanShell去实现. 实现过程如下: 1.线程组A中,使用正则表达式提 ...

  9. Win64 驱动内核编程-12.回调监控进线程创建和退出

    回调监控进线程创建和退出 两个注册回调的函数:PsSetCreateProcessNotifyRoutine   进程回调PsSetCreateThreadNotifyRoutine    线程回调分 ...

最新文章

  1. 一行代码简化Python异常信息:错误清晰指出,排版简洁美观 | 开源分享
  2. python自学视频-师傅带徒弟学Python:第一篇Python基础视频课程
  3. HDU1248 寒冰王座 【数学题】or【全然背包】
  4. vijos P1009清帝之惑之康熙
  5. 关于C#的GetHashCode
  6. 绿米开关如何重置_智能家居基础配置之人体传感器—绿米Aqara 人体传感器
  7. 图文讲解 sqlserver 2000 评测版 数据库过期 的解决方法
  8. 自己封装的一个模拟下拉列表的插件
  9. ajax+springmvc返回中文乱码的解决办法
  10. JAVA300集速学堂高淇个人笔记P1-P7如何学习JAVA300集计算机语言的发展历史多种编程语言的介绍JAVA三大版本的含义:
  11. 【uni-app】uni-app移动端开发 - 登录界面
  12. android studio图形验证码,android 一行代码,快速实现图片验证码(附android studio 版小demo)...
  13. 18_2Servlet学习笔记
  14. bnu1061 古墓丽影 C语言版
  15. 生物技术如何利用计算机思维,阿米巴,真正强大的生物计算机了解一下?
  16. 恢复IDEA中误删的文件
  17. uniapp 移动端通话录音上传
  18. 浙大计算机学院多厉害,一张图,就能告诉你浙大到底有多牛!
  19. 初识以太坊 ——钱包、测试网络和简单交易
  20. 机器学习笔记之玻尔兹曼机(一)基本介绍

热门文章

  1. thinkadmin开源框架获取添加信息的主键id
  2. 4G信号变卡的主要原因
  3. 潜入浅出,java多线程到底是个什么东东?面试中应该注意哪方面多线程的知识?
  4. 实验1 蓝桥ROS1机器人入门 适用kinetic/melodic/noetic
  5. 【已解决】PEP 8: W292 no newline at end of file等相关PEP 8错误与警告
  6. laravel 实现微博第三方登陆
  7. 二元多项式基本运算 选择合适的存储结构表示二元多项式,并实现基本的加减运算 要求: 1)二元多项式的输入采用如下方式进行键盘输入 (5y^2+7)x^4 + (3y^4+2y+9)x^2 + (2y
  8. Android工具开发一(清除手机所有app缓存)
  9. 自动回复的三种形式?
  10. 怎么制作一个蒙版效果