2016-04-06 112 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