Нужна помощь в оптимизации оператора clojure

Я новичок в clojure, и мне нужно настроить конфигурацию riemann, чтобы можно было легко редактировать/добавлять новые условия . Что мы имеем сейчас:

(defn tell-ops 
([to]
    (by [:service]
        (throttle 3 360
            (rollup 2 360
                slackerDefault
                (email to)))))
([to channel]
    (by [:service]
        (throttle 3 360
            (rollup 2 360
                (slacker channel)
                (email to))))))

    ............

(where (state "FATAL")
    (where (service #"^Serv1")
            (tell-ops "[email protected]" "#dev-ops1"))

    (where (service #"^Serv2")
            (tell-ops "[email protected]"))
   ....

)

кроме того, в нем отсутствует оператор по умолчанию, что-то вроде, если ничего не совпадает, Tell-Ops "[email protected]"

Я думаю, мне нужно что-то вроде структуры верхнего уровня

(def services 
 [{:regex #"^serv1" :mail "[email protected]" :channel "#serv1"} 
  {:regex #"serv2$" :mail "[email protected]"} ])

чтобы можно было легко добавлять новые. Но я понятия не имею, как пройтись по этому массиву, учитывая отсутствие :channel во втором случае и выполнение «вызова по умолчанию», если ни одно из регулярных выражений не соответствует

заранее спасибо


person John dow    schedule 25.08.2015    source источник


Ответы (1)


Я мало что знаю о Римане, но я думаю, что вы можете решить свою проблему, используя стандартные инструменты обработки данных Clojure. Мне нравится ваша идея структуры верхнего уровня для политик предупреждений. Я бы добавил в конце всеобъемлющую политику для обработки случая по умолчанию. Немного изменив код, чтобы сделать его менее специфичным для Римана:

(defn tell-ops!
  [{:keys [mail channel]}]
  (when mail (println (str "mail = " mail)))
  (when channel (println (str "channel = " channel))))

(def policies
  [{:regex #"^serv1.*" :mail "[email protected]" :channel "#serv1"}
   {:regex #".*serv2$" :mail "[email protected]"} 
   {:regex #".*" :mail "[email protected]"}])

(defn alert!
  [policies service-in-alert]
  (-> (drop-while (fn 
                    [{:keys [regex]}] 
                    (nil? (re-matches regex service-in-alert))) 
        policies)
    first
    tell-ops!))

Некоторые примечания:

  • идиоматично использовать ! в именах функций для функций, которые производят побочные эффекты (например, отправка сообщения на канал или отправка электронной почты)
  • если вы хотите жесткое значение по умолчанию для функции tell-ops!, вы можете использовать поддержку Clojure для значений по умолчанию при деструктурировании карт: {:keys [mail channel] :or {mail "[email protected]" channel "#default-chan"}}
person jstaffans    schedule 25.08.2015
comment
Спасибо! Попробую, о результатах отпишусь здесь! - person John dow; 25.08.2015