了解自定义指标发布商如何在hystrix

时间:2017-03-23 21:14:49

标签: java metrics hystrix netflix publisher

我正在努力了解如何实现Hystrix Metrics Publisher插件。

阅读完文档后,仍然不清楚如何协同工作。

我的目标是编写一个插件,收集hystrix发布的每个指标,并将这些指标写入磁盘上的文件。 该文件稍后将由外部工具收集和处理,为我们提供电路行为和问题的良好历史基础。

运行hystrix的系统是普通的spring应用程序。这就是说,我在java平台上也有些新东西(虽然我对java语言很满意)。

我认为,了解如何实施插件的第一步是查看已经实施的发布商。考虑到这一点,我查看了hystrix-contrib目录的一些实现。

我选择了hystrix-codahale-metrics-publisher和hystrix-servo-metrics-publisher。

它们都有一个主类(伺服是HystrixServoMetricsPublisher),似乎注册接收所有可能的指标和一些类来处理各种指标。

通过查看我将称之为主类的内容,我看到,例如,有一个名为getMetricsPublisherForCommand的方法必须返回接口HystrixMetricsPublisherCommand的实现。

现在问题开始了:

问题1我假设一旦插件在注册插件的上下文中的每个命令的每次执行都被注册,并且通过word命令我们可以理解每个继承自的类的execute()方法的执行关于该上下文的HistrixCommand将生成对我的插件的getMetricsPublisherForCommand()方法的调用。这是真的吗? 如果是这样,hystrix中有很多低级实现,比如线程池和其他,我的getMetricsPublisherForCommand()实现是否应该是线程安全的,或者我保证按顺序接收调用?在什么线程上我的getMetricsPublisherForCommand()会被执行?

问题2通过查看文档,我仍然不确定getMetricsPublisherForCommand()返回的HystrixMetricsPublisherCommand的实现究竟是什么。这是因为HystrixMetricsPublisherCommand接口仅指定了一个名为initialize()的方法。如果它指定了一个名为publish()的方法,我会得出结论,hystrix引擎会调用我的自定义getMetricsPublisherForCommand()方法来获取一个度量标准发布者,它将调用publish()方法来执行自定义发布。但是当返回给定的对象时,initialize()方法只能被调用一次,并且我没有找到引擎之后调用的其他方法。

另外,通过阅读文档,我的印象是getMetricsPublisherForCommand()返回的HystrixMetricsPublisherCommand的实现将以某种方式完全破坏我对该事物应该如何工作的理解。

文档说明:

initialize()方法将被调用一次,以指示此实例何时可以向外部服务注册,开始发布指标等。

如果你看一下servopublisher,你会注意到,除非我完全和绝对地混淆,所以发布的东西是从构造函数执行的。现在,如果将调用initialize()进行一些设置,我怎样才能从构造函数中编写逻辑,除非对象是单例,否则它将在包含initialize()的任何方法被调用之前执行?另一方面,,,如果这是一个单例,它怎么能为每个hystrix命令运行它的构造函数?

可能是我错过了一些东西,我不知道......但我需要从概念上理解这里发生了什么才能以正确的方式实现我的逻辑。感谢您的耐心等待,我希望在这个长期问题上我已经做得很清楚了。

1 个答案:

答案 0 :(得分:0)

首先,建议保持一个(简明)问题格式。

其次,建议使用现有的实现,例如默认的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