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

Posted

技术标签:

【中文标题】了解自定义指标发布者如何在 hystrix 上工作【英文标题】:understanding how custom metrics publisher work on hystrix 【发布时间】:2017-08-16 15:51:34 【问题描述】:

我有点难以理解如何实现 Hystrix Metrics Publisher 插件。

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

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

hystrix运行的系统是一个普通的spring应用。这就是说,我对java平台也有些陌生(虽然我对java语言很熟悉)。

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

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

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

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

现在开始提问:

问题 1 我假设一旦注册了插件,每次执行插件注册的上下文中的每个命令,通过命令这个词,我们可以理解每个继承自的类的 execute() 方法的每次执行HistrixCommand 在该上下文中,将生成对我插件的 getMetricsPublisherForCommand() 方法的调用。这是真的吗? 如果是这样,hystrix 中有很多低级实现,例如线程池等,我的 getMetricsPublisherForCommand() 实现应该是线程安全的还是保证按顺序接收调用?我的 getMetricsPublisherForCommand() 将在哪个线程上执行?

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

另外,通过阅读文档,我的印象是 getMetricsPublisherForCommand() 返回的 HystrixMetricsPublisherCommand 的实现将在某种程度上是一个单例,这完全打破了我对事情应该如何工作的理解。

文档是这样说的:

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

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

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

【问题讨论】:

我正在做同一个项目,目前正在苦苦挣扎,您找到解决方案了吗? 【参考方案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

【讨论】:

以上是关于了解自定义指标发布者如何在 hystrix 上工作的主要内容,如果未能解决你的问题,请参考以下文章

如何在仪表板中查看 Hystrix 指标的天数以进行监控

在 PCF 上部署 Spring Boot 的 Hystrix 仪表板不显示指标

如何向 Turbine 添加额外的 Hystrix 指标聚合

有人可以解释一下 Hystrix 指标的行和桶概念吗?

无法使用自定义内存指标自动缩放 GCP 实例

如何理解Keras中的指标Metrics