接收到特定事件后如何清除黎曼指数?

How to clear up Riemann index when a specific event has been received?

我正在为向 Riemann 发送事件的应用程序编写单元测试。 Riemann 启动非常缓慢,所以我决定启动它一次并为所有测试重用该实例。因此,我需要在每次新测试开始时从以前的测试产生的事件中清除索引。

我想做的是配置 Riemann,使其在接收到特殊事件时清除其索引。有一个 API 调用似乎适合该任务:http://riemann.io/api/riemann.index.html#var-clear。 但我对 Clojure 不是很熟悉,不知道如何使用它。这是我的配置的一部分:

(streams
  index
  (where (state "clear-all")
    (riemann.index/clear (:index @core))))

但是黎曼启动失败,出现这个错误:No implementation of method: :clear of protocol: #'riemann.index/Index found for class: nil

这看起来 (:index @core) 被评估为 nil

这个也不行:

(streams
  index
  (where (state "clear-all")
    (riemann.index/clear index)))

错误是:No implementation of method: :clear of protocol: #'riemann.index/Index found for class: riemann.streams$default$stream__9829

不是黎曼专家,只能猜测。第一个片段似乎是正确的,但可能在您调用该代码时索引尚未关联到核心中?在这种情况下,您可以只为 nil 值实现 Index 协议,这样当 :index 值是 nil 时它什么都不做。类似的东西(未测试):

(extend-protocol riemann.index/Index
  nil
  (clear [_])
  (delete [_ _])
  (delete-exactly [_ _])
  (expire [_])
  (search [_ _])
  (update [_ _])
  (lookup [_ _ _]))

希望对您有所帮助。

而不是尝试立即评估 (riemann.index/clear (:index @core)) 我需要一个函数,该函数将在事件到达时调用:

(streams
  (where (state "clear-all")
    (fn [_]
      (riemann.index/clear (:index @core)))
    (else index)))

现在一切正常。