Kibana:如何在 Canvas 中动态地显示时间

在使用 Canvas 的时候,我们有时希望去动态显示事件发生的时间。我们希望用我们想要的方式来显示这个时间。那么我们该如何实现呢?

 

准备数据

在今天的实验中,我们用一个很简单的数据来进行展示:

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

PUT bulbs/_doc/1?pipeline=add-timestamp
{
  "id": 1,
  "status": 1
}

我们在 Kibana 中依次执行上面的指令,我们就可以得到一个如下的事件:

GET bulbs/_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" : "bulbs",
        "_type" : "_doc",
        "_id" : "1",
        "_score" : 1.0,
        "_source" : {
          "@timestamp" : "2020-11-19T02:33:58.419587Z",
          "id" : 1,
          "status" : 1
        }
      }
    ]
  }
}

在上面,我们把当前的时间写入到事件中。如果你不知道是如何工作的,请参阅我之前的文章 “Elasticsearch:如何在写入文档时加上 now 时间标签”。上面的命令生成一个叫做 bulbs 的索引。在实际的物联网应用中,这可能是一个灯开的时间,或者是一个物体移动的时间。这可能是每隔几分钟才发生的一个事件。我们需要在 Canvas 中标明事件的时间。

 

在 Canvas 中展示时间

我们接下来在 Canvas 中动态地来展示上面的这个事件的时间:

我们使用一个 Markdown 来展示时间:

 

我们把如下的代码拷贝并粘贴到编辑器中:

filters
| essql
  query="SELECT LAST(\"@timestamp\") + INTERVAL '2' HOUR AS \"Event Time\" FROM \"bulbs\" WHERE id = '1'"
| markdown 
  {getCell | formatdate 'HH:mm:ss'}
| render

我们点击 Run 按钮,那在上面的 Markdown 中,我们可以看到显示的时间。这个时间实践上是时间的最后一个值,也就是最近的一个时间。如果我们重新去运行之前的命令的话,并点击 Run,那么我可以看到最新的时间显示值。值得指出的是:

当我们把鼠标放置于 formatdate 的位置时,我们可以看出来一个链家。里面有详细介绍如何格式化这个时间。我们点击上面的 Close 按钮:

显然上面的字体太小,展示的并不好看。我们点击右鼠标键:

在右边可以清楚地看到这个时间显示的 CSS  配置。为此,我们更新上面的代码为:

filters
| essql
  query="SELECT LAST(\"@timestamp\") + INTERVAL '2' HOUR AS \"Event Time\" FROM \"bulbs\" WHERE id = '1'"
| markdown 
  {getCell | formatdate 'HH:mm:ss'}
| render
css=".canvasMarkdown p{
  font-size: 50px;
}"

在上面,我们添加了 ccs 代码部分。它可以帮我们定义字体的大小。我们设置这个字体为 50px:

重新点击 Run 按钮。这个时候,我们可以看到时间显示的字体变大了。

最终的显示结果为: