我们在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。
提前感谢任何想法或建议。
答案 0 :(得分:2)
由于您已开放使用Logstash,因此可以使用aggregate
filter
请注意,这是一个需要先安装的社区插件。 (即默认情况下它没有附带Logstash)
aggregate
过滤器的主要思想是合并两个"相关的"日志行。您可以配置插件,以便它知道"相关的"手段。在你的情况下,"相关"表示两个事件必须共享相同的object
名称(即one
或two
),然后第一个事件的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秒)以更好地满足您的需求。当超时已经过去且尚未发生停止事件时,将丢弃现有的启动事件。