为黎曼事件注入新领域
Injecting new field to riemann event
我可能不理解 riemann/clojure 中的一些关键概念。
我正在尝试从格式为 "aaa:1234.bbbb.cccc.ddddd"
的事件中解析字段 :service,并使用函数 "with" 将新字段 pid 添加到事件中。
任何人都可以向我解释为什么 riemann.config
中的这段代码抛出异常:
...
(let [index (default :ttl 300 (update-index (index)))]
; Inbound events will be passed to these streams:
(streams
index
(where (service #"(\w+):(\d+)\.(\w+)\.(\w+)\.(\w+)")
(with :pid (str/replace service #"(\w+):(\d+)\.(\w+)\.(\w+)\.(\w+)" "")
)
)
...
user=> (riemann.bin/reload!)
#error {
:cause "Unable to resolve symbol: service in this context"
:via
[{:type clojure.lang.Compiler$CompilerException
:message "java.lang.RuntimeException: Unable to resolve symbol: service in this context, compiling:(/etc/riemann/riemann.config:73:19)"
我猜 (where (service ,,,))
只是 where
宏对 (where* (fn [event] (let [service (:service event)] ,,,)))
的语法糖,这就是为什么你不能在 [= 的正文中使用 service
12=]:它不是那里定义的名称。
查看 documentation 的 with,在我看来你应该使用 smap
:
(where (service #"(\w+):(\d+)\.(\w+)\.(\w+)\.(\w+)")
(smap (fn [e] (assoc e :pid (str/replace (:service e) #"(\w+):(\d+)\.(\w+)\.(\w+)\.(\w+)" "")))))
我可能不理解 riemann/clojure 中的一些关键概念。
我正在尝试从格式为 "aaa:1234.bbbb.cccc.ddddd"
的事件中解析字段 :service,并使用函数 "with" 将新字段 pid 添加到事件中。
任何人都可以向我解释为什么 riemann.config
中的这段代码抛出异常:
...
(let [index (default :ttl 300 (update-index (index)))]
; Inbound events will be passed to these streams:
(streams
index
(where (service #"(\w+):(\d+)\.(\w+)\.(\w+)\.(\w+)")
(with :pid (str/replace service #"(\w+):(\d+)\.(\w+)\.(\w+)\.(\w+)" "")
)
)
...
user=> (riemann.bin/reload!)
#error {
:cause "Unable to resolve symbol: service in this context"
:via
[{:type clojure.lang.Compiler$CompilerException
:message "java.lang.RuntimeException: Unable to resolve symbol: service in this context, compiling:(/etc/riemann/riemann.config:73:19)"
我猜 (where (service ,,,))
只是 where
宏对 (where* (fn [event] (let [service (:service event)] ,,,)))
的语法糖,这就是为什么你不能在 [= 的正文中使用 service
12=]:它不是那里定义的名称。
查看 documentation 的 with,在我看来你应该使用 smap
:
(where (service #"(\w+):(\d+)\.(\w+)\.(\w+)\.(\w+)")
(smap (fn [e] (assoc e :pid (str/replace (:service e) #"(\w+):(\d+)\.(\w+)\.(\w+)\.(\w+)" "")))))