问题描述
我正在尝试使用基于字节伙伴的 Java 代理记录在我的 Springboot 应用程序中调用的所有方法。
我能够记录除 Spring 数据 JPA 存储库之外的所有层,它们实际上是接口。下面是代理初始化:
new AgentBuilder.Default()
.type(ElementMatchers.hasSuperType(nameContains("com.soka.tracker.repository").and(ElementMatchers.isInterface())))
.transform(new AgentBuilder.Transformer.ForAdvice()
.include(TestAgent.class.getClassLoader())
.advice(ElementMatchers.any(),"com.testaware.MyAdvice"))
.installOn(instrumentation);
当我的存储库方法被调用时我可以用来记录的任何提示或解决方法。下面是一个有问题的示例存储库:
package com.soka.tracker.repository;
.....
@Repository
public interface GeocodeRepository extends JpaRepository<Geocodes,Integer> {
Optional<Geocodes> findByaddress(String currAddress);
}
修改代理:
new AgentBuilder.Default()
.ignore(new AgentBuilder.RawMatcher.ForElementMatchers(any(),isBootstrapClassLoader().or(isExtensionClassLoader())))
.ignore(new AgentBuilder.RawMatcher.ForElementMatchers(nameStartsWith("net.bytebuddy.")
.and(not(ElementMatchers.nameStartsWith(NamingStrategy.SuffixingRandom.BYTE_BUDDY_RENAME_PACKAGE + ".")))
.or(nameStartsWith("sun.reflect."))))
.type(ElementMatchers.nameContains("soka"))
.transform(new AgentBuilder.Transformer.ForAdvice()
.include(TestAgent.class.getClassLoader())
.advice(any(),"com.testaware.MyAdvice"))
//.with(AgentBuilder.Listener.StreamWriting.toSystemOut())
.with(AgentBuilder.Typestrategy.Default.redefine)
.installOn(instrumentation);
我看到了关于控制器和服务层的建议 - JPA 存储库层没有被记录。
解决方法
默认情况下,Byte Buddy 会忽略其代理中的合成类型。我假设 Spring 的存储库类被标记为这样,因此不会被处理。
您可以使用 ignore
DSL 设置自定义 AgentBuilder
匹配器。默认情况下,以下忽略匹配器设置为忽略系统类和 Byte Buddy 自己的类型:
new RawMatcher.Disjunction(
new RawMatcher.ForElementMatchers(any(),isBootstrapClassLoader().or(isExtensionClassLoader())),new RawMatcher.ForElementMatchers(nameStartsWith("net.bytebuddy.")
.and(not(ElementMatchers.nameStartsWith(NamingStrategy.SuffixingRandom.BYTE_BUDDY_RENAME_PACKAGE + ".")))
.or(nameStartsWith("sun.reflect."))
.<TypeDescription>or(isSynthetic())))
您可能需要删除最后一个条件。
,对于访问此问题/问题的任何人 - 我能够通过记录在执行期间调用的实际查询来解决实际问题 - Bytebuddy 非常棒且非常强大 - 例如 - 在我的情况下,我只是 advice
'使用我的数据库连接池类并收集所有必需的遥测数据 -
.or(ElementMatchers.nameContains("com.zaxxer.hikari.pool.HikariProxyConnection"))