Dunno riemann but I would say that you need a closure here,
not an immediate call to notify. The closure will be called when expiration is 
reached.

So use #(notify ...) instead.

In your current code notify gets called, return a lazy seq (for....) and then 
the lazy seq is called as a function when the service expires. Oups...

Second thing, use doseq, not for if you want the side effects do be done in
your notify fn. for will not get your side effects done, it only returns a lazy 
seq.

Luc P.

Sent from my iPad

> On May 8, 2015, at 08:01, Alexey Astafyev <av.astaf...@gmail.com> wrote:
> 
> I'm new to Riemann and Clojure. All I want to do is to send email 
> notifications to three email groups when some service's TTL is expired. I 
> created some sort of config file where I store a list of emails:
> 
> {
>   :email_group_1 (
>                   "fi...@example.com"
>                   "sec...@example.ru"
>                  )
>   :email_group_2 (
>                   "th...@example.com"
>                  )
> }
> 
> My riemann config looks like this:
> 
> (logging/init {:console true})
> (import org.apache.log4j.Level)
> (logging/set-level Level/DEBUG)
> 
> (require '[clojure.java.io :as io])
> (import '[java.io PushbackReader])
> 
> (let [host "0.0.0.0"]
>   (tcp-server {:host host :port 60001})
>   (udp-server {:host host})
>   (ws-server  {:host host :port 60003}))
> (repl-server  {:host "127.0.0.1"})
> 
> (def cwd (System/getProperty "user.dir"))
> 
> (def emails
>   (with-open [r (io/reader (str cwd "/etc/emails.clj"))]
>              (read (PushbackReader. r))))
> 
> (periodically-expire 5)
> 
> (def email (mailer))
> 
> (defn notify [& egroups]
>   (for [egroup egroups]
>     (rollup 1 60 (apply email (emails egroup)))))
> 
> (let [index (index)]
>   (streams
>     (default :ttl 60
>       index
> 
>       (expired
>           (where (service "service_connect_active")
>                     #(info "expired" %)
>                     (notify :email_group_1 :email_group_2))))))
> 
> Code looks good (for me), but when this service is expired I get the 
> following error:
> 
> 09:45:39 riemann.1      | INFO [2015-05-08 10:45:39,313] Thread-5 - 
> riemann.config - expired {:ttl 60, :time 357766884827/250, :state expired, 
> :service service_connect_active, :host ava.local}
> 09:45:39 riemann.1      | WARN [2015-05-08 10:45:39,319] Thread-5 - 
> riemann.config - clojure.lang.LazySeq@841649b8 threw
> 09:45:39 riemann.1      | java.lang.ClassCastException: clojure.lang.LazySeq 
> cannot be cast to clojure.lang.IFn
> 09:45:39 riemann.1      |   at 
> riemann.config$eval66$stream__70$fn__75.invoke(riemann.development.config:34)
> 09:45:39 riemann.1      |   at 
> riemann.config$eval66$stream__70.invoke(riemann.development.config:45)
> 09:45:39 riemann.1      |   at 
> riemann.streams$match$stream__3514$fn__3525.invoke(streams.clj:1209)
> 09:45:39 riemann.1      |   at 
> riemann.streams$match$stream__3514.invoke(streams.clj:1209)
> 09:45:39 riemann.1      |   at 
> riemann.streams$default$stream__3731$fn__3742.invoke(streams.clj:1328)
> 09:45:39 riemann.1      |   at 
> riemann.streams$default$stream__3731.invoke(streams.clj:1328)
> 09:45:39 riemann.1      |   at 
> riemann.core$stream_BANG_$fn__4415.invoke(core.clj:19)
> 09:45:39 riemann.1      |   at riemann.core$stream_BANG_.invoke(core.clj:18)
> 09:45:39 riemann.1      |   at 
> riemann.core$reaper$worker__4529$fn__4539.invoke(core.clj:303)
> 09:45:39 riemann.1      |   at 
> riemann.core$reaper$worker__4529.invoke(core.clj:297)
> 09:45:39 riemann.1      |   at 
> riemann.service.ThreadService$thread_service_runner__1973$fn__1974.invoke(service.clj:71)
> 09:45:39 riemann.1      |   at 
> riemann.service.ThreadService$thread_service_runner__1973.invoke(service.clj:70)
> 09:45:39 riemann.1      |   at clojure.lang.AFn.run(AFn.java:22)
> 09:45:39 riemann.1      |   at java.lang.Thread.run(Thread.java:745)
> 
> Could someone please help me? Thanks.
> -- 
> You received this message because you are subscribed to the Google
> Groups "Clojure" group.
> To post to this group, send email to clojure@googlegroups.com
> Note that posts from new members are moderated - please be patient with your 
> first post.
> To unsubscribe from this group, send email to
> clojure+unsubscr...@googlegroups.com
> For more options, visit this group at
> http://groups.google.com/group/clojure?hl=en
> --- 
> You received this message because you are subscribed to the Google Groups 
> "Clojure" group.
> To unsubscribe from this group and stop receiving emails from it, send an 
> email to clojure+unsubscr...@googlegroups.com.
> For more options, visit https://groups.google.com/d/optout.

-- 
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to clojure@googlegroups.com
Note that posts from new members are moderated - please be patient with your 
first post.
To unsubscribe from this group, send email to
clojure+unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en
--- 
You received this message because you are subscribed to the Google Groups 
"Clojure" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to clojure+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to