Joh*_*ost 7 aggregation elasticsearch 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.
提前感谢任何想法或建议.
既然您愿意使用 Logstash,那么有一种方法可以使用aggregate过滤器来做到这一点
请注意,这是一个社区插件,需要先安装。(即默认情况下它不随 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 {
...
}
}
Run Code Online (Sandbox Code Playgroud)
请注意,您可以调整该timeout值(此处为 120 秒)以更好地满足您的需求。当超时已过并且尚未发生停止事件时,现有的开始事件将被丢弃。
| 归档时间: |
|
| 查看次数: |
244 次 |
| 最近记录: |