понимание того, как издатель пользовательских метрик работает с hystrix

Я немного пытаюсь понять, как реализовать плагин Hystrix Metrics Publisher.

Прочитав документацию, все еще не ясно, как все должно работать вместе.

Моя цель - написать плагин, который будет собирать все метрики, опубликованные hystrix, и записывать эти метрики в файл на диске. Этот файл позже будет собран и обработан внешним инструментом, что даст нам хорошую историческую основу поведения и проблем схемы.

Система, в которой работает hystrix, представляет собой обычное весеннее приложение. При этом я немного новичок в платформе java (хотя мне нравится язык java).

Я подумал, что первым шагом к пониманию того, как можно реализовать плагин, будет рассмотрение уже реализованных издателей. Имея это в виду, я рассмотрел некоторые реализации каталога hystrix-contrib.

Я выбрал издателя hystrix-codahale-metrics и издателя hystrix-servo-metrics.

У обоих из них есть основной класс (сервопривод - это HystrixServoMetricsPublisher), который, кажется, регистрируется для получения всех возможных видов метрик и некоторых классов для работы с каждым типом метрик.

Глядя на то, что я назову основным классом, я вижу, что, например, существует метод getMetricsPublisherForCommand, который должен возвращать реализацию интерфейса HystrixMetricsPublisherCommand.

Теперь начинаются вопросы:

Вопрос 1 Я предполагаю, что после регистрации плагина каждое выполнение каждой команды в контексте, в котором зарегистрирован плагин, и под словом команда мы можем понимать каждое выполнение метода execute () каждого класса, который наследуется от HistrixCommand в этом context, будет сгенерирован вызов метода getMetricsPublisherForCommand () моего плагина. Это правда? Если это так, то в hystrix есть много низкоуровневых реализаций, таких как пулы потоков и другие. Должна ли моя реализация getMetricsPublisherForCommand () быть поточно-ориентированной или я гарантированно получаю вызовы в последовательном порядке? В каком потоке будет выполняться мой getMetricsPublisherForCommand ()?

Вопрос 2 Изучив документацию, я все еще не уверен, что именно должна делать реализация HystrixMetricsPublisherCommand, возвращаемая getMetricsPublisherForCommand (). Это связано с тем, что интерфейс HystrixMetricsPublisherCommand определяет только метод с именем initialize (). если бы он указывал метод под названием, скажем, publish (), я бы пришел к выводу, что механизм hystrix вызовет мой собственный метод getMetricsPublisherForCommand (), чтобы получить издателя метрик, для которого он вызовет метод publish () для выполнения настраиваемой публикации. Но кажется, что метод initialize () вызывается только один раз при возврате данного объекта, и я не нашел другого метода, который бы впоследствии вызвал движок.

Кроме того, читая документацию, у меня сложилось впечатление, что реализация HystrixMetricsPublisherCommand, возвращаемая getMetricsPublisherForCommand (), каким-то образом будет синглтоном, что полностью нарушает мое понимание того, как эта вещь должна работать.

В документации сказано следующее:

Метод initialize() будет вызываться однократно, чтобы указать, когда этот экземпляр может зарегистрироваться во внешних службах, начать публикацию показателей и т. Д.

Однако если вы посмотрите на сервоиздателя, то заметите, что, если я не полностью и не запутался, публикация выполняется прямо из конструктора. Теперь, если для настройки будет вызвана функция initialize (), как я могу закодировать свою логику из конструктора, где, если объект не является одноэлементным, он будет выполнен до того, как любой метод, включая initialize (), получит шанс быть вызванным ? С другой стороны ,,, если это синглтон, как он может запускать свой конструктор для каждой команды hystrix?

Может, я что-то упустил, не знаю ... но мне нужно концептуально понять, что здесь происходит, чтобы правильно реализовать свою логику. Спасибо за ваше терпение, и я надеюсь, что достаточно ясно выразился в этом длинном вопросе.


person Marlon Brandão de Sousa    schedule 23.03.2017    source источник
comment
Я работаю над тем же проектом, я сейчас борюсь, вы нашли решение?   -  person cyrille gate    schedule 26.05.2021


Ответы (1)


Во-первых, рекомендую придерживаться формата одного (краткого) вопроса.

Во-вторых, рекомендуется использовать существующую реализацию, такую ​​как реализация по умолчанию CodaHale (ранее DropWizard) (которая, например, публикуется в репозитории Graphite для использования Grafana), чтобы заставить ее работать.

    HystrixPlugins.reset();

    final WebApplicationContext springContext =
            WebApplicationContextUtils.getWebApplicationContext(sce.getServletContext());

    HystrixPlugins plugins = HystrixPlugins.getInstance();

    plugins.registerCommandExecutionHook(...);

    // Good idea to use properties to enable/disable metrics generally...

    // Using Spring type example...

    if (hystrixMetricsEnabled.get()) {
        plugins.registerMetricsPublisher(new HystrixCodaHaleMetricsPublisher(
                getRegistry(springContext, sce.getServletContext())));

...

В противном случае документация Hystrix и полный исходный код задействованных классов общедоступны:

https://github.com/Netflix/Hystrix/wiki/Plugins#metricspublisher

person Darrell Teague    schedule 14.11.2017