【发布时间】:2015-03-03 00:15:55
【问题描述】:
我有以下函数,它获取带有服务名称和阈值的地图。它检查服务是否超过定义的阈值,然后在事件上调用多个下游子级。
(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 中运行streams 函数,它就可以工作。 这个工作并给出以下输出:
(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}
【问题讨论】:
-
这些是您的确切事件还是已被省略?
-
@ArthurUlfeldt,我不确定问题是否出在事件中。由于该功能确实有效,因此如果我使用以下代码(doseq [s services] (streams (tc s prn)))。我不想为每个服务创建一个流,而是为所有服务创建一个流。
-
(with :service "everything" ... process combined stream here ..)会将所有内容合并到一个服务中 -
@ArthurUlfeldt,我想做的是有一个地图矢量。每张地图描述一个服务和一个阈值。我想检查如果服务超过定义的阈值,则事件状态设置为“关键”。我想要做的是使用这个数据集运行流函数。