skywalking源码--探针插件开发

本源码来自于skywalking-agent 8.9.0版本
本节主要讲解skywalking-agent的轻量级队列内核,该实现在datacarrier模块主要用于进行数据发送OAP服务端的实现,主要采用缓存批量异步发送的方式进行发送。
注:本篇文章主要是作为自己看书后的总结,内容有可能会存在一些个人理解上的偏差,如果有网友找出问题欢迎提出,感谢!!!如果我理解上的错误误导了您,在此表示抱歉!!!

文章目录

    • Span
    • Trace Segment
    • ContextCarrier
    • ContextSnapshot
    • ContextManager

本篇主要介绍一些skywalking-agent中的基本概念,主要包括 Span、Trace Segment、ContextCarrier、ContextSnapshot、ContextManager。其中Span、Trace Segment是trace数据存储的核心;ContextCarrier、ContextSnapshot是trace数据在进程间、线程间传递的核心;ContextManager提供了对 Trace Segment、ContextCarrier、ContextSnapshot的相关操作。掌握这些类的功能、作用有利于在工作中对skywalking进行二次开发、扩展。

Span

这是分布式追踪系统中一个非常重要的概念,是trace数据的最小粒度、基本单元,可以理解为一次方法的调用、一个程序块的调用、数据库访问。用于记录调用的发生时间、结束时间、调用深度(当深度为0时trace上下文可以回收)、调用日志(发生异常时可以记录日志)、操作名、span类型等。

在skywalking中对span粗略分为:LocalSpan和RemoteSpan。

LocalSpan是一次本地的调用或者记录跨线程后的执行情况,与跨进程无关。

RemoteSpan是一次远程调用,可细分为:EntrySpan、ExitSpan。

EntrySpan:代表一个应用服务的提供端或者服务端的入口端,如接口入口、MQ消费端入口。在涉及到跨进程、跨线程时会和 ContextCarrier、ContextSnapshot 配合使用。

ExitSpan:代表一个应用服务的客户端或者消息队列的生产者,如 接口请求响应、MQ生产端请求响应。在涉及到跨进程、跨线程时会和 ContextCarrier、ContextSnapshot 配合使用。

Trace Segment

这是skywalking中特有的概念。指的是 一个请求在一个进程中的所有span的集合,这些span具有相同的segmentId。为什么skywalking中会有这么一个特殊的概念?这是因为为了把span按照请求+进程进行分解这样有利于OAP进行数据的聚合、分析。
在Trace Segment中会记录一些相关信息,如下:
TraceSegmentId:当前Trace Segment的唯一ID(TraceSegmentId)。

Refs:指向上一个Trace Segment的TraceSegmentId引用,通常情况下Refs是一个值,但是如果当前Trace Segment是批量MQ消费,那么 Refs就是多个TraceSegmentId。

Spans:用于存储从属于这个Trace Segment的所有span集合。

relatedGlobalTraceId:指向上一个Trace Segment的traceId引用,通常情况下relatedGlobalTraceId是一个值,但是如果当前Trace Segment是批量MQ消费,那么 relatedGlobalTraceId就是多个TraceId。

ignore:当前Trace Segment是否可以忽略,为true则可以不上传到OAP

isSizeLimited:当前Trace Segment的span集合的数量是否已经达到限制。默认false,未达到限制。

createTime:当前Trace Segment的创建时间。

ContextCarrier

该类主要用于处理skywalking在跨进程间的数据传递。如:客户端A调用服务端B,那么会进行如下的步骤:
1、客户端A调用前先创建 ContextCarrier
2、通过 ContextManager#inject将当前需要传递的数据放入 新的 ContextCarrier 进行后续传递
3、使用 ContextCarrier#items将步骤1的ContextCarrier内部的数据放入 CarrierItemHead,用于后续在 HTTP HEAD、Dubbo attachments 、MQ的HEAD 中进行传递
4、服务端B接收到请求后提取信息存入自己创建的 ContextCarrier 中
5、通过 ContextManager#createEntrySpan将ContextCarrier中的信息进行使用并做关联

ContextSnapshot

该类主要用于处理skywalking在跨线程间的数据传递。如:主线程调用中执行了子线程逻辑,那么会发生如下的步骤:
1、调用子线程前会先执行 ContextManager#capture用来创建一个ContextSnapshot
2、子线程执行前会执行 ContextManager#continued 将父线程给的 ContextSnapshot 传入自己的 TraceSegmentRef 中。

ContextManager

ContextManager见名见意,该类用于管理上下文。下面直接以它内部的方法进行介绍。
getOrCreate:用于获取或者创建一个上下文,是个私有方法,不能被外部调用。在 createEntrySpan、createLocalSpan、createExitSpan中会使用来获取当前的上下文。
get:用于获取当前上下文,是个私有方法,不能被外部调用,在getOrCreate方法中会调用来获取当前上下文,如果获取不到那么就会创建新的上下文。
getGlobalTraceId:获取当前上下文的traceId,是个public修饰的方法,可以被外部调用来获取当前traceId。如果当前是IgnoredTracerContext上下文,那么没有真是的traceId,返回的是“N/A”。
createEntrySpan:创建一个进入的span。
createLocalSpan:创建一个local的span。
createExitSpan:创建一个退出的span。
inject:在跨进程前调用。
extract:在跨进程后调用。
capture:在跨线程前调用。
continued:在跨线程的子线程内调用。
awaitFinishAsync:等待子线程结束的回调。
activeSpan:获取当前存活的span。
stopSpan:关闭span。
isActive:判断当前上下文是否存在。因为span深度为0后上下文会被回收。
getRuntimeContext:获取正在运行的上下文
getCorrelationContext:获取跨进程传递的数据。

你可能感兴趣的:(skywalking,skywalking,skywalking探针开发)