如何编写一个SkyWalking 插件

skywalking-agent自定义插件 SkyWalking 插件的工作机制主要基于 Java Agent,它会在应用启动时自动附加到目标应用上。插件主要实现方法拦截(Method Intercept),即在指定的方法执行之前、之后或者发生异常时进行操作,以便收集监控数据。增强类定义(Enhancement Class):指定需要增强的目标类。方法拦截器(Method Interceptor):定义拦截的逻辑,比如调用链的开始、结束、异常捕获等。 阅读详情

概述

之前几篇文章,我们着重介绍了在对SkyWalking进行二次开发之前的环境搭建问题,因此本篇文章将基于SkyWalking-8.1.0版本,以开发webflux-webclent插件为例,分享一下对SkyWalking插件开发以及贡献PR的过程(PR地址),以其能为大家了解SkyWalking java agent插件的开发有所帮助。

概念

span

Span应该是分布式链路追踪系统一个非常重要而且常见的一个概念。最早源自于Google Dapper 的论文--Dapper, a Large-Scale Distributed Systems Tracing Infrastructure,此处给出论文地址,感兴趣的小伙伴可以深入学习。简单来说,Span可以简单理解成一次服务的调用。只要是一个具有完整时间周期的程序访问,都可以简单看做是一个span。

当然SkyWalking中的span与论文中的span类似,但同时也进行了一些扩展,具体来说,在SkyWalking中span分成以下三种:

  1. EntrySapn:代表服务提供者,也就是服务器的端点。我们可以简单理解成服务的提供方,比如对外提供服务的Webflux服务或者MQ的消费则都是EntrySpan。
  2. ExitSpan:代表服务的消费者,比如一个服务的客户端或者消息队列的生产者都可以理解成一个ExitSpan。
  3. LocalSpan:与前边的EntrySpan和ExitSpan相比,LocalSpan的概念就比较特殊了,它其实本身与远程服务调用没有任何关系,它更多的可能指代的的本地的java方法。它的出现可能是为了解决SkyWalking监控本地方法调用的问题。比如说,我们想知道某个本地方法的调用请求,我们便可以将该方法定义成一个LocalSpan,然后OAP端便可以收集到对应的span信息,然后在web端清晰的展示该方法的调用情况。

上下文载体(ContextCarrier)

因为分布式追踪,大部分情况下都是跨进程的,因此为了解决跨进程的链路绑定问题,SkyWalking引入了ContextCarrier的概念。

以下是有关如何在 A -> B 分布式调用中使用 ContextCarrier 的步骤.

  1. 在客户端, 创建一个新的空的 ContextCarrier.
  2. 通过 ContextManager#createExitSpan 创建一个 ExitSpan 或者使用 ContextManager#inject 来初始化 ContextCarrier.
  3. 将 ContextCarrier 所有信息放到请求头 (如 HTTP HEAD), 附件(如 Dubbo RPC 框架), 或者消息 (如 Kafka) 中
  4. 通过服务调用, 将 ContextCarrier 传递到服务端.在服务端, 在对应组件的头部, 附件或消息中获取 ContextCarrier 所有内容.
  5. 通过 ContestManager#createEntrySpan 创建 EntrySpan 或者使用 ContextManager#extract 来绑定服务端和客户端.

异步API

因为官方关于插件具体的开发是给了比较详细的开发文档的(戳这里)👈,因此我在此时针对API部分就不详细来说了,我会重点介绍几个自己在开发webflux webclient的过程中用到的异步API。

因为此次是对webflux WebClient来开发插件,许多方法的调用都需要时跨线程的因此,我们需要使用异步API。

简单来说异步API的使用步骤如下:

  1. 在原始上下文中调用AsyncSpan#PrepareForAsync;
  2. 将该Span传递到其他线程,并江湾城相关属性比如tag、log、status code等属性进行设置;
  3. 全部操作就绪之后,可在任意线程中调用#asyncFinish结束调用
  4. 当所有的#prepareForAsync完成之后,追踪上下文就会结束,并一起被会传到后端服务(根据API的执行次数来进行判断)。

插件编写

确定拦截点

插件本身的开发肯定有一定的业务的逻辑,因此我们在开发之前需要根据插件的业务逻辑的确定合适的插入点位置。以webflux-webclient-plugin为例,因为该插件本质上是为了获取webclient在发起请求时的调用信息,因此在确定插入点之前我们首先要分析,它整个的调用过程是怎么的。

因此我对WebClient从发起请求到获得相应整个过程进行了分析,画出了如下的:

webClient

分析整个过程,我发现,无论WebClient调用的是retrieve()方法还是调用的exchange()方法,最终在发起请求的时候都是通过org.springframework.web.reactive.function.client.ExchangeFunctions$DefaultExchangeFunction的exchange()方法实际执行异步请求,并且返回一个Mono<ClientResponse>类型的响应结果。

因此我们考虑使用DefalutExchangeFunction#exchange()方法作为插入点方法,但仅仅使用这一个插入点是否是足够的哪?

这里我们先留下一个小小的悬念,在业务代码开发部分,我会详细讲解自己在开发过程中所遇到的坑!!

拦截与业务代码开发

在插入点进行确定之后,我们便可以结合业务逻辑开始代码部分的开发。

定义拦截点

前边我们已经确定出了具体的拦截点,下边我们需要在插件目录中定义出该拦截点。

在创建的插件目录的Resourse目录,定义一个skywalking-plugin.def文件,添加插件定义:

spring-webflux-5.x-webclient=org.apache.skywalking.apm.plugin.spring.webflux.v5.webclient.define.BodyInserterRequestInstrumentation

在define目录下创建Instrumentation类,以webflux-webclient插件为例,我创建了一个WebFluxWebClientInterceptor类,用来指定拦截点的具体方法。

具体代码如下所示:

public class WebFluxWebClientInstrumentation extends ClassEnhancePluginDefine {
    private static final String ENHANCE_CLASS = "org.springframework.web.reactive.function.client.ExchangeFunctions$DefaultExchangeFunction";
    private static final String INTERCEPT_CLASS = "org.apache.skywalking.apm.plugin.spring.webflux.v5.webclient.WebFluxWebClientInterceptor";

    @Override
    protected ClassMatch enhanceClass() {
        return NameMatch.byName(ENHANCE_CLASS);
    }

    @Override
    public ConstructorInterceptPoint[] getConstructorsInterceptPoints() {
        return new ConstructorInterceptPoint[0];
    }

    @Override
    public InstanceMethodsInterceptPoint[] getInstanceMethodsInterceptPoints() {
        return new InstanceMethodsInterceptPoint[]{
                new InstanceMethodsInterceptPoint() {
                    @Override
                    public ElementMatcher<MethodDescription> getMethodsMatcher() {
                        return named("exchange");
                    }

                    @Override
                    public String getMethodsInterceptor() {
                        return INTERCEPT_CLASS;
                    }

                    @Override
                    public boolean isOverrideArgs() {
                        return false;
                    }
                }
        };
    }

    @Override
    public StaticMethodsInterceptPoint[] getStaticMethodsInterceptPoints() {
        return new StaticMethodsInterceptPoint[0];
    }

实现对应的Interceptor类

有了插入点之后,我们还需要通过一个类来对插入点方法做具体增强的工作,因此我们定义了一个WebFluxWebClientInstrumentation类用来做具体的方法增强工作。

具体来说,在该类中做了如下操作:

  1. 获取请求参数,收集链路信息
  2. 创建ContextCarrier,为进程的数据管理做准备。
  3. 创建ExitSpan
  4. 设置span相关信息,比如请求方法的类型、访问的url等内容
  5. 将ContextCarrier对象进行动态传递,传递给第二个插入点增强类
  6. 将当前span进行传递,便于后续对响应信息进行判断和设置

具体代码如下(org.apache.skywalking.apm.plugin.spring.webflux.v5.webclient包下WebFluxWebClientInterceptor类)。

同时,我在后续调试的过程中发现,只定义一个拦截点是不够的,因为request只有在初始化的过程中才能被操作,也就是是说,在该位置违法将span的相关信息放置到request的头文件中,进行跨链传输。

因此我在org.springframework.http.client.reactive.ClientHttpRequest的构造方法处也设置了一个拦截点,负责讲span信息放置到request中进行跨链传输。

具体实现如下所示:

public void beforeMethod(EnhancedInstance objInst, Method method, Object[] allArguments, Class<?>[] argumentsTypes,
                             MethodInterceptResult result) throws Throwable {
        ClientHttpRequest clientHttpRequest = (ClientHttpRequest) allArguments[0];
        ContextCarrier contextCarrier = (ContextCarrier) objInst.getSkyWalkingDynamicField();
        CarrierItem next = contextCarrier.items();
        while (next.hasNext()) {
            next = next.next();
            clientHttpRequest.getHeaders().set(next.getHeadKey(), next.getHeadValue());

编写测试用例

在插件编写完成之后,我们还需要编写一个测试用例用来做CI测试。插件开发的详细文档可以参考​戳一下👈

此处我就简单说一下用例的编写流程。

用例工程是一个独立的Maven工程。该工程能将工程打包镜像, 并要求提供一个外部能够访问的Web服务用例测试调用链追踪。

用例工程的目录图如下所示:

[plugin_testcase]
  |__ [config]
  | |__ docker-compse.yml
  | |__ expectedData.yaml
  |__ [src]
  | |__ [main]
  | |    ...
  | |__ [resources]
  | |    ...
  |__ pom.xml
  |__ testcase.yml

[] = directory

文件用途说明

以下是用例工程中配置文件的说明:

文件用途
docker-compose.xml定义用例的docker运行容器环境
expectedData.yaml定义用例期望生成的Segment的数据
testcase.yml定义用例的基本信息,如: 被测试框架名称、版本号

测试用例编写流程

  1. 编写用例代码
  2. 打包并测试用例镜像,确保在没有加载探针时的用例镜像能够正常运行
  3. 编写期望数据文件
  4. 编写用例配置文件
  5. 测试用例

Pull Request

提交前的检查

  1. 在正式提交以前一定要保证集成测试在本地通过
  2. 更新插件文档
    • 插件文档需要更新:Supported-list.md相关插件信息的支持。
    • 插件如果为可选插件需要在agent-optional-plugins可选插件文档中增加对应的描述。

提交PR

在提交PR时,一定要简要描述个人对插件的设计思路,这样有助于社区贡献者讨论完成codereview。

申请自动化测试

测试用例编写完成后,可以申请自动化测试,了解插件的兼容性等问题

image-20200926215025261

在自动化测试完成之后,会有社区成员进行代码审查,审查通过后,不出意外最终会被合并到主分支上。

自己在开发过程中遇到的问题

  1. 在搭建开发环境,完成项目的导入工作之后,maven总报错。

    解决方法:增加了国内的多个maven源之后该问题被解决

  2. 在确定插入点exchange()方法之后,在调试过程中无法被拦截。

    解决方法:由于选择的增强类属于内部类,因此在DefaultExchangeFunction,因此在选择该类作为内部类的时候应该使用#进行连接,而不是通过.。即应该写成org.springframework.web.reactive.function.client.ExchangeFunctions$DefaultExchangeFunction的形式。

  3. 在插件基本功能编写完成后,OAP端却无法收集到链路信息。

    解决方法:使用最新的OAP收集端程序来进行接收。之前一直使用的本地直接编译的OAP端,发现不能工作,使用编译好的OAP端代码版本过低时也不能使用。

  4. 同一服务的两个span不能够串联。

    原因分析:经过分析出现该问题的原因主要是关闭span的时机不对。由于使用的是异步接口,因此在关闭span的时候必须在doFinally()方法体内进行关闭。防治span提前关闭,从而出现同一服务的span不能串联的情况发成

    解决方法:修改span的关闭时机,在doFinally()方法体中执行span.asyncFinish()方法

  5. 在本地跑集成测试时,遇到无法启动docker的问题。

    原因分析:根据保存内容发现是测试脚本在启动docker的过程中出现权限不足的问题,可能是docker的使用需要用的root的权限。

    解决方法:将当前用户增加到docker的用户组中,从而使得当前的用户具有操作docker的权限。

  6. 在集成测试阶段出现SegementNotFoundException问题

    原因分析:该问题的出现主要是在对Segment进行验证的过程中,发现Segement丢失的情况发生

    解决方法:该问题在经过深入分析之后发现,实际上就是因为在编写插件的时候,插入点选择不充分导致的。exchange()这个插入点可以用来收集信息,但却无法用来进行链路信息绑定。因此后续重新设计了插件的插入点,增加了第二个插入点,并且在第二个插入点位置进行链路的绑定,至此问题解决。

rabbitmq整合skywalking并编写自定义插件增强 rabbitmq整合skywalking 首先先下载准备好skywalking 的服务端和ui控制台,java-agent https://skywalking.apache.org/downloads/ 整合skywalking 我的流程是在生产者和消费者服务中去引入一个mq的sdk,具体SDK的内容可以查看这篇文章 在sdk的pom文件中引入了skywalking依赖 <!-- skywalking --> <dependency> <groupId>or 阅读详情

相关推荐

skywalking 插件源码分析

skywalking 插件源码分析一、总览1.1 启动1.2 写一个插件1.2.1 定义拦截规则1.2.2 配置插件定义1.2.3 实现一个拦截器1.2.4 一个现成的插件二. 源码分析2.1 源码位置2.2 启动流程2.1.1 启动&处理启动参数2.1.2 加载插件1. 获取 SystemClassloader2. 设置路径集合:3. 搜索插件jar包中"skywalking-plugin.def"4. 加载skywalking-plugin.def内容5. * Instrumet类简介6.* 切

wanxiaoderen的博客 3937

skywalking源码--探针插件开发

skywalking探针开发 skywalking-agent核心类

SO_zxn的博客 2960

什么是OAuth 2.0?

OAuth2.0是一种授权协议而非登录协议,核心思想是通过令牌(Token)而非密码实现安全授权。它涉及三个关键角色:用户、第三方应用和身份提供商(IdP)。最常用的授权码流程(AuthorizationCode Flow)通过浏览器三方对话,确保用户密码只提供给IdP而非第三方应用。OAuth2.0提供四种授权方式,其中授权码和客户端凭证是当前主流,而隐式和密码模式已不推荐。需要注意的是,OAuth2.0解决的是授权问题,身份认证需通过OpenID Connect实现。该协议通过临时令牌机制,实现了&qu

sonadorje的专栏 1162

skywalking plugin 开发初探 ONS plugin 实践

skywalking plugin 开发如此简单,有兴趣的了解看看 针对阿里云ONS mq的实践

汪小哥 4093

ArcGIS属性表汉字转拼音

接着我安装了一个编辑器“PyCharm Community Edition 2019.3.3\bin\pycharm64.exe”,在里面添加“pypinyin”包,然后将其设置为arcgis的编辑器和调试程序,还是失败;我在10.6的机器上折腾了上面几步,直到两周后脚本突然运行成功,我也不确定是哪一步导致pypinyin包配置成功,因此将心得体会写出来,如果过一段时间,打开10.2的机器运行脚本成功了,再写后续.......,按照“配置方法1:”进行尝试,显示配置失败。

2301_77413856的博客 1295

LT9611EX芯片实战:如何用双端口MIPI转HDMI1.4打造高清播放器(附配置代码)

本文详细介绍了如何使用龙迅半导体的LT9611EX芯片实现双端口MIPI转HDMI1.4的高清播放器开发。内容涵盖芯片特性、硬件设计要点、寄存器配置技巧及完整代码实现,特别适合嵌入式视频处理应用,如机顶盒和便携式媒体播放器。

weixin_29256771的博客 322

全链路跟踪——skywalking自定义插件开发(五)

支持定义构造方法和实例方法的拦截点。:支持定义静态方法的拦截点。当然还可以直接扩展,这个类是上面两个类的父类。这种方式较为麻烦,一般不推荐使用。这里以拦截实例方法为例,继承类。:实例方法拦截器:静态方法拦截器:构造方法拦截器要拦截对应的方法,必须要实现对应的接口。这里以实现接口,拦截实例方法为例。在自定义插件模块的resources目录下定义配置文件,该文件用于帮助探针启动时加载插件时,寻找插件拦截点。

qq_34434565的博客 2192

原理和代码解读:用Diffusion Models高清图像修复(Image Inpainting)

在最近的Diffusion Models应用中,Image Inpainting+ControlNet/Lora等工作在模特衣服生成、家居场景重建等场景中得到了广泛的应用。这篇博客主要介绍Diffusion Models如何在修复高清图像的。

沉迷单车的追风少年 2497

Skywalking插件开发Java agent

Java agent是java命令的一个参数。参数javaagent可以用于指定一个jar包

weixin_42467874的博客 1378

通过Power Platform自定义D365 CE 业务需求 - 4. 使用Power Automate

Power Automate构建块Power Automate中的连接器流的类型和用途流中的动态值和表达式使用变量、循环和条件在Power Automate中处理审批业务场景、用例和实现Power Virtual Agent的概念Power Virtual Agent的构建块配置Power Virtual Agent示例在公共网站/门户中部署Power Virtual Agent业务场景、用例和实现。

Martin-Mei的博客 561

Python爬虫教程:抓取地方政府网站的公开文件与政策信息

Web爬虫是指一种自动化脚本,用于模拟人类浏览器访问网页、提取网页内容的数据抓取工具。发送请求到目标网页;获取网页内容;解析网页内容,提取所需数据;将数据保存或进一步处理。爬虫可以抓取各种形式的数据,如文本、图片、文件等。本教程将重点展示如何抓取地方政府网站上公开的政策文件、公告等信息。许多政府网站都会采取一定的反爬虫措施,防止大量数据被爬取。IP封锁:如果短时间内大量请求来自同一IP,可能会被封锁。验证码:一些网站会使用验证码来验证访问者是否为机器人。动态加载。

2201_76125261的博客 1981

如何编写一个 SkyWalking 插件

点击上方“开源社”关注我们| 作者:vcjmhg|编辑:李明康|责编:袁睿斌| 设计:叶修缘丶1概述 之前几篇文章,我们着重介绍了在对 SkyWalking 进行二次开发之前的环境...

开源社KAIYUANSHE的博客 1308

医疗数据采集:Python爬虫爬取医学文献与药品信息(2026合规与伦理版)

医疗数据采集不同于爬取新闻或房价,它直接关系到人的生命健康和法律底线。技术层面:优先使用官方 API (PubMed E-utilities, BioThings),避免解析复杂HTML。法律层面:严守“不碰隐私、不破付费、不传谣言”三条红线。伦理层面:保持对生命的敬畏,确保数据的准确性和用途的正当性。在2026年,一个优秀的医疗数据工程师,不是那个能爬取最多数据的人,而是那个能在合规框架下,利用公开数据解决真实医疗问题的人。请务必珍视您的职业生涯和法律责任,切勿以身试法。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 286

如何编写一个抢购bot_如何编写一个SkyWalking插件

概述之前几篇文章,我们着重介绍了在对SkyWalking进行二次开发之前的环境搭建问题,因此本篇文章将基于SkyWalking-8.1.0版本,以开发webflux-webclent插件为例,分享一下对SkyWalking插件开发以及贡献PR的过程(PR地址),以其能为大家了解SkyWalking java agent插件的开发有所帮助。概念spanSpan应该是分布式链路追踪系统一个非常重要而且...

weixin_39732534的博客 1139

三相五柱式消弧线圈自动测控装置设计与实现

本文设计了一种基于STM32的三相五柱式消弧线圈自动测控装置。该装置采用信号注入法检测系统对地电容电流,通过PID自适应算法调节消弧线圈电感值,实现单相接地故障时的快速补偿。硬件系统包含信号采集、注入、控制执行等模块,软件采用Goertzel算法提取特征频率信号,结合增量式PID实现精确控制。实验结果表明,装置电容检测误差小于2%,调谐响应时间小于50ms,满足配电网对消弧线圈自动调谐的技术要求。

AI的内部世界的博客 239

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

如何用vbs编写一个游戏_如何编写一个 SkyWalking 插件

| 作者:vcjmhg| 编辑:黄欣宜| 设计:叶修缘丶1概述 之前几篇文章,我们着重介绍了在对 SkyWalking 进行二次开发之前的环境搭建问题,因此本篇文章将基于 SkyWalking-8.1.0 版本,以开发 webflux-webclent 插件为例,分享一下对 SkyWalking 插件开发以及贡献 PR 的过程(PR 地址),以期能为大家了解 SkyWalking java age...

weixin_39846378的博客 632

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Skywalking如何通过修改字节码让插件生效

文章目录ByteBuddy入门自定义Skywalking插件1、引入依赖编写插件定义编写拦截器使用的哪种字节码操作框架如何修改字节码总结 背景:大家都在说Skywalking Agent实现的核心原理就是Java Agent+字节码操作。但是这两者是如何起作用的,一直比较模糊,所以通过这篇博客来记录一下解疑答惑的过程。 通过这篇博客应该可以解答如下几个问题: Skywalking具体使用什么来操作字节码; Skywalking的插件是怎么开发的; Skywalking是怎么让插件生效的; ByteB

徐小陌的博客 1802

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

手把手教你编写Skywalking插件

前置知识 在正式进入编写环节之前,建议先花一点时间了解下javaagent(这是JDK 5引入的一个玩意儿,最好了解下其工作原理);另外,Skywalking用到了byte-buddy(一个动态操作二进制码的库),所以最好也熟悉下。 当然不了解关系也不大,一般不影响你玩转Skywalking。 javaagent byte-buddy 1.9.6 简述及原理1 术语 Span:可理解为一次方法调用,一个程序块的调用,或一次RPC/数据库访问。只要是一个具有完整时间周期的程序访问,都可以被认为是一个spa

简单随风的博客 3151

Skywalking系列博客6-手把手教你编写 Skywalking 插件

点击上方IT牧场,选择置顶或者星标技术干货每日送达!前置知识在正式进入编写环节之前,建议先花一点时间了解下javaagent(这是JDK 5引入的一个玩意儿,最好了解下其工作原理)...

ITMuch的专栏 1415

Skywalking系列博客6-手把手教你编写Skywalking插件

前置知识 在正式进入编写环节之前,建议先花一点时间了解下javaagent(这是JDK 5引入的一个玩意儿,最好了解下其工作原理);另外,Skywalking用到了byte-buddy(一个动态操作二进制码的库),所以最好也熟悉下。 当然不了解关系也不大,一般不影响你玩转Skywalking。 javaagent byte-buddy 1.9.6 简述及原理1 术语 Span:可理解为一次方法调用,一个程序块的调用,或一次RPC/数据库访问。只要是一个具有完整时间周期的程序访问,都可以被认为是一个spa

ITMuch的专栏 1070

skywalking原理_Skywalking系列博客6手把手教你编写 Skywalking 插件

点击上方IT牧场,选择置顶或者星标技术干货每日送达!前置知识在正式进入编写环节之前,建议先花一点时间了解下javaagent(这是JDK 5引入的一个玩意儿,最好了解下其工作原理);另外,Skywalking用到了byte-buddy(一个动态操作二进制码的库),所以最好也熟悉下。当然不了解关系也不大,一般不影响你玩转Skywalking。•javaagent[1]•byte-bu...

weixin_39658900的博客 321

SkyWalking Java 插件贡献实践

引言 《SkyWalking Java 插件贡献实践》:本文将基于SkyWalking 6.0.0-GA-SNAPSHOT版本,以编写Redis客户端Lettuce的SkyWalking Java Agent 插件为例,与大家分享我贡献PR的过程,希望对大家了解SkyWalking Java Agent插件有所帮助。 基础概念 OpenTracing和SkyWalking链路模块几个很重要的语义概...

weixin_34262482的博客 2379

skywalking指南—agent日志采集和插件

skywalking指南—agent日志采集和插件 延续前两篇,完成skywalking的日志采集,并对插件版本及获取提供帮助

hxy793518971的博客 1万+

skywalking原理_Skywalking系列博客6-手把手教你编写Skywalking插件

前置知识 在正式进入编写环节之前,建议先花一点时间了解下javaagent(这是JDK 5引入的一个玩意儿,最好了解下其工作原理);另外,Skywalking用到了byte-buddy(一个动态操作二进制码的库),所以最好也熟悉下。 当然不了解关系也不大,一般不影响你玩转Skywalking。 javaagent byte-buddy 1.9.6 简述及原理1 术语 Span:可理解为一次方法调...

weixin_39775976的博客 227
上一篇: 解决fcitx输入法在Intellij IDEA开发工具中输入法候选框无法跟随光标移动的问题
下一篇: 链表问题一些常用的套路与方法
vcjmhg
博客等级 码龄11年 27粉丝 94原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值