先說一下業務場景:本人當前做的這個項目會收集公司所有應用的日誌,日誌存儲在ES中,只保留N天,不同應用的日誌會存儲在不同的index中並且index按天拆分。提供了界面讓應用的開發人員查看自己應用的日誌,後續還會有新的應用加入。
想要做到什麼樣呢?
管理界面上嵌入kibana的頁面,選擇不同應用,查看不同應用的日誌,但是kibana的查詢參數不會出現類似於appName:xxx
這樣的字段,也就是說不用應用之間的參數差異對於開發人員是不可見的,想要做到對開發人員透明這就需要在查詢的時候根據appName
動態的指定index(不同應用查詢不同的index)。
在Kibana4中取消了對於模板和腳本的支持,使得沒辦法在查詢的時候指定使用的index(kibana3中可以使用模板做到這一點)。然而在Kibana4中增加了index pattern
,index pattern
被用來限定查詢的index範圍,舉例來說如果你的search
使用的index pattern
是logstash-*
,那麼使用search
的時候,只會在以logstash-
開頭的index上查詢(具體可以參考官方介紹)。
這樣爲查詢時指定index提供了一條明路,可惜的是如果你指定的index pattern
不存在,那麼Kibana會使用默認的。當然,你可以事先創建好你想使用的index pattern
,這樣一來就需要修改你原先的代碼,系統中新增應用的時候就需要多一步操作了。這個辦法也還可以,但是能不能更簡單一些呢?
如果index pattern
不存在就是用默認的,這個判斷邏輯不難想象是如何實現的,所以是不是可以通過修改源碼來修改一下這個邏輯呢?讓kibana在找不到指定的index pattern
的時候依舊使用呢?
代碼修改其實很簡單,在optimize/bundles/kibana.bundle.js
文件中,源碼如下:
function resolveIndexPatternLoading() {
var props = $route.current.locals.ip;
var loaded = props.loaded;
var stateVal = props.stateVal;
var stateValFound = props.stateValFound;
var own = $scope.searchSource.getOwn('index');
if (own && !stateVal) return own;
if (stateVal && !stateValFound) {
var err = '"' + stateVal + '" is not a configured pattern. ';
if (own) {
notify.warning(err + ' Using the saved index pattern: "' + own.id + '"');
return own;
}
notify.warning(err + ' Using the default index pattern: "' + loaded.id + '"');
}
return loaded;
}
修改後:
function resolveIndexPatternLoading() {
var props = $route.current.locals.ip;
var loaded = props.loaded;
var stateVal = props.stateVal;
//stateVal的值就是穿過來的index pattern的名字
//如果傳過來了index pattern,那麼就是用傳過來的值(基本上傳過來的index pattern都不存在)
//這個index pattern會被用到ES搜索裏面
if (stateVal) {
loaded.id=stateVal;
loaded.title=stateVal;
}
var stateValFound = props.stateValFound;
var own = $scope.searchSource.getOwn('index');
if (own && !stateVal) return own;
if (stateVal && !stateValFound) {
var err = '"' + stateVal + '" is not a configured pattern. ';
if (own) {
notify.warning(err + ' Using the saved index pattern: "' + own.id + '"');
return own;
}
return loaded;//notify.warning(err + ' Using the default index pattern: "' + loaded.id + '"');
}
return loaded;
}
可以通過搜索resolveIndexPatternLoading
查看一下代碼的上下文,這裏就不展開了。
這個修改只對discover頁面有效,其他頁面直接依賴了事先創建好的search
,URL中沒辦法指定index pattern
,所以沒辦法實現index pattern
動態化,如果有辦法歡迎指出。