skywalking-agent 主要流程-9.2
2024-03-30 16:46:41 5 举报
SkyWalking-Agent 是用于分布式系统的开源APM(应用程序性能监控)工具的探针模块。其核心流程如下:1. 获取应用程序性能数据:Agent 通过跟踪应用程序代码、捕获应用程序产生的数据、监控资源使用情况等方式收集性能数据。 2. 解析数据:根据配置,对捕获到的数据进行解析,提取关键性能指标,如CPU使用率、内存使用率、网络延迟等。 3. 发送数据:将解析后的数据通过日志、Metrics等格式发送到SkyWalking OAP 服务器,以便进行后续的分析和展示。 4. 运行状态监控:Agent 还负责监控应用程序的运行状态,如异常、告警等,并及时上报。通过以上流程,SkyWalking-Agent 能够实时、全面地监控和评估应用程序的性能,为开发者提供性能优化和问题定位的依据。
作者其他创作
大纲/内容
.ContextManager#stopSpan()结束 span
StaticMethodsInterceptPoint#getMethodsMatcher获取到Method匹配器
ServiceManager#boot
premain
AgentClassLoader#processLoadedClass在加载类时处理所有 @PluginConfig
ServiceManager#loadAllServices通过 spi 加载所有配置的BootService
InstanceMethodsAroundInterceptor#beforeMethod所有插件都会从这开始
TracingContext#finish
BootstrapInstrumentBoost#prepareJREInstrumentationBootstrapInstrumentBoost#prepareJREInstrumentationV2模版不一样
AbstractClassEnhancePluginDefine#define
通过配置来设置 3 秒对多采样数量agent.sample_n_per_3_secs
AbstractClassEnhancePluginDefine#enhanceClass增强静态类AbstractClassEnhancePluginDefine#enhanceInstance增强构造器,实例方法
AbstractClassEnhancePluginDefine#getStaticMethodsInterceptPoints获取拦截点
创建 span 流程
注册钩子ServiceManager#shutdown在停机时调用所有shutdown方法
通过 bytebuddy 拦截配置的方法,添加拦截器
各种操作
PluginFinder#find通过类名称来找 plugin
BootstrapInstrumentBoost#generateDelegator通过模板类,生成类。但未加载,需要可能需要的类加载完成后才会加载
Config.Agent#KEEP_TRACING通过配置判断是否继续追踪
所有类加载的时候都走一波
AgentPackagePath#findPath找到插件目录
从当前线程里面获取,如果获取不到就创建
ClassEnhancePluginDefine#enhanceClass增强静态类
StaticMethodsInterceptPoint#getMethodsInterceptor获取拦截器名称并添加到byteBuddy
清除ThreadLocal中的上下文
匹配到了方法
SnifferConfigInitializer#overrideConfigBySystemProp通过系统参数覆盖参数
TraceSegmentServiceClient#consume通过 grpc 发送数据到服务端
PluginResourcesResolver#getResources找到所有skywalking-plugin.def
当前是否存在活跃的 Entryspan
GlobalIdGenerator#generate创建traceId
SnifferConfigInitializer#initializeCoreConfig初始化配置
TracingContext#push添加到activeSpanStack中
超出采样率
ContextManager#createEntrySpan
BootstrapInstrumentBoost#loadHighPriorityClass先加载高优先级类,和bytebuddy的类。这些类可能被那些插件使用
找到了就增强
BootstrapInstrumentBoost#inject先处理Bootstrap类型插件
ContextManager#getOrCreate创建一个 Context
InstanceMethodsInterceptPoint定义了一个切点和一个InstanceMethodsAroundInterceptor的名称
判断当前 span 是不是最后的一个
PluginBootstrap#loadPlugins加载所有插件
new TracingContext
AgentBuilder忽略一些基础设施类,比如字节码,log,toolkit等
ContextManagerExtendService#createTraceContext创建 context
AgentClassLoader#initDefaultLoader设置默认类加载器为AgentClassLoader
SnifferConfigInitialize#loadConfig
反射创建插件实例
TracingContext#isLimitMechanismWorking判断是否超出阈值
NoopSpan一个啥也没有的span
SamplingService#trySampling检查是否超过采样数量
如果有
SkyWalkingAgent#installClassTransformer
Javaagent
AbstractClassEnhancePluginDefine#define类加强的核心方法
SnifferConfigInitializer#overrideConfigByAgentOptions通过 jvm 参数覆盖
拦截器的实现有很多个,主要区别在于入参和调用 bytebuddy 的细节上,逻辑一样
SkyWalkingAgent
SkyWalkingAgent.Transformer#Transformer添加转换器
traceId 规则 UUID 去-线程 id时间戳+序列号
SnifferConfigInitializer#initializeConfig那所有配置信息保存到 Config 中
插件增强流程
AbstractTracingSpan#finish
所有数据收集分析以及服务端通信
加载前面找到的插件
AbstractSpan#start()
把当前上下文保存到ThreadLocal中
TraceSegment#archive把 span 添加到 Segment 中
TraceSegmentServiceClient#afterFinished把数据放入到缓冲区中
依次调用所有BootService的prepare();boot();onComplete();
把所有数据设置到各种 config 中
当判断为不需要采集是就返回一个IgnoredTracerContext
存在
插件名称=插件类
TraceSegment
没有活跃 span
一个三种拦截点ConstructorInterceptPointInstanceMethodsInterceptPointInstanceMethodsInterceptV2PointStaticMethodsInterceptPointStaticMethodsInterceptV2PointV2版本把返回值包装到了MethodInvocationContext里面可以在三个方法里面进行传递
判断 grpc 状态如果是DISCONNECT
PluginCfg#load对读取到的数据包装成 PluginDefine
覆盖名称
默认找相对位置/config/agent.config
AbstractClassEnhancePluginDefine#enhance
PluginFinder创建
AbstractClassEnhancePluginDefine#enhance增强类
PropertyPlaceholderHelper#replacePlaceholders替换占位符
TracingContext#createLocalSpan
插件实现的方法都在这里调用,实际上就是在实际方法执行前后,和异常时调用方法简单来说就是一个 aop
0 条评论
回复 删除
下一页