Как очистить индекс Римана при получении определенного события?
Я пишу модульные тесты для приложения, которое отправляет события Риману. Риман запускается очень медленно, поэтому я решил запустить его один раз и повторно использовать экземпляр для всех тестов. Поэтому мне нужно очистить индекс от событий, произведенных предыдущими тестами в начале каждого нового теста.
Я пытаюсь настроить Римана таким образом, чтобы при получении специального события он очищал свой индекс. Существует вызов 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 [_ _ _]))
надеюсь, что это будет полезно.