Hi Mark, Apologies for sending you an email again, could I ask for a quick review on how I made this feature work to see if I have any misconceptions, which could affect how I would code it in Tomcat's source code? On top of the queue time, I added the request processing time as well as I wanted to include percentiles as well (P99, P90 etc).
1. I utilised my own CustomThreadPoolExecutor, that overrides ThreadPoolExecutor's offer() method. It inserts a queue time into a ConcurrentHashMap, with the key being the Runnable. It also overwrites the take() and poll() method, retrieving the queue time from the hashmap and computing the queue time. 2. Since the worker thread handling the request is the one that calls take() and poll(), I create a ThreadLocal HashMap and inserted the queue time. Utilising the beforeExecute() and afterExecute() hook, I compute the request processing time as well. 3. In the afterExecute() hook, I register the queue time and request processing time. I also check to ensure that the task is a valid request (I understand some tasks queued to the executor are SocketEvents of ERROR, which closes the SocketWrapper), by utilising a Filter to intercept if the request is passed down the filter chain. I will only register metrics for those that have been passed down this filter chain. Thank you! Regards Andy On Fri, Nov 29, 2024 at 9:58 AM Owner <o8076...@gmail.com> wrote: > Hey Mark, > > Thank you for your response. I've actually developed it on my own Spring > Boot Application to scrape these metrics, but it involves subclassing > TaskQueue (in order to overwrite the offer() method and track the start/end > time), and utilising this subclassed queue when constructing my > ExecutorService - am not sure if this might be too specialized to be pushed > out to the community. > > Was wondering if you have any thoughts on how this feature could be > implemented? We could go through the pseudocode based on what I've > developed too if it helps. > > Cheers, > Andy > > > On Thu, Nov 28, 2024 at 7:57 PM Mark Thomas <ma...@apache.org> wrote: > >> On 28/11/2024 09:26, Owner wrote: >> > Hi Tomcat Devs, >> > >> > Hope you guys are having a great day. I'm a new developer to this area >> so >> > do let me know if I have any misconceptions or errors in my thinking. >> > >> > I am currently using Tomcat as an embedded web server within a Spring >> Boot >> > Application, and I utilise Micrometer to expose Tomcat metrics, such as >> > tomcat_servlet_request_seconds. >> > >> > I was thinking if it'd be useful to include a metric that tracks the >> > latency experienced in terms of time spent in the Tomcat queue. I >> > understand that each request is added to a TaskQueue (default >> > implementation) by the poller thread, and the internal executor service >> > created will assign a thread to each task. However, the current metrics >> > only track the time after polling from the queue, and passed down >> through >> > filters etc to the dispatcher servlet. (tomcat_servlet_request_seconds). >> > >> > In reality, I understand the total delay experienced by the client >> should >> > include the time spent in the queue as well, since there could be a case >> > where there are no available threads to service incoming requests. >> > >> > Would this metric serve a good use case? Or are there already similar >> > metrics out there? I'm currently on Tomcat 9.0.63 if that helps. >> >> Sounds useful to me. I'd certainly look at any proposed patch. Whether >> it gets merged will depend on various factors (complexity, performance, >> etc). >> >> Mark >> >> >> --------------------------------------------------------------------- >> To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org >> For additional commands, e-mail: dev-h...@tomcat.apache.org >> >>