Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Clojure 在黎曼警觉?_Clojure_Monitoring_Logstash_Riemann - Fatal编程技术网

Clojure 在黎曼警觉?

Clojure 在黎曼警觉?,clojure,monitoring,logstash,riemann,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... s

我使用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
日志存储:

riemann {
    riemann_event => {
        "service"     => "logins"
        "unique_user" => "%{user}"
    }
}
(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")       
     ))))))))
因此,用户值将类似于:root、sid、abc、root、sid、def等

所以我按用户分割流,即每个唯一的用户一个流。现在,我想在唯一用户数超过3时发出警报。我写了以下内容,但它没有达到我的目的

Riemann:

riemann {
    riemann_event => {
        "service"     => "logins"
        "unique_user" => "%{user}"
    }
}
(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不熟悉。感谢您的帮助。

电子邮件
返回一条流。因此,要使其工作,必须将其用作流,将其作为参数传递给另一个流,或者使用
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)))))))
第二种方法,使用
呼叫救援

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