这是一个相当混乱的问题。但我会尝试它:
由它的声音。你正在以怪异的方式做事。度量标准已经拥有了自己的最佳实践,而且由于您正在测量业务逻辑,如果您想详细说明这一点,我不会看到您无法在商务课程中放置代码。例如,你总是需要提交你的指标无论如何,这样的事情:
try (Context time = metrics.timer(SEND_TIME).time()) {
// do some business operations and send something
}
因此,只有这样,你会“也许”绕过它,使用拦截器。他们会将您的业务方法调用包装为一个度量标准,就是这样。我相信,使用guice,你可以拦截你所做的每一个方法调用,所以基本上记录了一切。
这当然会让你失去细节。你只能测量方法,而不能测量方法。当然,现在您可以将所有方法拆分为更小的方法并记录更多细节 - 但是这确实能让代码更清洁吗?
度量标准的典型用法是,我看到它的方法是拥有1个注册表,该注册表包含所有度量标准,并将该注册表注入要使用度量标准进行度量的类中。我认为这种方法很好。
问题出现在报告中。你想要实时做到这一点?这意味着,您希望每个度量标准都向ES实例提交请求,以索引您测量的任何内容。
这种办法有2个问题:
如果你让你衡量每一个指标的要求,你杀了你的应用程序。你可以使这些请求异步,但由于你不想丢失任何东西,你仍然需要担心停机,DOS,重试等等等等。你将会非常忙于跟踪你的指标,没有什么可以去做你想要衡量的逻辑了。这听起来像一个非常糟糕的主意。
您可以使用记者。他们异步工作,他们没有太多工作,他们没有耗尽资源等等。但是现在你已经不再是实时的了。记者通常每分钟运行一次,所以你会有这种延迟。是的,你可以每10秒钟运行一次你的记者,每1秒等等 - 你永远都不是真正的时间。一旦你足够小,取决于你的实现,你将再次遇到问题1,你的应用程序所做的就是试图与弹性搜索进行对话。
如果你需要一个记者:https://github.com/elastic/elasticsearch-metrics-reporter-java
所以基本上,我稍微用你的做法感到困惑,但后来我又从来没有真正做到实时报告。
我们使用接近实时的报告,这意味着我们有1分钟的最大延迟时间,这对我们和我们的客户都很好。这就是我们多久可以将数据从应用程序转移到报告主机的情况,而不会影响应用程序的性能。
我在读,您可以使用ES客户端impl,它直接与群集通话,而不是使用http请求来索引数据。这可能会给你更多的表现,但我相信1和2仍然成立。
我希望帮助,
阿图尔
您可以编辑您的文章,并解释你目前的做法,你如何成长,你的担心是等这个问题是非常开放的,答案很可能会填补书籍。 – pandaadb
@pandaadb谢谢,我已经添加了两种可能的方法。我们正在建立一个有大量请求的社交游戏,测量需要完成而不会产生脏代码。 –
Elasticsearch与您的问题有什么关系?您是否想要使用指标,然后将指标报告给elasticsearch?你的结果是否必须立即? (例如,实时看到发生了什么?)你在测量什么? (请求?代码的执行时间?计算某些内容??) – pandaadb