replace api call for service states

This commit is contained in:
2025-02-23 04:20:23 +01:00
parent 482ffcda99
commit 52fdf97397

View File

@@ -6,7 +6,7 @@
- pip3 install requests - pip3 install requests
""" """
__version__ = '0.2.0' __version__ = '0.3.0'
__author__ = 'anima' __author__ = 'anima'
# imports # imports
@@ -72,9 +72,13 @@ class SwarmpitAPI:
return self.__query('stats') return self.__query('stats')
def tasks(self): def tasks(self):
"""Task list - aka running services""" """Task list"""
return self.__query('tasks') return self.__query('tasks')
def services(self):
"""Service list"""
return self.__query('services')
# #
# Check Swarm Cores # Check Swarm Cores
@@ -109,15 +113,14 @@ class DockerSwarmServiceStatesResource(nagiosplugin.Resource):
Returns: Returns:
Generator[nagisplugin.Metric]: multiple metric elements (yield) Generator[nagisplugin.Metric]: multiple metric elements (yield)
""" """
response = self.api.tasks() response = self.api.services()
for service in response: for service in response:
data = dict() data = dict()
data['name'] = service['serviceName'] data['name'] = service['serviceName']
data['image'] = service['repository']['image'] data['image'] = service['repository']['image']
data['state'] = service['state'] data['state'] = service['state']
data['desiredState'] = service['desiredState'] data['status'] = service['status']['tasks']
data['error'] = service['status']['error']
yield nagiosplugin.Metric(name='docker_service', value=data, context='docker_service') 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) super().__init__(name, fmt_metric='{name} is', result_cls=DockerSwarmServiceStatesResult)
def evaluate(self, metric, resource): def evaluate(self, metric, resource):
if metric.value['state'] == metric.value['desiredState']: if metric.value['state'] in ['running']:
if metric.value['error'] == None: if metric.value['status']['running'] < metric.value['status']['total']:
return self.result_cls(nagiosplugin.Ok, "ok", metric)
else:
return self.result_cls(nagiosplugin.Warn, "warning", metric) return self.result_cls(nagiosplugin.Warn, "warning", metric)
else:
return self.result_cls(nagiosplugin.Ok, "ok", metric)
else: else:
return self.result_cls(nagiosplugin.Critical, "critical", metric) return self.result_cls(nagiosplugin.Critical, "critical", metric)
@@ -139,13 +142,13 @@ class DockerSwarmServiceStatesContext(nagiosplugin.Context):
class DockerSwarmServiceStatesResult(nagiosplugin.Result): class DockerSwarmServiceStatesResult(nagiosplugin.Result):
def __str__(self): def __str__(self):
if self.metric.value['state'] == self.metric.value['desiredState']: if self.metric.value['state'] in ['running']:
if self.metric.value['error'] == None: 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"]}' 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: 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: 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 # 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 = SwarmpitAPI(host=args.api_host, token=args.api_token, port=args.api_port, ssl=args.api_ssl)
api.tasks()
match args.check_mode: match args.check_mode:
case 'load': case 'load':
check = nagiosplugin.Check( check = nagiosplugin.Check(