如何创建时间戳增量的直方图?

时间:2016-02-09 19:28:22

标签: elasticsearch aggregation kibana

我们在ES中存储小文档,表示对象的事件序列。每个活动都有一个日期/时间戳。我们需要分析一段时间内所有对象的事件之间的时间。

例如,想象一下这些事件的json文档:

{“object”:“one”,“event”:“start”,“datetime”:“2016-02-09 11:23:01”}

{“object”:“one”,“event”:“stop”,“datetime”:“2016-02-09 11:25:01”}

{“object”:“two”,“event”:“start”,“datetime”:“2016-01-02 11:23:01”}

{“object”:“two”,“event”:“stop”,“datetime”:“2016-01-02 11:24:01”}

我们想要摆脱的是直方图,绘制两个结果时间戳增量(从开始到停止):对象1为2分钟/ 120秒,对象2为1分钟/ 60秒。

最终,我们希望监控启动和停止事件之间的时间,但它要求我们计算这些事件之间的时间,然后将它们聚合或提供给Kibana UI进行聚合/绘制。理想情况下,我们希望将结果直接提供给Kibana,这样我们就可以避免创建任何自定义UI。

提前感谢任何想法或建议。

1 个答案:

答案 0 :(得分:2)

由于您已开放使用Logstash,因此可以使用aggregate filter

进行操作

请注意,这是一个需要先安装的社区插件。 (即默认情况下它没有附带Logstash)

aggregate过滤器的主要思想是合并两个"相关的"日志行。您可以配置插件,以便它知道"相关的"手段。在你的情况下,"相关"表示两个事件必须共享相同的object名称(即onetwo),然后第一个事件的event字段的start值为event第二个事件的stop字段的值为start

当过滤器遇到datetime事件时,它会将该事件的stop字段存储在内部地图中。当遇到duration事件时,它会计算两个日期时间之间的时差,并将持续时间(以秒为单位)存储在新的input { ... } filter { ...other filters if [event] == "start" { aggregate { task_id => "%{object}" code => "map['start'] = event['datetime']" map_action => "create" } } else if [event] == "stop" { aggregate { task_id => "%{object}" code => "map['duration'] = event['datetime'] - map['start']" end_of_task => true timeout => 120 } } } output { elasticsearch { ... } } 字段中。

timeout

请注意,您可以调整{{1}}值(此处为120秒)以更好地满足您的需求。当超时已经过去且尚未发生停止事件时,将丢弃现有的启动事件。