Elasticsearch&Kibana改進TopHits的設想

背景
大家在使用ES和Kibana的時候,應該都遇到過這樣的場景:
假設有一個主機監控的任務,收集的數據格式為:時間戳、主機名、當前內存占用量,收集周期為每分鐘收集一次。那么在Kibana中可能需要提供這樣的報表,當前所有主機總體內存占用量。大家動手試試,在Kibana報表中,應該是做不到的。
我這里實際動手,作為示例解釋下:
1、進入Kibana的DevTools頁面,導入模擬數據
如上圖,4條數據,兩條是主機AAA的不同時間上報的內存占用量,另外兩條是主機BBB的。
思考下,我們如何從這些數據中求出AAA、BBB的總內存占用?思考可得知,先需要求得AAA和BBB主機分別的最后一條上報數據,即圖中第二條和第四條數據。然后將這兩條數據的mem_used_mb相加。
順著這個思路,我們繼續。
2、用分組aggregation和TopHits aggregation求出AAA和BBB的最后一條上報數據
上圖中,涉及到兩個Aggregation,一個是terms agg,在ES中屬于Buckets Agg,是可以攜帶子agg的。一個是top_hits agg,屬于Metric Agg,是不可以攜帶子agg的。組合起來含義就是,按照host的值進行分組,每個分組中取按照@timestamp字段值倒排序的前一條文檔
執行返回結果:
我們在kibana中看看是怎么圖形化構造這個語句的(注意先在kibana中創建monitor索引對應的Pattern):
上圖中,我們可以看到Kibana中和ES原生語法相比TopHits的內容多了個Field和一個Aggregate with需要填,這是Kibana界面上的一個優化,確保得出來的值是一個數字,而不是一條條記錄。意思就是在求出來的記錄上挑選一個字段求聚合的值,以便得到一個數字從而生成指標圖。
好了,已經得到了每個主機的最后一條記錄,如何求兩個主機的mem_used_mb只和呢?ES有提供相關的Agg,叫sum_bucket agg,用于求其他bucket類型agg的多個分組數值只和。我們先看一個樣例。
求得結果:
大家可以注意,上圖中分組agg里面嵌套的是一種叫做max的agg,用于求mem_used_mb的最大值,而整個語句的效果相當于,求出每個主機記錄中mem_used_mb字段最大一次的值,然后相加。這樣很明顯不是我們所需要的結果。那么為什么不用top_hits呢?
3、為什么top_hits不可以和sum_bucket配合
大家看看我們把max agg替換為top_hits agg后的結果,輸入命令:
結果:
出錯了!為什么呢?由解釋可知sum_bucket只能接受分組中的值為一個單數字,并且結果字段名稱要叫做”value”,而top_hits agg的結果只是一行行文檔,不符合這個條件。
Kibana也知道ES這個限制,從而在sum_buket的構造頁面中根本不提供接入top_hits的選項。
4、如何解決呢?
設想應該可以增加一個ES插件,擴展top_hits agg的行為,增加類似kibana界面優化上的aggregate with選項,將top_hits的輸出變為一個單值,叫做”value”。同時kibana界面上開放相關適配。
這個能力已經在華為云云搜索服務中實現了,云搜索服務是基于開源的elasticsearch的一款云服務,并且做了很多增強,歡迎前往官網使用華為云CSS服務官網:
關于云搜索服務的其他功能介紹可以參考:
https://support.huaweicloud.com/usermanual-css/css_01_0007.html
云搜索服務 CSS Elasticsearch
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。