Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 13 additions & 0 deletions graphite_beacon/alerts.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
import math
from collections import deque, defaultdict
from itertools import islice
from .handlers import registry


LOGGER = log.gen_log
Expand Down Expand Up @@ -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

Expand Down Expand Up @@ -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)
Expand Down
7 changes: 4 additions & 3 deletions graphite_beacon/core.py
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down
5 changes: 4 additions & 1 deletion graphite_beacon/handlers/cli.py
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down
21 changes: 15 additions & 6 deletions graphite_beacon/handlers/smtp.py
Original file line number Diff line number Diff line change
Expand Up @@ -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'])

Expand All @@ -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()

Expand Down