apm-application-toolkit

该服务下的代码都是给对应的客户端应用程序提供的 API 服务。比如上述的apm-toolkit-log4j-2.x 这个服务中定义的相关 Appender,都是需要在对应的客户端的 log.xml 中配置对应的 Appender 使用的。
但是你仔细去看这个 Appender 的具体实现,会发现都是空的定义,并没有具体的实现,那么具体的实现方式是什么?
好吧,实际具体的实现是在 Agent 里面,此处定义空的 API 主要是做 Agent 切面用的。后面看 Agent 的代码时会一目了然了。apm-toolkit-activation

apm-toolkit-activation 服务,俗称激活服务,实际就是对应的 Agent 插件,该 Agent 插件主要就是拦截对应 API 服务中的相关类和方法,然后实现对应的内容发送。
也就是,具体的代码实现,日志发送到那里,这些能力,都是在对应插件的代码中实现的。
换句话说,客户端服务只是引入了apm-application-toolkit这个服务包中的 API 是没有具体含义的,必须要配合 Agent 启动后才会有具体效果。
目的是客户端的包里引用 Jar 时,不需要再弱引用各种 Skywalking 的其他 core 的jar了,只需要使用 Agent 就自动激活该 API 中的能力。
apm-agent-core
使用 OpenTelemetry 零代码修改接收 SkyWalking 追踪数据
Sky 本身是基于Dapper的思想设计的,所以虽然设计思路相同,但对于具体的协议标准,字段定义,和 Opentelmetry 这些的字段定义是完全不同的。
所以才会有各种插件来实现数据格式协议的转换,比如上述的插件添加到对应的 Opentelmetry 的 server 端后,可以实现支持 Sky Agent 上报数据的兼容。
Sky Server 端本身,也支持了对于 OpenTelmetry 协议格式的上报。
TracingContextTest
debug 执行一下这个测试类中testSpanLimit()的方法,就会很明确的知道 Sky 针对全链路中所设计的数据结构。TracingContext 内维护 TraceSegment。
createEntrySpan,createLocalSpan,createExitSpan 三者 Span 使用上的区别。
Span 最初被创建后会存储在 TracingContext 的 LinkList 当中;
stopSpan后会将 span 转移到 TraceSegment 的 spans 属性当中。
表示当前 span 已经结束,tracecontext 则不再维护该 Span,由对应的 TraceSegment 来维护;
每次 stopSpan 转移该 span 到 TraceSegment 中时,会检测该 Segment 是否符合推送标准,符合,则讲 TraceSegment 对象和对象属性中引用的数据全部推送到远端。
关于 EntrySpan 和 LocalSpan 以及 ExitSpan 的区别也可以参考这里