Как очистить индекс Римана при получении определенного события?

Я пишу модульные тесты для приложения, которое отправляет события Риману. Риман запускается очень медленно, поэтому я решил запустить его один раз и повторно использовать экземпляр для всех тестов. Поэтому мне нужно очистить индекс от событий, произведенных предыдущими тестами в начале каждого нового теста.

Я пытаюсь настроить Римана таким образом, чтобы при получении специального события он очищал свой индекс. Существует вызов API, который, кажется, подходит для этой задачи: http://riemann.io/api/riemann.index.html. Но я не очень знаком с 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

2 ответа

Решение

Вместо этого пытаясь оценить (riemann.index/clear (:index @core)) немедленно мне нужна функция, которая будет вызываться при поступлении события:

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

Теперь все работает.

Не специалист по Риману, могу только догадываться. Первый фрагмент кажется правильным, но, вероятно, к тому времени, когда вы вызываете этот код, индекс еще не был связан в ядре? В этом случае вы могли бы просто реализовать Index протокол для nil значение, так что ничего не будет делать, когда :index значение nil, Нечто подобное (не проверено):

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

надеюсь, что это будет полезно.

Другие вопросы по тегам