Kibana 截图报表

Elastic Stack 本身作为一个实时数据检索聚合的系统,在定期报表方面,是有一定劣势的。因为基本上不可能把源数据长期保存在 Elasticsearch 集群中。即便保存了,为了一些已经成形的数据,再全面查询一次过久的冷数据,也是有额外消耗的。那么,对这种报表数据的需求,如何处理?其实很简单,把整个 Kibana 页面截图下来即可。

FireFox 有插件用来截全网页图。不过如果作为定期的工作,这么搞还是比较麻烦的,需要脚本化下来。这时候就可以用上 phantomjs 软件了。phantomjs 是一个基于 webkit 引擎做的 js 脚本库。可以通过 js 程序操作 webkit 浏览器引擎,实现各种浏览器功能。

phantomjs 在 Linux 平台上没有二进制分发包,所以必须源代码编译:

  1. # yum -y install gcc gcc-c++ make flex bison gperf ruby \
  2. openssl-devel freetype-devel fontconfig-devel libicu-devel sqlite-devel \
  3. libpng-devel libjpeg-devel
  4. # git clone git://github.com/ariya/phantomjs.git
  5. # cd phantomjs
  6. # git checkout 2.0
  7. # ./build.sh

想要给 kibana 页面截图,几行代码就够了。

Kibana3 截屏代码

下面是一个 Kibana3 的截屏示例。 capture-kibana.js 如下:

  1. var page = require('webpage').create();
  2. var address = 'http://kibana.example.com/#/dashboard/elasticsearch/h5_view';
  3. var output = 'kibana.png';
  4. page.viewportSize = { width: 1366, height: 600 };
  5. page.open(address, function (status) {
  6. if (status !== 'success') {
  7. console.log('Unable to load the address!');
  8. phantom.exit();
  9. } else {
  10. window.setTimeout(function () {
  11. page.render(output);
  12. phantom.exit();
  13. }, 30000);
  14. }
  15. });

然后运行 phantomjs capture-kibana.js 命令,就能得到截图生成的 kibana.png 图片了。

这里两个要点:

  1. 要设置 viewportSize 里的宽度,否则效果会变成单个 panel 依次往下排列。
  2. 要设置 setTimeout,否则在获取完 index.html 后就直接返回了,只能看到一个大白板。用 phantomjs 截取 angularjs 这类单页 MVC 框架应用时一定要设置这个。

Kibana4 的截屏开源项目

Kibana4 的 dashboard 同样可以采取上面 Kibana3 的方式自己实现。不过社区最近有人完成了一个辅助项目,把截屏配置、历史记录展示等功能都界面化了。项目地址见:https://github.com/parvez/snapshot_for_kibana

Kibana报表 - 图1