了解自定义指标发布者如何在 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 上工作的主要内容,如果未能解决你的问题,请参考以下文章
在 PCF 上部署 Spring Boot 的 Hystrix 仪表板不显示指标