Skywalking解决跨线程问题

2023-10-17  本文已影响0人  海阔天空_d304

链路图

树形图

image.png

列表

image.png

插件集成步骤:

1.插件定义

实例方法定义:ClassInstanceMethodsEnhancePluginDefine

静态方法定义:ClassStaticMethodsEnhancePluginDefine

2.插件拦截器

类似于环绕通知,在方法执行之前,之后,出现异常做一些处理

/**
* EnhancedInstance:每个目标类都会实现这个接口,目的是增加一个属性可以传递的数据------跨线程?
**/
public void beforeMethod(EnhancedInstance objInst, Method method, Object[] allArguments, Class<?>[] argumentsTypes, MethodInterceptResult result){
}

3.配置插件定义类

skywalking-plugin.def,key-value结构

key:自定义名称

value:插件定义类全类名

例子:netty-server=org.apache.skywalking.apm.plugin.netty.server.define.HttpObjectEncoderInstrumentation

问题及风险:

1.链路跨线程

异步线程续接-上

异步线程续接-中

异步线程续接-下

  1. 使用注解

    注解方式跨线程

<dependency>
    <groupId>org.apache.skywalking</groupId>
    <artifactId>apm-toolkit-trace</artifactId>
    <version>${skywalking.version}</version>
</dependency>
@TraceCrossThread
public static class MyCallable<String> implements Callable<String> {
    @Override
    public String call() throws Exception {
        return null;
    }
}
...
ExecutorService executorService = Executors.newFixedThreadPool(1);
executorService.submit(new MyCallable());
  1. 引入提供的插件
    参考下面两篇博客


    image.png
  2. 对于内部类和lambda表达式框架不支持增强的解决方法

2.链路跨进程

image.png

kafka生产、消费是两个进程,以这两个为例说明大概流程
kafka生产者


image.png

kafka消费者


image.png
上一篇下一篇

猜你喜欢

热点阅读