在黎曼?

时间:2014-06-30 11:05:27

标签: clojure monitoring logstash riemann

我正在使用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.sh

Logstash:

riemann {
    riemann_event => {
        "service"     => "logins"
        "unique_user" => "%{user}"
    }
}

所以用户的价值观将是:root,sid,abc,root,sid,def等......

因此,我按用户分割流,即为每个唯一用户分配一个流。现在,我想在单个用户数超过3时发出警告。我写了以下内容但 达到了我的目的。

黎曼:

(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")       
     ))))))))

我是Riemann和clojure的新手。任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:1)

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))))))))