From 52fdf97397fc56ea0782dcaf7a9bd69b601076f3 Mon Sep 17 00:00:00 2001 From: anima Date: Sun, 23 Feb 2025 04:20:23 +0100 Subject: [PATCH] replace api call for service states --- checks/check_api_swarmpit.py | 32 +++++++++++++++++--------------- 1 file changed, 17 insertions(+), 15 deletions(-) diff --git a/checks/check_api_swarmpit.py b/checks/check_api_swarmpit.py index 41f7b3d..be42520 100644 --- a/checks/check_api_swarmpit.py +++ b/checks/check_api_swarmpit.py @@ -6,7 +6,7 @@ - pip3 install requests """ -__version__ = '0.2.0' +__version__ = '0.3.0' __author__ = 'anima' # imports @@ -72,9 +72,13 @@ class SwarmpitAPI: return self.__query('stats') def tasks(self): - """Task list - aka running services""" + """Task list""" return self.__query('tasks') + def services(self): + """Service list""" + return self.__query('services') + # # Check Swarm Cores @@ -109,15 +113,14 @@ class DockerSwarmServiceStatesResource(nagiosplugin.Resource): Returns: Generator[nagisplugin.Metric]: multiple metric elements (yield) """ - response = self.api.tasks() + response = self.api.services() for service in response: data = dict() data['name'] = service['serviceName'] data['image'] = service['repository']['image'] data['state'] = service['state'] - data['desiredState'] = service['desiredState'] - data['error'] = service['status']['error'] + data['status'] = service['status']['tasks'] yield nagiosplugin.Metric(name='docker_service', value=data, context='docker_service') @@ -126,11 +129,11 @@ class DockerSwarmServiceStatesContext(nagiosplugin.Context): super().__init__(name, fmt_metric='{name} is', result_cls=DockerSwarmServiceStatesResult) def evaluate(self, metric, resource): - if metric.value['state'] == metric.value['desiredState']: - if metric.value['error'] == None: - return self.result_cls(nagiosplugin.Ok, "ok", metric) - else: + if metric.value['state'] in ['running']: + if metric.value['status']['running'] < metric.value['status']['total']: return self.result_cls(nagiosplugin.Warn, "warning", metric) + else: + return self.result_cls(nagiosplugin.Ok, "ok", metric) else: return self.result_cls(nagiosplugin.Critical, "critical", metric) @@ -139,13 +142,13 @@ class DockerSwarmServiceStatesContext(nagiosplugin.Context): class DockerSwarmServiceStatesResult(nagiosplugin.Result): def __str__(self): - if self.metric.value['state'] == self.metric.value['desiredState']: - if self.metric.value['error'] == None: - return f'Service {self.metric.value["name"]} ({self.metric.value["image"]}) is {self.metric.value["state"]}' + if self.metric.value['state'] in ['running']: + if self.metric.value['status']['running'] < self.metric.value['status']['total']: + return f'Service {self.metric.value["name"]} ({self.metric.value["image"]}) is {self.metric.value["state"]} with {self.metric.value['status']['running']} of {self.metric.value['status']['total']} replicas' else: - return f'Service {self.metric.value["name"]} ({self.metric.value["image"]}) is {self.metric.value["state"]} with error {self.metric.value["error"]}' + return f'Service {self.metric.value["name"]} ({self.metric.value["image"]}) is {self.metric.value["state"]}' else: - return f'Service {self.metric.value["name"]} ({self.metric.value["image"]}) is {self.metric.value["state"]} (desired: {self.metric.value["desiredState"]}) with error {self.metric.value["error"]}' + return f'Service {self.metric.value["name"]} ({self.metric.value["image"]}) is {self.metric.value["state"]}' # @@ -215,7 +218,6 @@ def main(): # dice which check will be run bases on check_mode api = SwarmpitAPI(host=args.api_host, token=args.api_token, port=args.api_port, ssl=args.api_ssl) - api.tasks() match args.check_mode: case 'load': check = nagiosplugin.Check(