Agent 插件与无侵入插桩
This content is not available in your language yet.
先给答案:主要失效边界集中在“类匹配过宽、类加载器冲突、重入调用”这些场景
Section titled “先给答案:主要失效边界集中在“类匹配过宽、类加载器冲突、重入调用”这些场景”主要失效边界集中在“类匹配过宽、类加载器冲突、重入调用”这些场景。它们破坏的是容量、顺序、并发或生命周期前提;排查时应先确认状态是否仍由正确对象持有,再核对推进条件和清理路径。 理解Agent 插件与无侵入插桩时,要先确认入口与状态归属,再跟踪控制流或数据流的推进顺序,最后落到对外可观察的结果。
主要失效边界集中在“类匹配过宽、类加载器冲突、重入调用”这些场景。它们破坏的是容量、顺序、并发或生命周期前提;排查时应先确认状态是否仍由正确对象持有,再核对推进条件和清理路径。
主要失效边界集中在“类匹配过宽、类加载器冲突、重入调用”这些场景。它们破坏的是容量、顺序、并发或生命周期前提;排查时应先确认状态是否仍由正确对象持有,再核对推进条件和清理路径。
SkyWalking 用插件描述“匹配哪些类、增强哪些方法、插入什么拦截器”,业务代码不需要显式调用 SDK。
plugin definition -> class matcher -> type/method matcher -> interceptor -> enhanced class -> ContextManager#createEntrySpan关键坐标:
ClassEnhancePluginDefine#define—apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/plugin/define/ClassEnhancePluginDefine.java:38ClassEnhancePluginDefine#enhanceClass—apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/plugin/define/ClassEnhancePluginDefine.java:61ClassEnhancePluginDefine#enhance—apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/plugin/define/ClassEnhancePluginDefine.java:78PluginFinder#find—apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/plugin/PluginFinder.java:51PluginFinder#build—apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/plugin/PluginFinder.java:79AbstractClassEnhancePluginDefine#isBootstrapInstrumentation—apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/plugin/define/AbstractClassEnhancePluginDefine.java:43AgentBuilderListener#onTransformation—apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/plugin/bytebuddy/AgentBuilderListener.java:48PluginBootstrap#loadPlugins—apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/plugin/PluginBootstrap.java:68
为什么使用插件定义而不是业务 SDK
Section titled “为什么使用插件定义而不是业务 SDK”替代方案:每个框架接入都要求业务代码包裹 API。为什么不行:侵入业务、迁移成本高、容易漏埋点。选择:通过 matcher 和 interceptor 在边界方法插入统一行为。
| 场景 | 现象 | 原因 | 规避 |
|---|---|---|---|
| 类匹配过宽 | 启动慢、增强过多 | matcher 扫描范围大 | 精确到包和方法签名 |
| 类加载器冲突 | NoClassDefFoundError | 插件依赖不可见 | 使用插件隔离和 bootstrap 配置 |
| 重入调用 | Span 重复 | 拦截器再次触发自身 | 使用上下文标记和排除规则 |
无侵入插桩的通用结构是“声明式匹配 + 轻量拦截器 + 运行时上下文”;框架差异应放在插件,不应污染采集核心。
面试锚点
- SkyWalking 如何做到业务无侵入?
- 插件定义包含哪些信息?
- 类加载器隔离为什么重要?