- Saved searches
- Use saved searches to filter your results more quickly
- License
- robmccready/zabbix-isp-speedtest
- Name already in use
- Sign In Required
- Launching GitHub Desktop
- Launching GitHub Desktop
- Launching Xcode
- Launching Visual Studio Code
- Latest commit
- Git stats
- Files
- README.md
- About
- Мониторинг скорости интернет каналов в Zabbix
- Схема работы
- Настройка и запуск iperf3 на удаленном объекте
- Настройка iperf3 на Zabbix Proxy сервере
- Описание и содержимое скриптов
- Настройка шаблонов и скриптов в Zabbix
- Zabbix + Speedtest
- Propose your integration
Saved searches
Use saved searches to filter your results more quickly
You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session. You switched accounts on another tab or window. Reload to refresh your session.
Zabbix template for monitoring ISP speeds using an external check script against speedtest.net
License
robmccready/zabbix-isp-speedtest
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Name already in use
A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?
Sign In Required
Please sign in to use Codespaces.
Launching GitHub Desktop
If nothing happens, download GitHub Desktop and try again.
Launching GitHub Desktop
If nothing happens, download GitHub Desktop and try again.
Launching Xcode
If nothing happens, download Xcode and try again.
Launching Visual Studio Code
Your codespace will open once ready.
There was a problem preparing your codespace, please try again.
Latest commit
Git stats
Files
Failed to load latest commit information.
README.md
Zabbix template for monitoring ISP speeds using speedtest.net.
To avoid timeouts when executing the speed test this template uses a combination of a trigger item and a trap item to asynchronously execute the speed test.
Latest version is v2.0.5 (2022-10-12). Change Log
Installation (on a Zabbix Server)
- Install dependencies
- Copy isp-speedtest-trigger-atjob.sh and isp-speedtest-sender.sh to your Zabbix ExternalScripts location (default: /usr/lib/zabbix/externalscripts)
- Ensure both scripts are executable by the Zabbix Agent user
- Restart Zabbix Agent Service
Sender Macros
The agent running the speedtest uses the zabbix sender to post the results back to the Zabbix server.
- SPEEDTEST_SENDER_SERVER (default: localhost): The hostname or IP address of the Zabbix server to send the results to
- SPEEDTEST_SENDER_PORT (default: 10051): The port of the Zabbix server
- SPEEDTEST_SENDER_HOST (default: Zabbix server): The host that the template is applied to so the sender can find the results item.
Speedtest Macros
Configure the execution of the speedtest runs
- SPEEDTEST_UPDATE_INTERVAL (default: 3h): How often to run the speedtest
- SPEEDTEST_SERVER_ID (default: blank): If filled in it will lock speedtest to a specific server (speedtest —list for available servers)
Trigger Macros
Configure trigger values for alerts
- SPEEDTEST_TRIGGER_AVG_COUNT (default: 3): Average values evaluated by triggers to prevent one bad run causing alerts
- SPEEDTEST_TRIGGER_DOWNLOAD_LOW (default: 100Mbps): Trigger when average download speeds fall below
- SPEEDTEST_TRIGGER_UPLOAD_LOW (default: 8Mbps): Trigger when average upload speeds fall below
- SPEEDTEST_TRIGGER_LATENCY_HIGH (default: 50ms): Trigger when average latency is above
- Speedtest Trigger (calls isp-speedtest-trigger-atjob script)
- Speedtest Results (trapper item — receives data from isp-speedtest-sender script)
- Speedtest Download
- Speedtest Upload
- Speedtest Host (track which speedtest server gets used)
- Speedtest Latency (rough latency to host)
- Speedtest Success (boolean value if execution succeeded)
- Speedtest Message (error message if any)
- Download speed
- Upload speed
- Latency
- Summary graph with download, upload, and latency
The 3 individual graphs are included on a monitoring screen as well
About
Zabbix template for monitoring ISP speeds using an external check script against speedtest.net
Мониторинг скорости интернет каналов в Zabbix
Я работаю в крупной компании федеральной компании, у которой более 2000 объектов. Для большинства задач необходим стабильный канал интернета с высокой скоростью. Поэтому нам необходимо было сделать систему, которая позволяет отслеживать скорость работы интернет каналов на этих объектах, и в случае проблем информировала бы нас об этом.
Собрав все инструменты, что у меня есть, я решил сделать мониторинг скорости интернета на базе Zabbix. Для замеров скорости используется утилита iperf3. Весь код сделан на python.
Схема работы
В общем случае, схема мониторинга выглядит следующим образом:
На объектах установлены сетевые шлюзы на Linux, на которых поднят iperf3 в режиме сервера. В каждом филиале есть сервер Zabbix Proxy, на котором запускается iperf3 в режиме клиента и замеряет скорость интернета, после он в Zabbix trap записывает данные замера.
Настройка и запуск iperf3 на удаленном объекте
Как уже писал выше, на объектах установлены сетевые шлюзы на Linux. На них был установлен iperf3 и создана задача на запуск iperf3 при старте шлюза. Запуск осуществляется следующей командой, где интерфейса, через который осуществляется замер скорости:
Настройка iperf3 на Zabbix Proxy сервере
Для начала необходимо установить следующие пакеты: iperf3, python-pip, python. Из pip нам необходимо установить py-zabbix и protobix.
apt install iperf3 python-pip python pip install py-zabbix pip install protobix
Далее создаем папку iperf в /usr/lib/zabbix/externalscripts/. В папке создаем два файла iperf3_speed_testing.py и iperf3_task.py (один для замера скорости из Zabbix, второй для периодических замеров всех). И даем им нужные разрешения. Владельцем папки делаем пользователя zabbix.
mkdir /usr/lib/zabbix/externalscripts/iperf touch /usr/lib/zabbix/externalscripts/iperf/iperf3_speed_testing.py touch /usr/lib/zabbix/externalscripts/iperf/iperf3_task.py chown -R zabbix:zabbix /usr/lib/zabbix/externalscripts/iperf chmod +x /usr/lib/zabbix/externalscripts/iperf/iperf3_speed_testing.py chmod +x /usr/lib/zabbix/externalscripts/iperf/iperf3_task.py
Описание и содержимое скриптов
Скрипт /usr/lib/zabbix/externalscripts/iperf/iperf3_speed_testing.py необходим для выполнения запуска замера скорости на текущий момент. Он запускает запуск замеров на выбранном хосте в Zabbix.
#!/usr/bin/python #- *- coding: utf-8 - *- import protobix import argparse import subprocess import sys import json import time proxy = subprocess.Popen(['hostname'], stdout=subprocess.PIPE) proxy = proxy.communicate()[0] def showResult(_upload, _download): print "Отправка: " + str(round(_upload/1000000,2)) + " Мбит/с" print "Получение: " + str(round(_download/1000000,2)) + " Мбит/с" def sendData(_upload, _download): host_moria = sys.argv[2] host_status = <> host_status['speed_upload'] = _upload host_status['speed_download'] = _download zbx_datacontainer = protobix.DataContainer() zbx_datacontainer.server_active = proxy.split('\n')[0] zbx_datacontainer.server_port = 10051 zbx_datacontainer.data_type = "items" zbx_datacontainer.add() # print json.dumps(, indent=4) zbx_datacontainer.send() showResult(_upload, _download) start_time = time.time() result = subprocess.Popen(['/usr/bin/iperf3', '-c', sys.argv[1], '-J', '-P', '5'], stdout=subprocess.PIPE, stderr=subprocess.PIPE) wait = time.time()-start_time while wait < 45 and result.poll() == None: wait = time.time()-start_time if wait >40 and wait < 45 : result.kill() stdout_value = stdout_json = stdout_value stdout_value = str(stdout_value) break else: stdout_value, stderr_value = result.communicate() stdout_json = json.loads(stdout_value) while stdout_value.find('error') != -1 and stdout_json['error'] == 'error - unable to receive results: Resource temporarily unavailable': result = subprocess.Popen(['/usr/bin/iperf3', '-c', sys.argv[1], '-J', '-P', '5'], stdout=subprocess.PIPE, stderr=subprocess.PIPE) stdout_value, stderr_value = result.communicate() stdout_json = json.loads(stdout_value) if stdout_value.find('error') == -1: sendData(stdout_json['end']['sum_sent']['bits_per_second'],stdout_json['end']['sum_received']['bits_per_second']) else: print stdout_json['error']
Скрипт /usr/lib/zabbix/externalscripts/iperf/iperf3_task.py необходим для запуска задачи на замер скорости в выбранных группах хостов Zabbix. Для работы данного скрипта также необходимо создать пользователя с доступом к Zabbix API. В данном скрипте используются следующие переменные:
- zabbix_user - пользователь с доступом к API
- zabbix_password - пароль пользователя API
- group - группа или группы в Zabbix, для которых необходимо делать замер скорости интернета
#!/usr/bin/python # - *- coding: utf- 8 - *- from pyzabbix.api import ZabbixAPI import protobix import argparse import subprocess import sys import json import time zabbix_user = zabbix_password = group = ('Gateway_branch_1','Gateway_branch_2') start_time_script = time.time() proxy = subprocess.Popen(['hostname'], stdout=subprocess.PIPE) proxy = proxy.communicate()[0] def sendData(host, upload, download): host_moria = host host_status = <> host_status['speed_upload'] = upload host_status['speed_download'] = download zbx_datacontainer = protobix.DataContainer() zbx_datacontainer.server_active = proxy.split('\n')[0] zbx_datacontainer.server_port = 10051 zbx_datacontainer.data_type = "items" zbx_datacontainer.add() # print json.dumps(, indent=4) zbx_datacontainer.send() def getZabbixGroupID(groupName): groups = zapi.hostgroup.get(filter=) for group in groups: return group['groupid'] zapi = ZabbixAPI(url='https://zabbix.megafon-retail.ru', user=zabbix_user, password=zabbix_password) hosts = zapi.host.get(groupids=[getZabbixGroupID(group[0]),getZabbixGroupID(group[1])], selectInterfaces=['ip']) for host in hosts: # print (host['host']) start_time = time.time() result = subprocess.Popen(['/usr/bin/iperf3', '-c', host['interfaces'][0]['ip'], '-J', '-P', '5'], stdout=subprocess.PIPE, stderr=subprocess.PIPE) wait = time.time()-start_time while wait < 45 and result.poll() == None: wait = time.time()-start_time if wait >40 and wait < 45 : result.kill() stdout_value = stdout_json = stdout_value stdout_value = str(stdout_value) break else: stdout_value, stderr_value = result.communicate() stdout_json = json.loads(stdout_value) while stdout_value.find('error') != -1 and stdout_json['error'] == 'error - unable to receive results: Resource temporarily unavailable': result = subprocess.Popen(['/usr/bin/iperf3', '-c', host['interfaces'][0]['ip'], '-J', '-P', '5'], stdout=subprocess.PIPE, stderr=subprocess.PIPE) stdout_value, stderr_value = result.communicate() stdout_json = json.loads(stdout_value) if stdout_value.find('error') == -1: sendData(host['host'], stdout_json['end']['sum_sent']['bits_per_second'], stdout_json['end']['sum_received']['bits_per_second']) zapi.user.logout() related_time = time.time() - start_time_script host_moria = proxy.split('\n')[0] host_status = <> host_status['iperf_task_time'] = float(round(related_time,2)) zbx_datacontainer = protobix.DataContainer() zbx_datacontainer.server_active = 'hqpv-zbxcl1.megafon-retail.ru' zbx_datacontainer.server_port = 10051 zbx_datacontainer.data_type = "items" zbx_datacontainer.add() zbx_datacontainer.send()
0 2,6,10,14,18,22 * * * /usr/lib/zabbix/externalscripts/iperf/iperf3_task.py
Мы делаем замер раз в 4 часа. Нам этого хватает.
Если у вас используется просто Zabbix сервер, то на нем нужно сделать то же самое.
Настройка шаблонов и скриптов в Zabbix
Для начала необходимо создать шаблон с элементами данных замеров скорости интернета. Я назвал шаблон Internet Speed Testing
В данном шаблоне необходимо создать следующие элементы данных:
- Speed Upload
- Speed Download
- Нет данных замеров скорости более 48 часов
- Низкая скорость загрузки
- Низкая скорость выгрузки
- - для записи скорости, при которой срабатывает триггер
Также добавляем Скрипт для замера скорости вручную (Администрирование -> Скрипты -> Создать скрипт)
В поле команда вставляем путь к скрипту в следующем виде /usr/lib/zabbix/externalscripts/iperf/iperf3_speed_testing.py ''
Теперь добавляем шаблон к необходимым хостам и можно проверить работоспособность. Также в хостах необходимо переопределить макрос, при котором будет срабатывать триггер низкой скорости интернета.
Нажимаем на нужный хост и выбираем Скорость интернета. Получаем ответ:
Далее проверяем элементы данных обновились. Ждем некоторое время и можем получаем такую статистику для каждого хоста:
На это всё. Спасибо за внимание!
Zabbix + Speedtest
Zabbix integration team will develop custom integration based on your requirements and Zabbix best practices.
Propose your integration
Have you already developed high quality integration and want to submit to Zabbix integration repository?
- Features
- What's new in Zabbix 6.4
- Screenshots
- System requirements
- Lifecycle & Release Policy
- License
- Documentation
- Roadmap
- By Topic
- By Industry
- For Enterprises
- Case studies
- Customers and Users
- Integrations & Templates
- Support
- Consulting
- Turn-Key Solution
- Template building
- Upgrade
- Development
- Remote troubleshooting
- Integration
- Certified User
- Certified Specialist
- Certified Professional
- Certified Expert
- Testimonials
- Training FAQ
- Application form
- Webinars
- Partner Program
- Become a Partner
- Strategic Partners
- Distributors
- Map of Partners
- Events
- Forum
- Blog
- Bugs and Feature Requests
- Developers
- Community templates
- Newsletters
- About Us
- Career
- Contacts
- Press Releases
- Trademark
Join us! We're hiring!
© 2001-2023 by Zabbix LLC. All rights reserved.