Description
Spring Framework 6.0.19
CometD 7.0.10
Micrometer 1.12.5
I'm not exactly sure which component is responsible for this issue but since spring-web contains ServerHttpObservationFilter, I am submitting this bug here.
We have recently run into a memory leak of DefaultLongTaskTimer$SampleImpl. This was introduced with micrometer introducing histograms for http.server.requests.active.
The leak happens only for requests to CometD and it happens because those requests are asynchronous.
In https://github.com/spring-projects/spring-framework/blob/main/spring-web/src/main/java/org/springframework/web/filter/ServerHttpObservationFilter.java:
- Observation is created at the start of doFilterInternal.
- In synchronous requests, Observation is closed at the end of that function.
- For asynchronous requests, Observation is never closed, by design, which was fine until histograms were introduced that use Observation.stop to stop DefaultLongTaskTimer$SampleImpl.
- Since Observation is never stopped, we end up with DefaultLongTaskTimer$SampleImpl leak
The problem is that there is no corresponding callback that would close the Observation once asynchronous requests completes.
Thanks,