У меня есть код clojure (riemann), чтобы отправить электронное письмо, если было выполнено определенное условие. У меня возникла проблема при передаче события на сервер riemann.
Код Римана
(let [email (mailer {"......"})]
(streams
(where (service "system_log")
(by :RefNo
(smap
(fn [events]
(let [count-of-failures (count (filter #(= "Failed" (:Status %)) events))]
(assoc (first events)
:status "Failure"
:metric count-of-failures
:total-fail (>= count-of-failures 2))))
(where (and (= (:status event) "Failure")
(:total-fail event))
(email "[email protected]"))prn)))))
O/P на сервере riemann
WARN [2015-11-18 05:24:49,596] defaultEventExecutorGroup-2-2 - riemann.streams - riemann.streams$smap$stream__3695@7addde9e threw
java.lang.IllegalArgumentException: Key must be integer
at clojure.lang.APersistentVector.assoc(APersistentVector.java:335)
at clojure.lang.APersistentVector.assoc(APersistentVector.java:18)
Обновление 2:
Я просто изменил smap на sreduce. Как мне обновить, так как я новичок в этом, я немного смущен изменением кода в соответствии с вашим предложением.
(let [email (mailer {"......"})]
(streams
(where (service "system_log")
(by :RefNo
(sreduce
(fn [events]
(let [count-of-failures (count (filter #(= "Failed" (:Status %)) events))]
(assoc (first events)
:status "Failure"
:metric count-of-failures
:total-fail (>= count-of-failures 2))))
(where (and (= (:status event) "Failure")
(:total-fail event))
(email "[email protected]"))prn)))))
Обновление 3:
Я обновил свой код, используя coalesce
, а smap
имеет дочерний элемент. Теперь он не показывает никаких ошибок, но электронная почта не срабатывает. Я получаю count-of-failures
как 0
. Я предполагаю, что count function
не работает.
(let [email (mailer {"......"})]
(streams
(where (service "system_log")
(by :RefNo
(coalesce
(smap
(fn [events]
(let [count-of-failures (count (filter #(= "Failed" (:status %)) events))]
(assoc (first events)
:status "Failure"
:metric count-of-failures
:total-fail (>= count-of-failures 2))))
(where (and (= (:status event) "Failure")
(:total-fail event))
(email "[email protected]"))))prn))))