特定の条件が満たされた場合にメールを送信するための 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 "XXXXX@gmail.com"))prn)))))
リーマンサーバーのO/P
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 "XXXXX@gmail.com"))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 "XXXXX@gmail.com"))))prn))))