Kibana:如何在 Canvas 中动态地显示图片

在我之前的文章 “运用 Canvas 实时监控物联网设备状态并控制设备” ,我详细描述了如何实时地显示物联网设备的状态。在那篇文章中,我们也展示了如何使用 asset 来展示我们想要的图片,比如灯。在实际的使用中,我们有时可能希望能够动态地改变这些图片,比如我们正在播放的歌曲是不一样的,那么我们可以根据这个专辑里播放歌曲的曲子不同而需要动态地来改变这个图片。那么我们该如何实现这个功能呢?

如何在 Canvas 中动态地显示图片

准备数据

为了能够生成一个时序的数据,我们可以使用如下的方法:

PUT _ingest/pipeline/add-timestamp
{
  "processors": [
    {
      "set": {
        "field": "@timestamp",
        "value": "{{_ingest.timestamp}}"
      }
    }
  ]
}

我们执行上面的一个 ingest pipeline。然后在我们的 Kibana 中使用如下的命令:

PUT album/_doc/1?pipeline=add-timestamp
{
  "id": 1,
  "status": 1,
  "picture": "elasticsearch-226094.png"
}

上面的语句将为我们生成一个带有时间戳的事件,这个事件保存于 album 这个索引中,

GET album/_search
{
  "took" : 0,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 1,
      "relation" : "eq"
    },
    "max_score" : 1.0,
    "hits" : [
      {
        "_index" : "album",
        "_type" : "_doc",
        "_id" : "1",
        "_score" : 1.0,
        "_source" : {
          "@timestamp" : "2020-11-23T08:24:30.751307Z",
          "id" : 1,
          "picture" : "elasticsearch-226094.png",
          "status" : 1
        }
      }
    ]
  }
}

在上面的数据中,id 代表歌曲的编号,而里面的 picture 世界上是代表歌曲的图片。为了测试方便,我们选择 Elastic 的 logo 来做演示。

 

在 Canvas 中动态展示图片

我们打开 Kibana:

我们接着把如下的代码复制带编辑框中:

filters
| timefilter from="now-10s" to="now"
| essql 
  query="SELECT CONCAT('https://cdn.iconscout.com/icon/free/png-256/', picture) AS \"Picture\", \"@timestamp\" FROM \"album\" WHERE id = 1"
| image dataurl={getCell "Picture"}
| render

上面的代码其实蛮简单的。我们直接从 album 这个索引中通过 ES SQL 来查询 picture 字段,并和 https://cdn.iconscout.com/icon/free/png-256/ 进行连接,这样我们就得到了一个 URL。我们通过 image 来设置它的 dataurl 从而达到动态改变这个 image 的作用。

运行上面的 Run 按钮:

这样就达到修改我们的 image 的目的了。在你们进行使用的时候,千万要注意的一点就是你需要首先运行如下的命令:

PUT album/_doc/1?pipeline=add-timestamp
{
  "id": 1,
  "status": 1,
  "picture": "elasticsearch-226094.png"
}

然后在 10 秒内执行 Run,这是因为在我们的代码中含有一个时间过滤器 timefilter from="now-10s" to="now"。

如果大家想看得更清楚一些,我们可以点击 data,然后在查看 essql 获取的数据:

上面显示了 Picture 字段含有我们 image 所需要的 url。

已标记关键词 清除标记