Я распространил информацию трассировки, которая передается с запросами между службами в заголовках HTTP (специально для opentracing).
Я бы хотел, чтобы эта информация была доступна везде, чтобы я мог включать идентификатор трассировки в журналы, распространять на последующие запросы и т. Д.
Итак, я хочу проанализировать заголовки, чтобы создать Span
до обработки запроса, сделать диапазон доступным для кода обработки, а затем выполнить некоторую очистку после обработки запроса.
вещей, которые я пробовал:
Сначала казалось, что Фильтр будет правильным подходом, но с этим есть несколько проблем:
- Установка локального хранилища потока при вызове следующего действия не очень помогает, потому что обычно большая часть работы выполняется во время или после Аккумулятора, который он возвращает. В этот момент локальное хранилище потока было сброшено.
- Насколько я могу судить, нет никакого способа обернуть
Accumulator
, чтобы этапы накопления были обернуты в контекст с локальным набором потока. Лучшее, что я смог сделать, - это использовать Accumulator.source
для возвращаемого мной накопителя, а затем использовать запуск накопителя вложенных действий с источником из него и пользовательским материализатором, который упаковывает все методы для установки локальных потоков. Но это все еще не работает, я думаю, потому что материализатор отправляет в другой поток. Я настроил диспетчер по умолчанию для akka, чтобы отслеживать эти локальные потоки, но материализатор, похоже, в этом случае обходит его.
- Нет способа прикрепить произвольные данные к RequestHeader, теги работают только для строк. И даже если бы это было так, мне пришлось бы поменять все свои контроллеры, чтобы прочитать их.
Так что я почти отказался от фильтров. Моя следующая попытка состояла в том, чтобы создать собственный ActionBuilder, чтобы обернуть Actions, чтобы прикрепить Span к каждому запросу, и запустить Action с установленными локальными потоками. Такого рода работы, для тела действий. Тем не менее, я создаю Span позже, после того, как тело было проанализировано, и BodyParser по-прежнему не имеет к нему доступа. Это также довольно неудобно, так как теперь я должен изменить все свои контроллеры, чтобы использовать это для создания действий вместо объекта Action
(а их много).
Существует ли какой-либо способ распространять данные вне диапазона (то есть, не являющиеся частью самого Содержимого тела) из анализатора тела или ранее в тело Действия. Или отправить данные из фильтра в код, выполненный аккумулятором?