spring-projects / spring-projects/spring-framework
Consider relative ordering for AspectJ aspects
Nobody has claimed this yet.
- Dominant language
- Java
- Stars
- 60.2k
- Forks
- 38.8k
- Avg merge
- 5d 2h
- Merged PRs (30d)
- 27
Description
I use micrometer in a Spring Boot application to measure the execution time of a method.
Given the following (Kotlin) method:
class MyClass(...) {
@Timed(value = "my_timer")
@Transactional
fun doSomething() {
// Some code that performs changes on the database
}
}
I would expect that the @Timed annotation measures the total time that the method execution takes including the @Transactional handling. I compared it to measuring the time outside, as in the following example:
val start = System.nanoTime()
myClass.doSomething()
timer.record(System.nanoTime() - start, TimeUnit.NANOSECONDS)
Since the time measuring is different I did some debugging and found out that the underlying io.micrometer.core.aop.TimedAspect runs after the @Transactional processing, which means the order is as follows:
- Transaction start
- Time measurement starts
- Method body execution
- Time measurement stops
- Transaction commits
What I would like to achieve is the following order:
- Time measurement starts
- Transaction start
- Method body execution
- Transaction commits
- Time measurement stops
I already opened an issue at micrometer: https://github.com/micrometer-metrics/micrometer/issues/5235, but they pointed me to the spring-framework issue tracker.
I already tried to use @DeclarePrecedence like this + @EnableAspectJAutoProxy on the @SpringBootApplication class, but it had no effect.
@Aspect
@DeclarePrecedence("TimedAspect, *")
public class TimedAspectPrecedence {
}
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Start with io.micrometer.core.aop.TimedAspect and Spring's @EnableAspectJAutoProxy setup, then trace how @Timed and @Transactional ordering is selected. Reproduce the Kotlin example and compare the timing boundaries with transaction start and commit. Done means the requested ordering is supported and covered by a regression test.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- java, kotlin, spring, spring-boot
- Domain
- backend
- Issue type
- Feature
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Activity status
- Stale
- Clarity
- Mostly clear
- Newbie friendliness
- 35/100