From 780edf04230b809a943cc54c494fc3f400307bc6 Mon Sep 17 00:00:00 2001 From: Adam Goldsmith Date: Fri, 10 Mar 2023 21:49:35 -0500 Subject: [PATCH] Handle bad scalar values as undefined rather than -1 --- check_home_assistant_state.py | 27 ++++++++++++++++++++------- 1 file changed, 20 insertions(+), 7 deletions(-) diff --git a/check_home_assistant_state.py b/check_home_assistant_state.py index 2adeb44..aef3f00 100755 --- a/check_home_assistant_state.py +++ b/check_home_assistant_state.py @@ -17,6 +17,23 @@ import nagiosplugin _log = logging.getLogger("nagiosplugin") +class ScalarOrUnknownContext(nagiosplugin.ScalarContext): + def evaluate(self, metric: nagiosplugin.Metric, resource: nagiosplugin.Resource): + if isinstance(metric.value, (int, float)): + return super().evaluate(metric, resource) + else: + return self.result_cls(nagiosplugin.state.Unknown, "non-scalar value", metric) + + def performance(self, metric: nagiosplugin.Metric, resource: nagiosplugin.Resource): + if isinstance(metric.value, (int, float)): + return super().performance(metric, resource) + else: + return nagiosplugin.Performance( + metric.name, "U", metric.uom, + self.warning, self.critical, + metric.min, metric.max) + + @dataclasses.dataclass class Entities(nagiosplugin.Resource): url: str @@ -56,16 +73,14 @@ class Entities(nagiosplugin.Resource): state["attributes"].get(k) == v for k, v in self.filters ): if self.attribute is not None: - value = state["attributes"].get( - self.attribute, -1 if self.numeric else "attribute missing" - ) + value = state["attributes"].get(self.attribute, "missing attribute") uom = None else: if self.numeric: try: value = float(state["state"]) except ValueError: - value = -1 + value = state["state"] else: value = state["state"] uom = state["attributes"].get("unit_of_measurement") @@ -79,8 +94,6 @@ class Entities(nagiosplugin.Resource): else: name = state["entity_id"] - if state["state"] == "unavailable": - _log.info(f"{state['entity_id']} unavailable") yield nagiosplugin.Metric( name, value, @@ -340,7 +353,7 @@ def main(): attribute=args.attribute, friendly_name=args.friendly, ), - nagiosplugin.ScalarContext(args.device_class, args.warning, args.critical), + ScalarOrUnknownContext(args.device_class, args.warning, args.critical), ) elif args.subparser_name == "text": check = nagiosplugin.Check(