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.

这个解决方案公认是简单的,它不处理嵌套事务或任何更花哨的情况。对于这些情况,您需要更彻底的解决方案。