ALerting в Римане?

Я использую стек 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}"
    }
}

Таким образом, значения пользователей будут такими: 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 "[email protected]")       
     ))))))))

Я новичок в Riemann и clojure. Любая помощь приветствуется.


person Siddharth Trikha    schedule 30.06.2014    source источник


Ответы (1)


email возвращает поток. Поэтому, чтобы он работал, вы должны либо использовать его как поток, передав в качестве параметра другому потоку, либо использовать call-rescue для отправки события в него напрямую. Кроме того, потоки, предназначенные для получения событий из нескольких источников (например, из пункта назначения предупреждений), следует создавать один раз и сохранять в переменной для повторного использования.

Первый подход, использующий только абстрактные потоки:

(let [alert (email "[email protected]")]
  (streams
    (where (service "logins")
      (by :unique_user
        (moving-time-window 3600
          (smap folds/count
            (where (> metric 3) alert)))))))

Второй подход с использованием call-rescue:

(let [alert (email "[email protected]")]
  (streams
    (where (service "logins")
      (by :unique_user
        (moving-time-window 3600
          (fn [events]
            (when (> (count events) 3)
              (call-rescue (last events) alert))))))))
person danielkza    schedule 16.01.2017