Kibana4动态指定index pattern

来源:互联网 发布:root软件哪个成功率高 编辑:程序博客网 时间:2024/05/21 06:55

先说一下业务场景:本人当前做的这个项目会收集公司所有应用的日志,日志存储在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动态化,如果有办法欢迎指出。

0 0