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(