В Храбром (zipkin tracer) мы присоединяем состояние, считываемое перехватчиками, путем управления ExecutorService диспетчера.размножающееся состояние, даже если оно не зарегистрировано
как это работает ..
- прикрепить пролет к теме местного
- завернуть исполнитель услугу, которые повторно присоединяет срок вызывающего потока к работоспособным
- сделать диспетчер используй этот исполнитель service
Это работает для синхронных запросов (так как они все равно не используют поток диспетчера) и обычных асинхронных запросов.
Он не работает, когда есть больше соединений в полете, чем разрешено, поскольку асинхронные запросы вставляются в очередь готовности до их выполнения. Очередь готовности не обрабатывается вызывающим потоком запроса, поэтому повторное присоединение не будет работать. Когда перехватчик работает с запросом с задержкой, он не может видеть свой диапазон вызовов, который прерывает трассировку.
Я думал, что, возможно, у приложения-перехватчика может не быть этой проблемы. Если предел хоста/подключения был принудительно (через указанную очередь) на сетевом уровне, я мог бы координировать состояние путем двойного регистрации перехватчика. Этот перехватчик может повторно присоединить состояние, не полагаясь на локаторы потоков, путем сопоставления запросов приложений/сетевых уровней.
К сожалению, это не работает, потому что предел хоста/подключения принудительно (через указанную очередь) на уровне приложения, так что я в тупике.
Я хотел бы отслеживать запросы, особенно если они не загружены. Есть идеи?
Шляпы прочь brianm для обнаружения этой проблемы, кстати