這是一個相當混亂的問題。但我會嘗試它:
由它的聲音。你正在以怪異的方式做事。度量標準已經擁有了自己的最佳實踐,而且由於您正在測量業務邏輯,如果您想詳細說明這一點,我不會看到您無法在商務課程中放置代碼。例如,你總是需要提交你的指標無論如何,這樣的事情:
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