了解 javaagent instrumentation 的测试组件
Javaagent instrumentation 的测试在运行的时候是依赖一个经过 shaded 的 -javaagent
来确保模拟当 agent 运行在一个普通应用的时候的相同字节码增强
场景。
下面介绍让上述场景实现的关键组件。
gradle/instrumentation.gradle
- 对进行 instrumentation 的类进行 shaded
- 根据测试配置添加相应的 jvm 启动参数
- -javaagent:[agent for testing]
- -Dotel.javaagent.experimental.initializer.jar=[shaded instrumentation jar]
otel.javaagent.experimental.initializer.jar
属性是用来加载经过 shaded 的 instrumentation jar 包到 AgentClassLoader
, 这样的话 javaagent 的 jar 包不需要在
每次测试执行的时候重新构建。
:testing:agent-exporter
这里包含了所使用的 span 与 metric 的 exporter。
这些都是内存中的 exporter,这样的话可以通过这测试用例来验证 正在导出的span 和 metric 。
这些exporters与内存中的数据存在于AgentClassLoader
,所以测试用例必须通过反射来访问它们。简而言之,他们使用 OTLP protobuf 对象存储内存中的数据,这样就可以在AgentClassLoader内将它们序列化为字节数组,然后传递回测试,并在类装入器内反序列化,在那里可以对它们进行验证。:testing-common模块(如下所述)向仪器测试作者隐藏了这种复杂性。
:agent-for-testing
这是一个包含 :testing:agent-exporter
的定制测试 javaagent 的成果物模块。
:testing-common
这个模块提供了方法去验证 instrumentation 中所产生的 span 和 metric 的数据,并封装了从 AgentClassLoader
中获取内存 exporter 数据的复杂逻辑。