Kibana4動態指定index pattern

先說一下業務場景:本人當前做的這個項目會收集公司所有應用的日誌,日誌存儲在ES中,只保留N天,不同應用的日誌會存儲在不同的index中並且index按天拆分。提供了界面讓應用的開發人員查看自己應用的日誌,後續還會有新的應用加入。

想要做到什麼樣呢?
管理界面上嵌入kibana的頁面,選擇不同應用,查看不同應用的日誌,但是kibana的查詢參數不會出現類似於appName:xxx這樣的字段,也就是說不用應用之間的參數差異對於開發人員是不可見的,想要做到對開發人員透明這就需要在查詢的時候根據appName動態的指定index(不同應用查詢不同的index)。

在Kibana4中取消了對於模板和腳本的支持,使得沒辦法在查詢的時候指定使用的index(kibana3中可以使用模板做到這一點)。然而在Kibana4中增加了index patternindex pattern被用來限定查詢的index範圍,舉例來說如果你的search使用的index patternlogstash-*,那麼使用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動態化,如果有辦法歡迎指出。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章