我使用ELK (logstash,ES,Kibana)栈进行日志分析,使用Riemann进行警报。我有日志,用户是由logstash解析的字段之一,我从riemann输出插件将事件发送给riemann。
Logstash解析日志和用户是字段之一。原木解析
Timestamp user command-name
2014-06-07... root sh ./scripts/abc.sh
2014-06-08... sid sh ./scripts/xyz.sh
2014-06-08... abc sh ./scripts/xyz.sh
2014-06-09... root sh ./scripts/xyz.shLogstash:
riemann {
riemann_event => {
"service" => "logins"
"unique_user" => "%{user}"
}
}因此用户的值将是: root、sid、abc、root、sid、def等等。
因此,我按用户分割流,即为每个唯一用户分配一个流。现在,当唯一的用户数超过3时,我想提醒您。我写了以下内容,但这是而不是实现了我的目标。
Riemann:
(streams
(where (service "logins")
(by :unique_user
(moving-time-window 3600
(smap (fn [events]
(let
[users (count events)]
(if (> users 3)
(email "abc@gmail.com")
))))))))我是黎曼和克洛尔的新手。任何帮助都是非常感谢的。
发布于 2017-01-16 20:39:38
email返回一个流。因此,要使其工作,必须将其作为流使用,将其作为参数传递给另一个流,或者使用call-rescue直接向其发送事件。此外,用于接收来自多个源的事件的流(例如您的警报目的地)应该创建一次,并存储在一个变量中以供重用。
第一种方法,只使用抽象流:
(let [alert (email "abc@gmail.com")]
(streams
(where (service "logins")
(by :unique_user
(moving-time-window 3600
(smap folds/count
(where (> metric 3) alert)))))))第二种方法,使用call-rescue
(let [alert (email "abc@gmail.com")]
(streams
(where (service "logins")
(by :unique_user
(moving-time-window 3600
(fn [events]
(when (> (count events) 3)
(call-rescue (last events) alert))))))))https://stackoverflow.com/questions/24488715
复制相似问题