昨天和朋友聊天,说监控报表的话题,他们认为 kibana 的仪表板形式,还是偏重技术人员做监控的 screen 思路,对 erp 之类的报表不是很友好。要想跟其他系统结合,或者说嵌入到其他系统中,就必须得有单个图表的导出,或者 URL 引用方式。当时我直觉上的反应,就是这个没问题,可以通过 javascript 动态仪表板这个高级功能完成。回来试了一下,比我想的稍微复杂一点点,还是可以很轻松完成的。

读过仪表板纲要一文,或者自己看过源代码中 src/app/dashboards/logstash.json 文件的人,应该都知道 kibana 中有些在页面配置界面里看不到的隐藏配置选项。其中很符合我们这次需求的,就有 editable, collapsable 等。所以,首先第一步,我们可以在自己的 panel.js(直接从 logstash.js 复制过来) 中,把这些关掉:

dashboard.rows = [
  {
    editable: false,         //不显示每行的编辑按钮
    collapsable: false,      //不显示每行的折叠按钮
    title: "Events",
    height: "400px",
    panels = [{
      editable: false,       //不显示面板的编辑按钮
      title: 'events over time',
      type: 'histogram',
      time_field: ARGS.timefield||"@timestamp",
      auto_int: true,
      span: 12
    }]
  }
];
dashboard.editable = false;     //不显示仪表板的编辑按钮
dashboard.panel_hints = false;  //不显示面板的添加按钮

然后要解决面板上方的 query 框和 filtering 框。这个同样在纲要介绍里说了,这两个特殊的面板是放在垂幕(pulldows)里的。所以,直接关掉垂幕就好了:

dashboard.pulldowns = [];

然后再往上是顶部栏。顶部栏里有时间选择器,这个跟垂幕一样是可以关掉的:

dashboard.nav = [];

好了,javascript 里可以关掉的,都已经关了。

但是运行起来,发现顶部栏里虽然是没有时间选择器和配置编辑按钮了,本身这个黑色条带和 logo 图什么的,却依然存在!这时候我想起来有时候 config.js 没写对,/_nodes 获取失败的时候,打开的页面就是背景色外加这个顶条 —— 也就是说,这部分代码是写在 index.html 里的,不受 app/dashboards/panel.js 控制。

所以这里就得去修改一下 index.html 了。不过为了保持兼容性,我这里没有直接删除顶部栏的代码,而是用了 angularjs 中很常用的 ng-show 指令:

<div ng-cloak class="navbar navbar-static-top" ng-show="dashboard.current.nav.length">

因为之前关闭时间选择器的时候,已经把这个 nav 数组定义为空了,所以只要判断一下数组长度即可。

效果如下:

single panel

因为 dashboard.services 的定义没有做修改,所以这个其实照样支持你用鼠标拉动选择时间范围,支持你在 URL 后面加上 ?query=status:404&from=1h 这样的参数,效果都是对的。只不过不会再让你看到这些文字显示在页面上了。

如果要求再高一点,其实完全可以在 ARGS 里处理更复杂的参数,比如直接 ?type=terms&field=host&value_field=requesttime 就生成 dashboard.rows[0].panels[0] 里的对应参数,达到自动控制图表类型和效果的目的。