skywalking-agent 主要流程
2022-03-04 14:54:10 38 举报
SkyWalking Agent 是 SkyWalking 的探针,用于收集应用的性能数据。它主要流程如下: 1. 启动时,Agent 会加载配置文件,包括采集器、后端服务地址等。 2. Agent 会注册 JMX、HTTP、GRPC、MySQL 等协议的拦截器,用于拦截网络请求和响应。 3. 当应用发起网络请求时,拦截器会捕获请求信息,如请求方法、URL、参数、响应时间等。 4. 拦截器将捕获到的信息封装成 Span,并发送到后端服务进行分析和存储。 5. Agent 还会定期向后端服务发送心跳包,以保持连接。 6. 当应用关闭时,Agent 会停止运行。
作者其他创作
大纲/内容
.ContextManager#stopSpan()结束 span
ServiceManager#boot
premain
AgentClassLoader#processLoadedClass在加载类时处理所有 @PluginConfig
ServiceManager#loadAllServices通过 spi 加载所有配置的BootService
TracingContext#finish
通过配置来设置 3 秒对多采样数量agent.sample_n_per_3_secs
enhanceInstance
创建 span 流程
注册钩子ServiceManager#shutdown在停机时调用所有shutdown方法
通过 bytebuddy 拦截配置的方法,添加拦截器
各种操作
BootstrapInstrumentBoost#generateDelegator通过模板类,生成类。但未加载,需要可能需要的类加载完成后才会加载
Config.Agent#KEEP_TRACING通过配置判断当服务端不可用是是否继续追踪
清除ThreadLocal中的上下文
overrideConfigBySystemProp通过系统参数覆盖参数
TraceSegmentServiceClient#consume通过 grpc 发送数据到服务端
PluginResourcesResolver#getResources找到所有skywalking-plugin.def
当前是否存在活跃的 Entryspan
GlobalIdGenerator#generate创建traceId
.SnifferConfigInitializer#initializeCoreConfig初始化配置
TracingContext#push添加到activeSpanStack中
超出采样率
ContextManager#createEntrySpan
先加载高优先级类,和bytebuddy的类。这些类可能被那些插件使用
BootstrapInstrumentBoost#inject先处理Bootstrap类型插件
ContextManager#getOrCreate
判断当前 span 是不是最后的一个
PluginBootstrap#loadPlugins加载所有插件
new TracingContext
ContextManagerExtendService#createTraceContext创建 context
AgentClassLoader#initDefaultLoader设置默认类加载器
SnifferConfigInitializer#loadConfig
反射创建插件实例
TracingContext#isLimitMechanismWorking判断是否超出阈值
NoopSpan一个啥也没有的span
SamplingService#trySampling检查是否超过采样数量
如果有
Javaagent
AbstractClassEnhancePluginDefine#define类加强的核心方法
overrideConfigByAgentOptions通过 jvm 参数覆盖
拦截器的实现有很多个,主要区别在于入参和调用 bytebuddy 的细节上,逻辑一样
SkyWalkingAgent
SkyWalkingAgent.Transformer#Transformer添加转换器
traceId 规则 UUID 去-线程 id时间戳+序列号
initializeConfig那所有配置信息保存到 Config 中
AbstractTracingSpan#finish
所有数据收集分析以及服务端通信
加载前面找到的插件
AbstractSpan#start()
把当前上下文保存到ThreadLocal中
TraceSegment#archive把 span 添加到 Segment 中
TraceSegmentServiceClient#afterFinished把数据放入到缓冲区中
依次调用所有BootService的prepare();boot();onComplete();
把所有数据设置到各种 config 中
存在
没有活跃 span
PluginCfg#load对读取到的数据包装成 PluginDefine
InstMethodsInter#intercept
覆盖名称
默认找相对位置/config/agent.config
PluginFinder创建
AbstractClassEnhancePluginDefine#enhance增强类
PropertyPlaceholderHelper#replacePlaceholders替换占位符
TracingContext#createLocalSpan
enhanceClass
插件实现的方法都在这里调用,实际上就是在实际方法执行前后,和异常时调用方法简单来说就是一个 aop
0 条评论
下一页