2015-08-25 3 views
1

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

(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]")) 
    .... 

) 

кроме того, в нем отсутствует заявление по умолчанию, что-то вроде , если ничего не соответствует, скажите-OPS «[email protected]»

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

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

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

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

ответ

1

Я не много знаю о Римане, но я думаю, что вы можете решить свою проблему, используя стандартные инструменты обработки данных Clojure. Мне нравится ваше представление о структуре верхнего уровня для политик предупреждений. В конце я бы добавил политику catch-all для обработки случая по умолчанию. Изменение вашего кода немного, чтобы сделать его менее Риман конкретно:

(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"}}
+0

Спасибо, я дам ему попробовать и опубликовать результаты здесь! –

Смежные вопросы