From 194b86d43d8c2031a2b4f4935e89989cc0397320 Mon Sep 17 00:00:00 2001 From: aventur120 Date: Wed, 18 May 2016 16:27:19 -0400 Subject: [PATCH 1/9] Allow each alert to have its own To and From inside of smtp. --- graphite_beacon/handlers/smtp.py | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/graphite_beacon/handlers/smtp.py b/graphite_beacon/handlers/smtp.py index be0f140..31d4648 100644 --- a/graphite_beacon/handlers/smtp.py +++ b/graphite_beacon/handlers/smtp.py @@ -35,12 +35,17 @@ def init_handler(self): @gen.coroutine def notify(self, level, *args, **kwargs): 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'] = args[0].options["smtp"]["from"] + except Exception as e: + msg['From'] = self.options['from'] + try: + msg['To'] = ", ".join(args[0].options["smtp"]["to"] + except Exception as e: + msg['To'] = ", ".join(self.options['to']) smtp = SMTP() yield smtp_connect(smtp, self.options['host'], self.options['port']) From b71a98a581633449d7b11b0d32f7477bc06adc96 Mon Sep 17 00:00:00 2001 From: aventur120 Date: Wed, 18 May 2016 16:29:45 -0400 Subject: [PATCH 2/9] Allow each alert to have its own cli command to run. --- graphite_beacon/handlers/cli.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) 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, From a17c2c9b04226ef35bf5607008ba05cd123370c0 Mon Sep 17 00:00:00 2001 From: aventur120 Date: Wed, 18 May 2016 16:38:04 -0400 Subject: [PATCH 3/9] Bring in handler code from core.py to handle specific handlers for each alert. --- graphite_beacon/alerts.py | 13 +++++++++++++ 1 file changed, 13 insertions(+) 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) From 6893316721a135865be2f7fc682fb26e687a1799 Mon Sep 17 00:00:00 2001 From: aventur120 Date: Wed, 18 May 2016 16:40:38 -0400 Subject: [PATCH 4/9] If specific handlers specified in alert use those, else use global. --- graphite_beacon/core.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/graphite_beacon/core.py b/graphite_beacon/core.py index afd1152..d1126a6 100644 --- a/graphite_beacon/core.py +++ b/graphite_beacon/core.py @@ -140,9 +140,11 @@ def notify(self, level, alert, value, target=None, ntype=None, rule=None): 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, From af2d1f3f256beedb5898fadb063bebbd9b6a3718 Mon Sep 17 00:00:00 2001 From: Andrew Venturini Date: Thu, 28 Jul 2016 15:58:40 -0400 Subject: [PATCH 5/9] Fixed syntax Error --- graphite_beacon/handlers/smtp.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/graphite_beacon/handlers/smtp.py b/graphite_beacon/handlers/smtp.py index 31d4648..0eeb2d2 100644 --- a/graphite_beacon/handlers/smtp.py +++ b/graphite_beacon/handlers/smtp.py @@ -34,8 +34,7 @@ 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) try: @@ -43,7 +42,7 @@ def notify(self, level, *args, **kwargs): except Exception as e: msg['From'] = self.options['from'] try: - msg['To'] = ", ".join(args[0].options["smtp"]["to"] + msg['To'] = ", ".join(args[0].options["smtp"]["to"]) except Exception as e: msg['To'] = ", ".join(self.options['to']) smtp = SMTP() From 56e549ad6a153fd2eb2937cf2e916e70a311a5dd Mon Sep 17 00:00:00 2001 From: Andrew Venturini Date: Fri, 29 Jul 2016 13:45:56 -0400 Subject: [PATCH 6/9] Fixed list error in smtp.py --- graphite_beacon/core.py | 5 ++++- graphite_beacon/handlers/smtp.py | 11 ++++++++--- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/graphite_beacon/core.py b/graphite_beacon/core.py index d1126a6..cb434a4 100644 --- a/graphite_beacon/core.py +++ b/graphite_beacon/core.py @@ -137,12 +137,15 @@ 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 "") - + LOGGER.info('HERE$') if ntype is None: ntype = alert.source + LOGGER.info('HERE#') for handler in alert.handlers.get(level, []): handler.notify(level, alert, value, target=target, ntype=ntype, rule=rule) + LOGGER.info('HERE!') for handler in self.handlers.get(level, []): + LOGGER.info('HERE@') if not alert.handlers.get(level,[]): handler.notify(level, alert, value, target=target, ntype=ntype, rule=rule) diff --git a/graphite_beacon/handlers/smtp.py b/graphite_beacon/handlers/smtp.py index 0eeb2d2..187e6e1 100644 --- a/graphite_beacon/handlers/smtp.py +++ b/graphite_beacon/handlers/smtp.py @@ -38,12 +38,16 @@ def notify(self, level, *args, **kwargs): msg = self.get_message(level, *args, **kwargs) msg['Subject'] = self.get_short(level, *args, **kwargs) try: - msg['From'] = args[0].options["smtp"]["from"] + #msg['From'] = args[0].options["smtp"]["from"] + msg['From'] = ", ".join(args[0].options["smtp"]["from"]) except Exception as e: - msg['From'] = self.options['from'] + #msg['From'] = self.options['from'] + msg['From'] = ", ".join(args[0].options["smtp"]["from"]) try: + #msg['To'] = args[0].options["smtp"]["to"] msg['To'] = ", ".join(args[0].options["smtp"]["to"]) except Exception as e: + #msg['To'] = self.options['to'] msg['To'] = ", ".join(self.options['to']) smtp = SMTP() yield smtp_connect(smtp, self.options['host'], self.options['port']) @@ -56,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()) + smtp.sendmail(msg['From'], msg['To'], msg.as_string()) + #smtp.sendmail(self.options['from'], self.options['to'], msg.as_string()) finally: smtp.quit() From d7554eff992ba32c19a10ff78e99e2c5ad74157e Mon Sep 17 00:00:00 2001 From: Andrew Venturini Date: Fri, 29 Jul 2016 14:03:38 -0400 Subject: [PATCH 7/9] fixed small comment error --- graphite_beacon/handlers/smtp.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/graphite_beacon/handlers/smtp.py b/graphite_beacon/handlers/smtp.py index 187e6e1..25eca21 100644 --- a/graphite_beacon/handlers/smtp.py +++ b/graphite_beacon/handlers/smtp.py @@ -41,8 +41,8 @@ def notify(self, level, *args, **kwargs): #msg['From'] = args[0].options["smtp"]["from"] msg['From'] = ", ".join(args[0].options["smtp"]["from"]) except Exception as e: - #msg['From'] = self.options['from'] - msg['From'] = ", ".join(args[0].options["smtp"]["from"]) + msg['From'] = self.options['from'] + #msg['From'] = ", ".join(args[0].options["smtp"]["from"]) try: #msg['To'] = args[0].options["smtp"]["to"] msg['To'] = ", ".join(args[0].options["smtp"]["to"]) From 3f9ee5415c51e8a8cea357aa10f1c6e58f9a2de6 Mon Sep 17 00:00:00 2001 From: Andrew Venturini Date: Mon, 1 Aug 2016 09:45:30 -0400 Subject: [PATCH 8/9] fixed list issue for smtpemail --- graphite_beacon/core.py | 4 ---- graphite_beacon/handlers/smtp.py | 19 +++++++++---------- 2 files changed, 9 insertions(+), 14 deletions(-) diff --git a/graphite_beacon/core.py b/graphite_beacon/core.py index cb434a4..b9fd849 100644 --- a/graphite_beacon/core.py +++ b/graphite_beacon/core.py @@ -137,15 +137,11 @@ 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 "") - LOGGER.info('HERE$') if ntype is None: ntype = alert.source - LOGGER.info('HERE#') for handler in alert.handlers.get(level, []): handler.notify(level, alert, value, target=target, ntype=ntype, rule=rule) - LOGGER.info('HERE!') for handler in self.handlers.get(level, []): - LOGGER.info('HERE@') if not alert.handlers.get(level,[]): handler.notify(level, alert, value, target=target, ntype=ntype, rule=rule) diff --git a/graphite_beacon/handlers/smtp.py b/graphite_beacon/handlers/smtp.py index 25eca21..d091577 100644 --- a/graphite_beacon/handlers/smtp.py +++ b/graphite_beacon/handlers/smtp.py @@ -38,17 +38,17 @@ def notify(self, level, *args, **kwargs): msg = self.get_message(level, *args, **kwargs) msg['Subject'] = self.get_short(level, *args, **kwargs) try: - #msg['From'] = args[0].options["smtp"]["from"] - msg['From'] = ", ".join(args[0].options["smtp"]["from"]) + msg['From'] = ', '.join(args[0].options["smtp"]["from"]) + smtpFrom = args[0].options["smtp"]["from"] except Exception as e: - msg['From'] = self.options['from'] - #msg['From'] = ", ".join(args[0].options["smtp"]["from"]) + msg['From'] = ', '.join(self.options['from']) + smtpFrom = self.options["from"] try: - #msg['To'] = args[0].options["smtp"]["to"] - msg['To'] = ", ".join(args[0].options["smtp"]["to"]) + msg['To'] = ', '.join(args[0].options["smtp"]["to"]) + smtpTo = args[0].options["smtp"]["to"] except Exception as e: - #msg['To'] = self.options['to'] - msg['To'] = ", ".join(self.options['to']) + msg['To'] = ', '.join(self.options['to']) + smtpTo = self.options['to'] smtp = SMTP() yield smtp_connect(smtp, self.options['host'], self.options['port']) @@ -60,8 +60,7 @@ def notify(self, level, *args, **kwargs): try: LOGGER.debug("Send message to: %s", ", ".join(self.options['to'])) - smtp.sendmail(msg['From'], msg['To'], msg.as_string()) - #smtp.sendmail(self.options['from'], self.options['to'], msg.as_string()) + smtp.sendmail(smtpFrom,smtpTo, msg.as_string()) finally: smtp.quit() From 05a37c233f01aaae07eaf44614e0da144c0384f0 Mon Sep 17 00:00:00 2001 From: Andrew Venturini Date: Mon, 1 Aug 2016 15:42:37 -0400 Subject: [PATCH 9/9] fixed another ', '.join error --- graphite_beacon/handlers/smtp.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/graphite_beacon/handlers/smtp.py b/graphite_beacon/handlers/smtp.py index d091577..b9802f6 100644 --- a/graphite_beacon/handlers/smtp.py +++ b/graphite_beacon/handlers/smtp.py @@ -41,7 +41,7 @@ def notify(self, level, *args, **kwargs): msg['From'] = ', '.join(args[0].options["smtp"]["from"]) smtpFrom = args[0].options["smtp"]["from"] except Exception as e: - msg['From'] = ', '.join(self.options['from']) + msg['From'] = self.options['from'] smtpFrom = self.options["from"] try: msg['To'] = ', '.join(args[0].options["smtp"]["to"]) @@ -60,7 +60,8 @@ def notify(self, level, *args, **kwargs): try: LOGGER.debug("Send message to: %s", ", ".join(self.options['to'])) - smtp.sendmail(smtpFrom,smtpTo, msg.as_string()) + LOGGER.info("Message from: %s", msg['From']) + smtp.sendmail(msg['From'],smtpTo, msg.as_string()) finally: smtp.quit()