elastic中巧用script field和plainless进行可视化的格式修改

问题描述

在使用kibana做可视化的时候,总是避免不了因为数据的格式或者长度的问题导致显示异常,比如,我这里做了一个词云,用于显示最常出问题的模块:
elastic中巧用script field和plainless进行可视化的格式修改_第1张图片
模块的值是从标准日志里面提取出来的。一些超长的模块名,导致UI无法完全显示:
elastic中巧用script field和plainless进行可视化的格式修改_第2张图片
类似的,在做数据展示的时候,你总会碰到某些场景,要求你对数据做一些格式化的操作才能符合需求

其中一种解决方案是:我们可以在数据落地的时候就对数据进行额外的操作,将数据转换为我们希望的格式。

但这种方案并不灵活和经济:

  • 如果数据已落地,则无法修改
  • 如果需要保留数据,则需要额外的字段去存储格式化的数据

script field

针对以上的场景,elasticsearch很贴心的为我们设计了script field。script field有一些很重要的特性:

  • 平时并不存在,不占存储空间,属于运行时属性
  • 在搜索和聚合的时候可以看到script field

因为所有的可视化场景都是对应的搜索和聚合的操作,script field就很方便的为我们提供了额外的数据格式化的机会。

在之前的例子中,词云来自于以下数据:

{
    "host.threadCount": 20,
    "service": [
      "PLS-CORE"
    ],
    "timestamp": [
      "2019-03-21T00:00:00.000Z"
    ],
    "host.logCount": 5837,
    "host.errorCount": 5574,
    "top5Instance": [
      "stderr",
      "com.ebao.foundation.module.tag.i18n.lang.CodeTable",
      "com.ebao.pub.fms.ratetable.tree.Tree",
      "com.ebao.foundation.module.tag.text.FormatValueTag",
      "com.ebao.foundation.module.audit.Audit"
    ],
    "host.ipAddress": "10.50.11.57"
  },
  "fields": {
    "timestamp": [
      "2019-03-21T00:00:00.000Z"
    ]
  }

我们会对top5Instancefield进行terms聚合。每一个值会作为一个term作为一个向量出现在UI当中。但实际上,前面的包名com.ebao并没有太多的意义,我们希望在显示的时候截取。但是我们又不想将截取后的值存在elasticsearch当中,这时,我们就可以采用script field,制造一个top5Instance.short的field,专门用于可视化。注意,这个top5Instance.short field,只会在我执行查询或聚合操作的时候,才会动态的运算出来。

操作


从上面的动图,我们可以看到,很轻松的,我们就添加了一个script field

elastic中巧用script field和plainless进行可视化的格式修改_第3张图片
同时这个新的值可以在可视化中使用。

script

要生成script field,需要用脚本,目前es官方推荐的是expression和painless。expression的运行速度是要比painless快的,但是却不支持对字符串的操作,所以,如果你要做的转换只是针对number或date的,可以使用expression,但如果涉及到String,就需要用painless。
elastic中巧用script field和plainless进行可视化的格式修改_第4张图片

上例的脚本:

String[] total = new String[doc['top5Instance.keyword'].length];
          for (int  i = 0; i < doc['top5Instance.keyword'].length; ++i) {
            int p = doc['top5Instance.keyword'][i].lastIndexOf('.');
            p = p == -1 ? 0 : p;
            total[i] = doc['top5Instance.keyword'][i].substring(p);
          }
return total;

关于painless的更多教程,可以查看我之前的博客:
elasticsearch painless最强教程
elasticsearch painless最强教程 二

json input

kibana的可视化上支持直接输入script,你不需要生成一个script即可对可视化数据进行额外的变更,这是通过JSON input进行操作的:

elastic中巧用script field和plainless进行可视化的格式修改_第5张图片

注意,JSON input只支持number或date类型的数据

你可能感兴趣的:(ELK,点火三周的Elastic,Stack专栏)