《SkyWalking Java 插件贡献实践》:本文将基于SkyWalking 6.0.0-GA-SNAPSHOT版本,以编写Redis客户端的SkyWalking Java Agent 插件为例,与大家分享我贡献PR的过程,希望对大家了解SkyWalking Java Agent插件有所帮助。
和SkyWalking链路模块几个很重要的语义概念。
Span:可理解为一次方法调用,一个程序块的调用,或一次RPC/数据库访问。只要是一个具有完整时间周期的程序访问,都可以被认为是一个span。SkyWalking对象中的重要属性
属性 | 名称 | 备注 |
---|---|---|
component | 组件 | 插件的组件名称,如:Lettuce,详见:ComponentsDefine.Class。 |
tag | 标签 | k-v结构,关键标签,key详见:Tags.Class。 |
peer | 对端资源 | 用于拓扑图,若DB组件,需记录集群信息。 |
operationName | 操作名称 | 若span=0,operationName将会搜索的下拉列表。 |
layer | 显示 | 在链路页显示,详见SpanLayer.Class。 |
Trace:调用链,通过归属于其的Span来隐性的定义。一条Trace可被认为是一个由多个Span组成的有向无环图(DAG图),在SkyWalking链路模块你可以看到,Trace又由多个归属于其的trace segment组成。
Trace segment:Segment是SkyWalking中的一个概念,它应该包括单个OS进程中每个请求的所有范围,通常是基于语言的单线程。由多个归属于本线程操作的Span组成。
详尽的核心API相关知识,可点击阅读 《 插件开发指南-中文版本 》
@PostMapping("/ping") public String ping(HttpServletRequest request) throws ExecutionException, InterruptedException { RedisClient redisClient = RedisClient.create("redis://" + "127.0.0.1" + ":6379"); StatefulRedisConnection<String, String> connection0 = redisClient.connect(); RedisAsyncCommands<String, String> asyncCommands0 = connection0.async(); AsyncCommand<String, String, String> future = (AsyncCommand<String, String, String>)asyncCommands0.set("key_a", "value_a"); future.onComplete(s -> OkHttpClient.call("http://skywalking.apache.org")); future.get(); connection0.close(); redisClient.shutdown(); return "pong"; } 复制代码
Lettuce对Redis封装与Redisson类似,目的均是实现简单易用,且无学习曲线的Java的Redis客户端。所以要是先对Redis操作的拦截,需要学习对应客户端的源码。
理解插件实现过程,找到最佳InterceptPoint位置是实现插件融入SkyWalking的核心所在。
PR的url: Support lettuce plugin
为了插件得到插件最终的兼容兼容版本,我们需要使用docker对所有插件版本的测试,具体步骤如下:
提交PR的时候,需要简述自己对插件的设计,这样有助于与社区的贡献者讨论完成codereview。
测试用例编写完成后,可以申请自动化测试,在自己的PR中会生成插件兼容版本的报告。
插件文档需要更新: Supported-list.md 相关插件信息的支持。
插件如果为可选插件需要在 agent-optional-plugins 可选插件文档中增加对应的描述。
Lettuce是一个完全无阻塞的Redis客户端,使用netty构建,提供反应,异步和同步数据访问。了解细节可点击阅读lettuce.io;
OpenTracing是一个跨编程语言的标准,了解细节可点击阅读 《 OpenTracing语义标准 》;
span:org.apache.skywalking.apm.agent.core.context.trace.AbstractSpan接口定义了所有Span实现需要完成的方法;
Redisson是一个非常易用Java的Redis客户端, 它没有学习曲线,无需知道任何Redis命令即可开始使用它。了解细节可点击阅读redisson.org;