У меня есть следующая функция, которая получает карту с именем службы и порогом. Он проверяет, пересекла ли служба определенный порог, а затем вызывает несколько нижестоящих дочерних элементов для события.
(defn tc
[s & children]
(where
(and (service (:service_name s)) (not (expired? event)))
(by [:host :service]
(where (> metric (:threshold s)
(with :state "critical"
(apply sdo children)))))))
Я хотел бы динамически построить поток, используя вектор карт:
(def services [{:service "cpu/usage" :threshold 90}
{:service "memory/usage" :threshold 90}])
При попытке запустить его в потоке я получаю следующее предупреждение:
(streams
(doseq [s services] (tc s prn)))
WARN [2015-01-05 14:27:07,187] Thread-15 - riemann.core - instrumentation service caught
java.lang.NullPointerException
at riemann.core$stream_BANG_$fn__11140.invoke(core.clj:19)
at riemann.core$stream_BANG_.invoke(core.clj:18)
at riemann.core$instrumentation_service$measure__11149.invoke(core.clj:57)
at riemann.service.ThreadService$thread_service_runner__8782$fn__8783.invoke(service.clj:66)
at riemann.service.ThreadService$thread_service_runner__8782.invoke(service.clj:65)
at clojure.lang.AFn.run(AFn.java:22)
at java.lang.Thread.run(Thread.java:701)
Это работает, если я запускаю функцию потоков внутри дозы. Этот работает и дает следующий результат:
(doseq [s services]
(streams (tc s prn)))
#riemann.codec.Event{:host "testhost", :service "memory/usage", :state "critical", :description nil, :metric 91.0, :tags nil, :time 1420460856, :ttl 60.0}
(with :service "everything" ... process combined stream here ..)
объединил бы все в одну услугу - person Arthur Ulfeldt   schedule 06.01.2015