Я пытаюсь передать информацию мониторинга / отслеживания через все мои внешние вызовы в моем java-приложении.
Чтобы сделать его прозрачным, я пытаюсь использовать byte-buddy, но у меня возникают проблемы с его работой.
Чтобы отследить каждый входящий (http) запрос, я перехватываю HttpServlet.service()
, извлекаю заголовок токена из HttpServletRequest
и помещаю его в статический ThreadLocal
в классе с именем TokenHolder
.
Чтобы отследить каждый исходящий (http) запрос, я перехватываю HttpURLConnection
и добавляю заголовок токена, полученный от того же ThreadLocal
(TokenHolder
).
Проблема, с которой я столкнулся, заключается в том, что TokenHolder
, кажется, инициализируется дважды, и мои 2 перехватчика не записывают / читают с одного и того же ThreadLocal
, и я не могу найти способ сделать это.
Полагаю, проблема в том, что HttpURLConnection
живет в пути начальной загрузки, а API сервлета нет.
Бонусный вопрос: можно ли перехватить URL.openConnection()
? Это была моя первая идея, но я никогда не мог сделать это, потому что я полагаю, что класс URL
загружается перед агентом (из-за URLClassLoader
), но я не знаю, есть ли обходные пути для этого.