2016-04-06 78 views
-4

我正在研究Dropwizard指标,我的目标是实时测量计数器和直方图,并将它们发送到ElasticSearch实例。Appropiate Design Pattern通过Dropwizard跟踪指标

即使我发现很容易使它在开发阶段工作,我不知道是否有一种方法来添加指标代码随着项目的增长,同时保持干净。

跟踪指标时是否有常用的设计模式?我的意思是,一个实现可以让我们的代码与指标解耦,从而实现业务。

我一直在考虑可能的方法是:

A)AOP:干净,但仍然在我的业务类的一些代码。 B)使用Camel或类似工具将HTTP请求转发到特定的微服务/ API。也许太复杂了,我恐怕会增加延迟。

谢谢!

+0

您可以编辑您的文章,并解释你目前的做法,你如何成长,你的担心是等这个问题是非常开放的,答案很可能会填补书籍。 – pandaadb

+0

@pandaadb谢谢,我已经添加了两种可能的方法。我们正在建立一个有大量请求的社交游戏,测量需要完成而不会产生脏代码。 –

+0

Elasticsearch与您的问题有什么关系?您是否想要使用指标,然后将指标报告给elasticsearch?你的结果是否必须立即? (例如,实时看到发生了什么?)你在测量什么? (请求?代码的执行时间?计算某些内容??) – pandaadb

回答

0

这是一个相当混乱的问题。但我会尝试它:

由它的声音。你正在以怪异的方式做事。度量标准已经拥有了自己的最佳实践,而且由于您正在测量业务逻辑,如果您想详细说明这一点,我不会看到您无法在商务课程中放置代码。例如,你总是需要提交你的指标无论如何,这样的事情:

try (Context time = metrics.timer(SEND_TIME).time()) { 
    // do some business operations and send something 
} 

因此,只有这样,你会“也许”绕过它,使用拦截器。他们会将您的业务方法调用包装为一个度量标准,就是这样。我相信,使用guice,你可以拦截你所做的每一个方法调用,所以基本上记录了一切。

这当然会让你失去细节。你只能测量方法,而不能测量方法。当然,现在您可以将所有方法拆分为更小的方法并记录更多细节 - 但是这确实能让代码更清洁吗?

度量标准的典型用法是,我看到它的方法是拥有1个注册表,该注册表包含所有度量标准,并将该注册表注入要使用度量标准进行度量的类中。我认为这种方法很好。

问题出现在报告中。你想要实时做到这一点?这意味着,您希望每个度量标准都向ES实例提交请求,以索引您测量的任何内容。

这种办法有2个问题:

  1. 如果你让你衡量每一个指标的要求,你杀了你的应用程序。你可以使这些请求异步,但由于你不想丢失任何东西,你仍然需要担心停机,DOS,重试等等等等。你将会非常忙于跟踪你的指标,没有什么可以去做你想要衡量的逻辑了。这听起来像一个非常糟糕的主意。

  2. 您可以使用记者。他们异步工作,他们没有太多工作,他们没有耗尽资源等等。但是现在你已经不再是实时的了。记者通常每分钟运行一次,所以你会有这种延迟。是的,你可以每10秒钟运行一次你的记者,每1秒等等 - 你永远都不是真正的时间。一旦你足够小,取决于你的实现,你将再次遇到问题1,你的应用程序所做的就是试图与弹性搜索进行对话。

如果你需要一个记者:https://github.com/elastic/elasticsearch-metrics-reporter-java

所以基本上,我稍微用你的做法感到困惑,但后来我又从来没有真正做到实时报告。

我们使用接近实时的报告,这意味着我们有1分钟的最大延迟时间,这对我们和我们的客户都很好。这就是我们多久可以将数据从应用程序转移到报告主机的情况,而不会影响应用程序的性能。

我在读,您可以使用ES客户端impl,它直接与群集通话,而不是使用http请求来索引数据。这可能会给你更多的表现,但我相信1和2仍然成立。

我希望帮助,

阿图尔

+0

谢谢,我正在谈论你近乎实时的命名,一直在尝试ES-Reporter并且工作正常。 我没有使用拦截器(非常了解Guice,从未尝试过),也没有使用AOP,所以我正在寻找已经实施过它们的人的意见。以这种方式找到有用的答案。 –

+0

那么,使用dropwizard,有:https://github.com/xvik/dropwizard-guicey我在多台服务器上使用它,它使我的生活变得非常简单。另外,您可以获得对Guice拦截器的支持:https://github.com/google/guice/wiki/AOP所有guice创建的类都可以像这样被拦截,并且您基本上可以编写一个可以拦截一切并测量所有内容。请务必阅读限制。 Spring对拦截器有更多的功能。 – pandaadb