Kibana:构建自定义 kibana 可视化,推动更深入的洞察

2022年2月24日   |   by mebius

截止目前为止 Kibana 已经提供了丰富的可视化工具让我们对数据进行可视化。从 Kibana 的发展史中可以看出来 Kibana 在可视化路径中的演化:

%title插图%num

特别是最近推出的 Lens。它把创建可视化的门槛降到了极低的一个程度。它使很多不懂得 Kibana 操作的人也可以顺利地创建自己喜欢的可视化:

%title插图%num

如果你想对 Kibana 的可视化有更多的了解,请参阅我的 “Kibana 专栏”。如果你是 Kibana 的初学者,那么请阅读我之前的系列文章:

里面有详细的步骤介绍如何运用 Lens 来创建令人激动的可视化图。

对于一些高级的开发者来说,现有的可视化工具在某些情况下可能无法满足你的要求。特别地,我们知道 Kibana 针对 join 或者 nested 数据类型非常不友好。我们甚至没有好的开箱即用的可视化工具来针对这些数据进行可视化。在今天的文章中,我将介绍如何使用 Vega 来针对这样的数据进行可视化。

如果你对 Vega 还是不甚了解的话,那么请阅读我之前的文章 “Kibana:Vega 可视化入门 – 定制自己的可视化图”。它详细地介绍了如何从零基础来创建一个 Vega 的可视化图。更重要的是,通过 Vega 制作的定制可视化图,也也可以变成 Dashboard 的一部分。

在今天的展示中,我将使用最新的 Elastic Stack 8.0 来进行展示。

我们首先来创建一个如下的含有 nested 数据类型的索引:

PUT products
{
  "mappings": {
    "properties": {
      "resellers": {
        "type": "nested",
        "properties": {
 tgcode         "reseller": {
            "type": "text"
          },
          "price": {
            "type": "double"
          },
          "rtype": {
            "type": "keyword"
          }
        }
      }
    }
  }
}

如果大家对 nested 数据类型不是很熟的话,请参阅之前的文章 “Elasticsearch: nested 对象”。

接下来,我们创建如下的两个文档:

PUT products/_doc/0
{
  "name": "LED TV",
  "resellers": [
    {
      "reseller": "companyA",
      "price": 350,
      "rtype": "X"
    },
    {
      "reseller": "companyB",
      "price": 600,
      "rtype": "Y"
    },
    {
      "reseller": "companyC",
      "price": "250",
      "rtype": "Z"
    },
    {
      "reseller": "companyD",
      "price": 500,
      "rtype": "Y"
    }
  ]
}


PUT products/_doc/1
{
  "name": "LCD TV",
  "resellers": [
    {
      "reseller": "companyE",
      "price": 150,
      "rtype": "X"
    },
    {
      "reseller": "companyF",
      "price": 500,
      "rtype": "Y"
    },
    {
      "reseller": "companyG",
      "price": 550,
      "rtype": "X"
    },
    {
      "reseller": "companyH",
      "price": 300,
      "rtype": "X"
    }
  ]
}

现在我们的问题是想针对 rtype 进行统计。我们想知道各个 rtype 的平均价钱是多少。我们使用如下tgcode的命令来进行统计:

GET products/_search
{
  "size": 0,
  "aggs": {
    "resellers": {
      "nested": {
        "path": "resellers"
      },
      "aggs": {
        "_termaggs": {
          "terms": {
            "field": "resellers.rtype",
            "size": 10
          },
          "aggs": {
            "_avgaggs": {
              "avg": {
                "field": "resellers.price"
              }
            }
          }
        }
      }
    }
  }
}

上面命令运行的结果是:

%title插图%num

在上面的左边,我们可以看到查询的 body 的定义。在右边,它清楚地显示了查询结果所在的路径。我们可以看到各个 rtype 的数量及其平均价格。那么我们该如何通过 Vega 的形式来针对这个结果进行可视化呢?由于目前 Kibana 并不支持针对 nested 数据类型的可视化,我们需要使用 Vega 来对它进行可视化:

%title插图%num

%title插图%num

%title插图%num

%title插图%num

我们在右边的窗口粘贴如下的代码:

{
  $schema: "https://vega.github.io/schema/vega-lite/v5.json"
  title: "Reseller Type vs Average Prices"

  data: {
    url: {
      index: "products"
      body: {
      
        "size": 0,
        "aggs": {
          "resellers": {
            "nested": {
              "path": "resellers"
            },
            "aggs": {
              "_termaggs": {
                "terms": {
                  "field": "resellers.rtype",
                  "size": 10
                },
                "aggs": {
                  "_avgaggs": {
                    "avg": {
                      "field": "resellers.price"
                    }
                  }
                }
              }
            }
          }
        }
  
      }
    }

    format: { property: "aggregations.resellers._termaggs.buckets" }
  }


  mark: bar

  encoding: {
    x: {
      bin: false
      field: "key"
      type: "nominal"
      axis: {title: "Reseller Type", labelAngle:0 }
    }
    y: {
      field: "_avgaggs.value"
      type: quantitative
      axis: {title: "Average Prices"}
    }
  }
}

理解上面的代码应该不是很难。在 body 的部分,我们填入了查询的 body。我们在 format 中定义了获取查询结果的路径。在下面的部分,我们使用 bar 来进行可视化展示。在 encoding 部分针对 x 及 y 轴进行了配置。点击上面的 Update 按钮:

%title插图%num

我们在左边看到了这个数据的可视化结果。我们点击 Save 按钮:

%title插图%num

在上面,我们创建一个崭新的 Dashboard 以保持当前的可视化:

%title插图%num

如上所示,我们已经成功地把创建的定制可视化嵌入到一个 Dashboard 中。

在实际的使用中,我们可以根据自己的需求充分运用 Vega 带给我们的强大的可视化能力来定制我们任何所需要的可视化。

文章来源于互联网:Kibana:构建自定义 kibana 可视化,推动更深入的洞察

相关推荐: 使用 Elastic Stack 来分析奥运数据(二)

这是我的上一篇文章 “使用 Elastic Stack 来分析奥运数据(一)” 的续篇。在上一篇文章中,我详细介绍了如何把数据上传到 Elasticsearch 中。在今天的这篇文章中,我将着重来讲述如何实现针对这个 olympic 索引进行可视化。 可视化奥…

Tags: , ,