Spring 事务 - 新事务的日志方法执行时间
Spring Transaction - Log method execution time on new transaction
我有一个 aspect-j 方面(在编译时编织)来记录最后一个大于 1s 的方法名称和执行时间。
日志聚集在一个 ELK 堆栈中,我们想进行可视化分析,问题是堆栈中的所有子调用也被跟踪,我们有如此多的跟踪,每个工作单元都有多个方法名称。
我只想跟踪每个工作单元的入口点方法,即。每种方法都会触发一个新交易(而不是加入现有交易的方法)。
有没有办法在不覆盖 spring TransactionInterceptor 的情况下这样做?
如果您需要一个仅使用 AspectJ 的简单解决方案,以下可能适合您。
假设您有一个命名切入点 transactionalMethodExecution
:
pointcut transactionalMethodExecution(): execution(@org.springframework.transaction.annotation.Transactional * *(..));;
您可以使用 cflowbelow
:
在最顶层的控制流中排除所有嵌套的 transactionalMethodExecution
切入点
transactionalMethodExecution() && !cflowbelow(transactionalMethodExecution())
来自 cflowbelow
上的文档:
cflowbelow(Pointcut)
Picks out each join point in the control flow of any join point P
picked out by Pointcut
, but not P
itself.
这个解决方案公认是简单的,它不处理嵌套事务或任何更花哨的情况。对于这些情况,您需要更彻底的解决方案。
我有一个 aspect-j 方面(在编译时编织)来记录最后一个大于 1s 的方法名称和执行时间。
日志聚集在一个 ELK 堆栈中,我们想进行可视化分析,问题是堆栈中的所有子调用也被跟踪,我们有如此多的跟踪,每个工作单元都有多个方法名称。
我只想跟踪每个工作单元的入口点方法,即。每种方法都会触发一个新交易(而不是加入现有交易的方法)。
有没有办法在不覆盖 spring TransactionInterceptor 的情况下这样做?
如果您需要一个仅使用 AspectJ 的简单解决方案,以下可能适合您。
假设您有一个命名切入点 transactionalMethodExecution
:
pointcut transactionalMethodExecution(): execution(@org.springframework.transaction.annotation.Transactional * *(..));;
您可以使用 cflowbelow
:
transactionalMethodExecution
切入点
transactionalMethodExecution() && !cflowbelow(transactionalMethodExecution())
来自 cflowbelow
上的文档:
cflowbelow(Pointcut)
Picks out each join point in the control flow of any join point
P
picked out byPointcut
, but notP
itself.
这个解决方案公认是简单的,它不处理嵌套事务或任何更花哨的情况。对于这些情况,您需要更彻底的解决方案。