java - 了解自定义指标发布者如何在hystrix上工作

标签 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来理解继承自HistrixCommand的每个类的execute()方法的每次执行。上下文,将生成对我插件的getMetricsPublisherForCommand()方法的调用。是真的吗
如果是这样,hystrix中有很多低级实现,例如线程池和其他。我的getMetricsPublisherForCommand()实现是线程安全的还是可以保证按顺序接收调用?我的getMetricsPublisherForCommand()将在哪个线程上执行?

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

此外,通过阅读文档,我的印象是,getMetricsPublisherForCommand()返回的HystrixMetricsPublisherCommand的实现将以某种方式成为一个单例,这完全打破了我对事物应如何工作的理解。

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

但是,如果您看一下伺服发布者,您会注意到,除非我完全和绝对困惑,否则发布内容是直接从构造函数执行的。现在,如果将调用initialize()进行一些设置,那么我该如何从构造函数中编写我的逻辑,除非该对象是单例对象,否则它将在任何包含initialize()的方法被调用之前执行?另一方面,如果这是一个单例,它将如何为每个hystrix命令运行其构造函数?

可能是我错过了一些东西,我不知道...但是我需要从概念上理解这里发生的事情,以便以正确的方式实现我的逻辑。感谢您的耐心配合,我希望我对这个冗长的问题已经足够清楚。

最佳答案

首先,建议您使用一种(简洁的)问题格式。

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

关于java - 了解自定义指标发布者如何在hystrix上工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42987115/

相关文章:

java - Spring cloud中Zuul服务器的回退方法

java - Hystrix 中命令指标更新延迟?

java - 使用 java.util.concurrent.FutureTask 是不是一个好方法?

java - JVM 错误? java.lang.VerifyError : Bad type on operand stack

Java System.loadLibrary 依赖项

php - 统计 Netbeans PHP 项目的代码行数

用于计算圈复杂度的Java工具

java - 用于测量代码行的 Eclipse 插件

java - Java中的原始套接字

java - 基于 Zuul 的路由中的超时异常