diff --git a/graphite_beacon/alerts.py b/graphite_beacon/alerts.py index 7e3738b..c04b219 100644 --- a/graphite_beacon/alerts.py +++ b/graphite_beacon/alerts.py @@ -15,6 +15,7 @@ import math from collections import deque, defaultdict from itertools import islice +from .handlers import registry LOGGER = log.gen_log @@ -106,6 +107,11 @@ def configure(self, name=None, rules=None, query=None, **options): self.rules = [parse_rule(rule) for rule in rules] self.rules = list(sorted(self.rules, key=lambda r: LEVELS.get(r.get('level'), 99))) + registry.clean() + self.handlers = {'warning':set(),'critical':set(),'normal':set()} + self.reinit_handlers('warning') + self.reinit_handlers('critical') + self.reinit_handlers('normal') assert query, "%s: Alert's query is invalid" % self.name self.query = query @@ -138,6 +144,13 @@ def configure(self, name=None, rules=None, query=None, **options): else: self.callback = ioloop.PeriodicCallback(self.load, interval) + def reinit_handlers(self, level='warning'): + if('%s_handlers' % level) in self.options: + for name in self.options['%s_handlers' % level]: + try: + self.handlers[level].add(registry.get(self.reactor,name)) + except Exception as e: + LOGGER.error('Handler "%s" did not init. Error: %s' % (name,e)) def convert(self, value): """Convert self value.""" return convert_to_format(value, self._format) diff --git a/graphite_beacon/core.py b/graphite_beacon/core.py index afd1152..b9fd849 100644 --- a/graphite_beacon/core.py +++ b/graphite_beacon/core.py @@ -137,12 +137,13 @@ def notify(self, level, alert, value, target=None, ntype=None, rule=None): """ Provide the event to the handlers. """ LOGGER.info('Notify %s:%s:%s:%s', level, alert, value, target or "") - if ntype is None: ntype = alert.source - - for handler in self.handlers.get(level, []): + for handler in alert.handlers.get(level, []): handler.notify(level, alert, value, target=target, ntype=ntype, rule=rule) + for handler in self.handlers.get(level, []): + if not alert.handlers.get(level,[]): + handler.notify(level, alert, value, target=target, ntype=ntype, rule=rule) _LOG_LEVELS = { 'DEBUG': logging.DEBUG, diff --git a/graphite_beacon/handlers/cli.py b/graphite_beacon/handlers/cli.py index daa4f03..5c78010 100644 --- a/graphite_beacon/handlers/cli.py +++ b/graphite_beacon/handlers/cli.py @@ -28,7 +28,10 @@ def getAlertName(*args): # Run only for whitelisted names if specified if not self.whitelist or getAlertName(*args) in self.whitelist: - command = substituteVariables(self.commandTemplate, level, *args, **kwargs) + try: + command=args[0].options["cli"]["command"] + except Exception as e: + command = substituteVariables(self.commandTemplate, level, *args, **kwargs) subprocess.Popen( command, shell=True, diff --git a/graphite_beacon/handlers/smtp.py b/graphite_beacon/handlers/smtp.py index be0f140..b9802f6 100644 --- a/graphite_beacon/handlers/smtp.py +++ b/graphite_beacon/handlers/smtp.py @@ -34,13 +34,21 @@ def init_handler(self): @gen.coroutine def notify(self, level, *args, **kwargs): - LOGGER.debug("Handler (%s) %s", self.name, level) - + LOGGER.debug("Handler (%s) %s", self.name, level) msg = self.get_message(level, *args, **kwargs) msg['Subject'] = self.get_short(level, *args, **kwargs) - msg['From'] = self.options['from'] - msg['To'] = ", ".join(self.options['to']) - + try: + msg['From'] = ', '.join(args[0].options["smtp"]["from"]) + smtpFrom = args[0].options["smtp"]["from"] + except Exception as e: + msg['From'] = self.options['from'] + smtpFrom = self.options["from"] + try: + msg['To'] = ', '.join(args[0].options["smtp"]["to"]) + smtpTo = args[0].options["smtp"]["to"] + except Exception as e: + msg['To'] = ', '.join(self.options['to']) + smtpTo = self.options['to'] smtp = SMTP() yield smtp_connect(smtp, self.options['host'], self.options['port']) @@ -52,7 +60,8 @@ def notify(self, level, *args, **kwargs): try: LOGGER.debug("Send message to: %s", ", ".join(self.options['to'])) - smtp.sendmail(self.options['from'], self.options['to'], msg.as_string()) + LOGGER.info("Message from: %s", msg['From']) + smtp.sendmail(msg['From'],smtpTo, msg.as_string()) finally: smtp.quit()