inital version of speedtest

This commit is contained in:
2025-02-28 21:01:43 +01:00
parent 8a5fab8a24
commit 2099b14708

117
checks/check_speedtest.py Executable file
View File

@@ -0,0 +1,117 @@
#!/usr/bin/env python3
"""speedtest.net python check for icinga"""
"""dependencys:
- pip3 install nagiosplugin
- pip3 install argparse
- pip3 install speedtest-cli
or
system package on debian:
- apt install speedtest
"""
__version__ = '0.1.0'
__author__ = 'anima'
# imports
import logging
import argparse
import nagiosplugin
import speedtest
# log settings
logging.basicConfig(format='[%(asctime)s] %(levelname)s %(message)s', level=logging.INFO)
class SpeedtestResource(nagiosplugin.Resource):
def __init__(self) -> None:
self.test = speedtest.Speedtest(secure=True)
def probe(self) -> list:
"""speedtest check for up & download
Returns:
Generator[nagisplugin.Metric]: multiple metric elements (yield)
"""
def to_mb(byte) -> float:
kb = byte / 1024
mb = kb / 1024
return mb
logging.debug('start download speedtest...')
self.test.download()
logging.debug(f'download speed: {self.test.results.download}')
logging.debug('start upload speedtest...')
self.test.upload()
logging.debug(f'upload speed: {self.test.results.upload}')
logging.debug(f'used server: {self.test.results.server}')
yield nagiosplugin.Metric(name='download', value=round(to_mb(self.test.results.download), 2), uom=' mb/s', context='download_scalar_context')
yield nagiosplugin.Metric(name='upload', value=round(to_mb(self.test.results.upload), 2), uom=' mb/s', context='upload_scalar_context')
yield nagiosplugin.Metric(name='ping', value=self.test.results.ping, uom=' ms', context='ping_scalar_context')
def parse_args() -> argparse.Namespace:
"""evaluates given arguments
Returns:
argsparse.Namespace: Namespace Object with all arguments insert (use: args.long_name_of_argument)
"""
argp = argparse.ArgumentParser(description=__doc__)
# Default args
argp.add_argument('-v', '--verbose', action='count', default=0,
help='increase output verbosity (use up to 3 times)')
argp.add_argument('-H', '--hostname', default='localhost',
help='IP address or hostname of device to query')
argp.add_argument('-t', '--timeout', default=60,
help='abort execution after TIMEOUT seconds')
argp.add_argument('-m', '--check_mode',
choices=[
'speedtest',
], default='speedtest',
help='check mode to run')
# Nagios args / see https://nagios-plugins.org/doc/guidelines.html#THRESHOLDFORMAT
argp.add_argument('-w', '--warning', default='80:',
help='not used for this check') # for compatibility not removed
argp.add_argument('-c', '--critical', default='90:',
help='not used for this check') # for compatibility not removed
argp.add_argument('-wd', '--warning-download', default='90:',
help='warning threshold for download in mb')
argp.add_argument('-cd', '--critical-download', default='25:',
help='critical threshold for download in mb')
argp.add_argument('-wu', '--warning-upload', default='25:',
help='warning threshold for upload in mb')
argp.add_argument('-cu', '--critical-upload', default='10:',
help='critical threshold for upload in mb')
argp.add_argument('-wp', '--warning-ping', default=':50',
help='warning threshold for ping in ms')
argp.add_argument('-cp', '--critical-ping', default=':100',
help='critical threshold for ping in ms')
args = argp.parse_args()
return args
# @nagiosplugin.guarded(verbose=0)
def main():
args = parse_args()
if args.verbose >= 3:
logging.getLogger().setLevel(logging.DEBUG)
# dice which check will be run bases on check_mode
match args.check_mode:
case 'speedtest':
check = nagiosplugin.Check(
SpeedtestResource(),
nagiosplugin.ScalarContext(name='download_scalar_context', warning=args.warning_download, critical=args.critical_download),
nagiosplugin.ScalarContext(name='upload_scalar_context', warning=args.warning_upload, critical=args.critical_upload),
nagiosplugin.ScalarContext(name='ping_scalar_context', warning=args.warning_ping, critical=args.critical_ping),
nagiosplugin.Summary())
check.name = "speedtest"
case _:
raise nagiosplugin.CheckError(f'Unknown check mode: {args.check_mode}')
check.main(args.verbose, args.timeout)
if __name__ == '__main__':
main()