Source code for i3pystatus.sensu

from i3pystatus import IntervalModule, formatp

from enum import IntEnum
import requests
from urllib.parse import urljoin


[docs]class SensuCheck(IntervalModule): """ Pool sensu api events .. rubric:: Available formatters * {status} OK if not events else numbers of events * {last_event} Display the output of the most recent event (with priority on error event) """ interval = 5 required = ("api_url",) settings = ( ("api_url", "URL of Sensu API. e.g: http://localhost/sensu/"), "api_username", "api_password", "format", "color_error", "color_warn", "color_ok", ("last_event_label", "Label to put before the last event output (default 'Last:')"), ("max_event_field", "Defines max length of the last_event message field " "(default: 50)"), ) api_url = None api_username = None api_password = None format = "{status}" color_error = "#ff0000" color_warn = "#f9ba46" color_ok = "#00ff00" last_event_label = "Last:" max_event_field = 50 def run(self): try: auth = () if self.api_username: auth = (self.api_username, self.api_password or "") response = requests.get(urljoin(self.api_url, "events"), auth=auth) if response.status_code != requests.codes.OK: self.error("could not query sensu api: {}".format(response.status_code)) else: try: events = response.json() except ValueError: self.error("could not decode json") else: try: self.set_output(events) except KeyError as exc: self.error("could not find field {!s} in event".format(exc)) except Exception as exc: self.output = { "full_text": "FAILED: {!s}".format(str(exc)), "color": self.color_error, } def set_output(self, events): events = sorted( [e for e in events if e["action"] != "resolve" and not e["silenced"]], key=lambda x: x["last_ok"], reverse=True ) last_event_output = "" if not events: status = "OK" color = self.color_ok else: error = None try: error = next(e for e in events if e["check"]["status"] == SensuStatus.critical) except StopIteration: last_event = events[0] else: last_event = error status = "{} event(s)".format(len(events)) color = self.color_error if error else self.color_warn last_event_output = self.get_event_output(last_event) self.output = { "full_text": formatp(self.format, status=status, last_event=last_event_output), "color": color, } def get_event_output(self, event): output = (event["check"]["output"] or "").replace("\n", " ") if self.last_event_label: output = "{} {}".format(self.last_event_label, output) if self.max_event_field and len(output) > self.max_event_field: output = output[:self.max_event_field] return output def error(self, error_msg): self.output = { "full_text": error_msg, "color": self.color_error, }
class SensuStatus(IntEnum): ok = 0 warn = 1 critical = 2 unknown = 3