OpenWISP 2 监控
项目描述
OpenWISP Monitoring是一个用Python和Django编写的网络监控系统,设计为可扩展、可编程、可伸缩,并且易于最终用户使用:一旦系统配置完毕,监控检查、警报和指标收集将自动进行。
查看可用功能。
OpenWISP不仅是一个面向最终用户的应用程序,还可以用作构建在它的构建块之上的自定义网络自动化解决方案的框架。
OpenWISP生态系统中的其他流行构建块包括
openwisp-controller:网络和WiFi控制器:提供配置、配置管理、x509 PKI管理等功能;可在OpenWRT上运行,但也适用于其他系统。
openwisp-network-topology:提供从动态网状路由守护程序或其他网络软件(例如:OpenVPN)收集和可视化网络拓扑数据的方法;可以与openwisp-monitoring结合使用,以更好地了解网络状态
openwisp-firmware-upgrader:自动固件升级(单个设备或大量网络升级)
openwisp-radius:基于FreeRADIUS,允许实现网络接入认证系统,如802.1x WPA2企业、强制门户认证、Hotspot 2.0(802.11u)
openwisp-ipam:允许管理网络的IP地址空间
有关OpenWISP模块和架构的更完整概述,请参阅OpenWISP架构概述。
可用功能
在时序数据库中收集监控信息(目前仅支持influxdb)
允许通过用户界面轻松浏览警报,一键点击
收集并显示设备状态信息,如运行时间、RAM状态、CPU平均负载、接口属性和地址、WiFi接口状态和关联客户端、邻居信息、DHCP租约、磁盘/闪存状态
提供运行时间、丢包率、往返时间(延迟)、关联WiFi客户端、接口流量、RAM使用、CPU负载、闪存/磁盘使用、移动信号(LTE/UMTS/GSM 信号强度、信号质量、使用中的接入技术)的监控图表
图表可以按1天、3天、一周、一个月和一年的分辨率查看
可配置警报
监控数据CSV导出
在管理员仪表板上显示网络状态概述,图表显示在线、离线或存在问题的设备的百分比;对于使用OpenWISP地理功能的用户,还提供地理地图
可扩展的主动检查系统:可以编写使用Python类定期运行的额外检查
可扩展的指标和图表:可以定义新的指标和新的图表
API:根据NetJSON DeviceMonitoring检索每个设备的图表指标和状态信息
安装说明
在生产环境中部署
见
安装系统依赖项
openwisp-monitoring 使用InfluxDB来存储指标。请按照InfluxDB官方文档中的安装说明进行操作。
注意:在openwisp-monitoring中只支持InfluxDB 1.8.x。
安装系统包
sudo apt install -y openssl libssl-dev \
gdal-bin libproj-dev libgeos-dev \
fping
从PyPI安装稳定版本
从PyPI安装
pip install openwisp-monitoring
安装开发版本
安装tar包
pip install https://github.com/openwisp/openwisp-monitoring/tarball/master
或者,您可以使用pip通过git安装
pip install -e git+git://github.com/openwisp/openwisp-monitoring#egg=openwisp_monitoring
如果您想贡献,请遵循“为开发安装”部分中的说明。
开发环境安装
安装“安装系统依赖”部分中提到的系统依赖。安装以下开发所需的附加包
sudo apt install -y sqlite3 libsqlite3-dev \
libspatialite-dev libsqlite3-mod-spatialite \
chromium
创建并克隆分叉的仓库
git clone git://github.com/<your_fork>/openwisp-monitoring
导航到克隆的仓库中
cd openwisp-monitoring/
使用Docker启动Redis和InfluxDB
docker-compose up -d redis influxdb
设置并激活虚拟环境。(我们将使用virtualenv)
python -m virtualenv env
source env/bin/activate
在下一步之前,请确保您正在使用pip版本20.2.4
pip install -U pip wheel setuptools
安装开发依赖
pip install -e .
pip install -r requirements-test.txt
npm install -g jshint stylelint
从https://chromedriver.chromium.org/home下载适用于您浏览器版本的WebDriver for Chromium,并将其解压到您的$PATH目录之一(例如:~/.local/bin/)。
创建数据库
cd tests/
./manage.py migrate
./manage.py createsuperuser
使用以下命令运行celery和celery-beat(需要单独的终端窗口)
cd tests/
celery -A openwisp2 worker -l info
celery -A openwisp2 beat -l info
启动开发服务器
./manage.py runserver 0.0.0.0:8000
您可以通过http://127.0.0.1:8000/admin/访问管理界面。
使用以下命令运行测试
./runtests.py --parallel
使用以下命令运行质量保证测试
./run-qa-checks
在Docker上安装和运行
注意:此Docker镜像仅适用于开发目的。有关官方OpenWISP Docker镜像,请参阅:docker-openwisp。
从Dockerfile构建
docker-compose build
运行Docker容器
docker-compose up
设置(集成到现有的Django项目中)
遵循openwisp-controller的设置说明,然后添加以下描述的设置。
INSTALLED_APPS = [
# django apps
# all-auth
'django.contrib.sites',
'allauth',
'allauth.account',
'allauth.socialaccount',
'django_extensions',
'django_filters',
# openwisp2 modules
'openwisp_users',
'openwisp_controller.pki',
'openwisp_controller.config',
'openwisp_controller.connection',
'openwisp_controller.geo',
# monitoring
'openwisp_monitoring.monitoring',
'openwisp_monitoring.device',
'openwisp_monitoring.check',
'nested_admin',
# notifications
'openwisp_notifications',
# openwisp2 admin theme (must be loaded here)
'openwisp_utils.admin_theme',
# admin
'django.contrib.admin',
'django.forms',
# other dependencies ...
]
# Make sure you change them in production
# You can select one of the backends located in openwisp_monitoring.db.backends
TIMESERIES_DATABASE = {
'BACKEND': 'openwisp_monitoring.db.backends.influxdb',
'USER': 'openwisp',
'PASSWORD': 'openwisp',
'NAME': 'openwisp2',
'HOST': 'localhost',
'PORT': '8086',
}
urls.py:
from django.conf import settings
from django.conf.urls import include, url
from django.contrib.staticfiles.urls import staticfiles_urlpatterns
from openwisp_utils.admin_theme.admin import admin, openwisp_admin
openwisp_admin()
urlpatterns = [
url(r'^admin/', include(admin.site.urls)),
url(r'', include('openwisp_controller.urls')),
url(r'', include('openwisp_monitoring.urls')),
]
urlpatterns += staticfiles_urlpatterns()
配置缓存(如果您想使用不同的缓存存储,可以更改)
CACHES = {
'default': {
'BACKEND': 'django_redis.cache.RedisCache',
'LOCATION': 'redis://localhost/0',
'OPTIONS': {
'CLIENT_CLASS': 'django_redis.client.DefaultClient',
}
}
}
SESSION_ENGINE = 'django.contrib.sessions.backends.cache'
SESSION_CACHE_ALIAS = 'default'
配置celery(如果您想使用不同的代理,可以更改)
# here we show how to configure celery with redis but you can
# use other brokers if you want, consult the celery docs
CELERY_BROKER_URL = 'redis://localhost/1'
CELERY_BEAT_SCHEDULE = {
'run_checks': {
'task': 'openwisp_monitoring.check.tasks.run_checks',
'schedule': timedelta(minutes=5),
},
}
INSTALLED_APPS.append('djcelery_email')
EMAIL_BACKEND = 'djcelery_email.backends.CeleryEmailBackend'
如果您决定使用Redis(如以下示例所示),请安装以下Python包。
pip install redis django-redis
快速入门指南
安装OpenWISP监控
使用“安装说明”中提到的任一方法安装OpenWISP Monitoring。
在设备上安装openwisp-config
在您的设备上安装openwisp-config代理。
在设备上安装监控包
在您的设备上安装openwrt-openwisp-monitoring包。
这些包从设备收集并发送监控数据到OpenWISP Monitoring,收集指标(如接口流量、WiFi客户端、CPU负载、内存使用等)是必需的。
注意:如果您是openwisp-monitoring的现有用户并正在使用用于收集指标的传统监控模板,我们强烈建议从监控脚本迁移到监控包。
确保OpenWISP可以访问您的设备
为了执行主动检查和其他操作,如触发配置更改的推送、执行shell命令或执行固件升级,OpenWISP服务器需要能够访问网络设备。
OpenWISP主要有两种部署场景
OpenWISP服务器部署在公共互联网上,而设备地理分布在不同的位置:在这种情况下需要一个管理隧道
OpenWISP服务器部署在计算机/服务器上,该计算机/服务器位于设备所在的同一层2网络(即同一局域网)中。在这种情况下不需要管理隧道
1. 公共互联网部署
这是最常见的场景
OpenWISP服务器部署到公共互联网,因此服务器具有公共IPv4(和IPv6)地址,通常由Mozilla Let's Encrypt或其他SSL提供商提供有效的SSL证书
网络设备地理分布在不同的位置(不同的城市、不同的地区、不同的国家)
在这种情况下,OpenWISP应用程序将无法访问设备,除非使用管理隧道,因此拥有OpenVPN、Wireguard或其他隧道解决方案至关重要,这不仅可以让OpenWISP正常工作,还可以在需要时进行调试和故障排除。
在这种情况下,需要以下要求
VPN服务器必须以OpenWISP服务器能够访问VPN对等体的方式安装,有关如何通过OpenWISP进行此操作的信息,请参阅以下章节。
如果您更喜欢使用其他隧道解决方案(L2TP、Softether等)并且知道如何配置这些解决方案,那也完全可以。
如果OpenWISP服务器连接到允许其通过预存在的隧道或内网解决方案(例如:MPLS、SD-WAN)访问设备的网络基础设施,则不需要设置VPN服务器,只要OpenWrt上有一个专用的接口分配了IP地址,并且可以从OpenWISP服务器访问。
设备必须配置为自动加入管理隧道,无论是通过固件中预存在的配置还是通过OpenWISP模板。
设备上的openwisp-config代理必须配置为指定管理接口选项,代理将向OpenWISP服务器发送管理接口的IP地址,OpenWISP将使用管理IP地址来访问设备。
例如,如果管理接口命名为tun0,openwisp-config配置应类似于以下示例
# In /etc/config/openwisp on the device
config controller 'http'
# ... other configuration directives ...
option management_interface 'tun0'
2. LAN部署
当OpenWISP服务器和网络设备部署在同一L2网络(例如:办公室局域网)中,并且OpenWISP服务器可以通过LAN地址访问时,OpenWISP可以使用设备的最后IP字段来访问它们。
在这种情况下,需要将“OPENWISP_MONITORING_MANAGEMENT_IP_ONLY”设置设置为False。
为设备创建检查
默认情况下,为所有设备自动创建活动检查,除非已禁用某些特定检查的自动创建。有关如何进行此操作的更多信息,请参阅活动检查部分。
这些检查由celery工作进程在后台创建和执行。
被动与主动指标收集
OpenWISP监控收集的不同设备度量值可以分为两类
OpenWISP主动收集的度量:这些度量值由在OpenWISP服务器上运行的celery工作进程收集,它们持续向设备发送网络请求并存储结果;
OpenWISP被动收集的度量:这些度量值由安装在网络设备上的openwrt-openwisp-monitoring代理发送,并由OpenWISP通过其REST API收集。
本文件的“可用检查”部分列出了当前已实现的活动检查。
设备健康状态
健康状态字段(DeviceMonitoring.status)的可能值如下所述。
UNKNOWN
每当创建新设备时,它将默认具有UNKNOWN作为其健康状态。
这意味着系统尚不知道设备是否可访问。
OK
一切正常。
PROBLEM
其中一个度量值的值不在预期范围内(已超过警报设置中设置的阈值值)。
示例:CPU使用率应低于90%,但当前值为95%。
CRITICAL
在OPENWISP_MONITORING_CRITICAL_DEVICE_METRICS中定义的一个度量值的值不在预期范围内(已超过警报设置中设置的阈值值)。
示例:ping默认是一个关键度量值,预期始终为1(可访问)。
默认指标
设备状态
此度量值存储设备的状态以供查看。
Ping
测量: |
ping |
类型: |
int(可访问和丢失),float(往返时间) |
字段: |
可达性,丢包率,最小RTT,最大RTT,平均RTT |
配置: |
ping |
图表: |
运行时间,丢包率,RTT |
运行时间:
丢包率:
往返时间:
流量
测量: |
流量 |
类型: |
整型 |
字段: |
接收字节数,发送字节数 |
标签: |
|
配置: |
流量 |
图表: |
流量 |
WiFi客户端
测量: |
Wi-Fi客户端 |
类型: |
整型 |
字段: |
客户端 |
标签: |
|
配置: |
客户端 |
图表: |
Wi-Fi客户端 |
内存使用
测量: |
<内存> |
类型: |
浮点型 |
字段: |
使用百分比,空闲内存,总内存,缓冲内存,共享内存,缓存内存,可用内存 |
配置: |
内存 |
图表: |
内存 |
CPU负载
测量: |
负载 |
类型: |
浮点型 |
字段: |
CPU使用率,1分钟负载,5分钟负载,15分钟负载 |
配置: |
负载 |
图表: |
负载 |
磁盘使用
测量: |
磁盘 |
类型: |
浮点型 |
字段: |
使用磁盘 |
配置: |
磁盘 |
图表: |
磁盘 |
移动信号强度
测量: |
信号强度 |
类型: |
浮点型 |
字段: |
信号强度,信号功率 |
配置: |
信号强度 |
图表: |
信号强度 |
移动信号质量
测量: |
信号质量 |
类型: |
浮点型 |
字段: |
信号质量,信号质量 |
配置: |
信号质量 |
图表: |
信号质量 |
正在使用的移动接入技术
测量: |
接入技术 |
类型: |
整型 |
字段: |
接入技术 |
配置: |
接入技术 |
图表: |
接入技术 |
默认警报/通知
通知类型 |
用途 |
threshold_crossed |
当指标超过警报设置中的阈值边界时触发。 |
阈值恢复 |
当指标回到预期范围内时触发。 |
连接工作 |
当设备连接正常工作时触发。 |
连接不工作 |
当设备连接(例如:SSH)停止工作时触发(例如:凭据已过期,管理IP地址已过期,或设备不可达)。 |
可用检查
Ping
此检查返回有关设备运行时间和RTT(往返时间)的信息。创建了图表运行时间、丢包率和rtt。使用fping命令收集这些指标。您可以选择通过将OPENWISP_MONITORING_AUTO_PING设置为False来禁用此检查的自动创建。
您可以使用OPENWISP_MONITORING_PING_CHECK_CONFIG设置更改用于ping检查的默认值。
应用的配置
此检查确保openwisp-config代理正在运行并及时应用配置更改。您可以通过使用设置OPENWISP_MONITORING_AUTO_DEVICE_CONFIG_CHECK来选择禁用此检查的自动创建。
此检查定期运行,但也会在设备配置状态更改时触发,这确保检查能够快速响应网络中的事件,并在出现任何不符合预期的情况时及时通知用户。
设置
OPENWISP_MONITORING_SHORT_RETENTION_POLICY
类型: |
字符串 |
默认值: |
24h0m0s |
存储原始设备数据的默认保留策略。
这些数据仅用于评估设备最近的状态,长时间保留它不会带来很多好处,并且会消耗更多的磁盘空间。
OPENWISP_MONITORING_AUTO_PING
类型: |
布尔型 |
默认值: |
True |
是否为设备自动创建ping检查。
OPENWISP_MONITORING_PING_CHECK_CONFIG
类型: |
字典 |
默认值: |
{} |
此设置允许覆盖在openwisp_monitoring.check.classes.ping.DEFAULT_PING_CHECK_CONFIG中定义的默认ping检查配置。
例如,如果您只想更改ping的timeout,则可以使用
OPENWISP_MONITORING_PING_CHECK_CONFIG = {
'timeout': {
'default': 1000,
},
}
如果您要覆盖openwisp_monitoring.check.classes.ping.DEFAULT_PING_CHECK_CONFIG中定义的任何参数的默认值,超出最大值或最小值,则需要像以下那样覆盖maximum或minimum字段
OPENWISP_MONITORING_PING_CHECK_CONFIG = {
'timeout': {
'default': 2000,
'minimum': 1500,
'maximum': 2500,
},
}
注意:上述 最大值 和 最小值 仅用于验证 Check 对象的自定义参数。
OPENWISP_MONITORING_AUTO_DEVICE_CONFIG_CHECK
类型: |
布尔型 |
默认值: |
True |
此设置允许您选择是否为新注册的设备自动创建 config_applied 检查。默认情况下是启用的。
OPENWISP_MONITORING_CONFIG_CHECK_INTERVAL
类型: |
整型 |
默认值: |
5 |
此设置允许您配置 config_applied 使用的配置检查间隔。默认设置为 5 分钟。
OPENWISP_MONITORING_AUTO_CHARTS
类型: |
列表 |
默认值: |
('流量', 'wifi_clients', 'uptime', 'packet_loss', 'rtt') |
自动创建的图表。
OPENWISP_MONITORING_CRITICAL_DEVICE_METRICS
类型: |
dict 对象的 list |
默认值: |
[{'key': 'ping', 'field_name': 'reachable'}] |
认为是关键设备的指标
当值超过与这些指标类型相关的警报设置中“阈值值”字段定义的边界时,与该指标相关的设备的健康状况将移动到 CRITICAL 状态。
默认情况下,如果设备无法通过 ping 访问,它们将被标记为 CRITICAL。
OPENWISP_MONITORING_HEALTH_STATUS_LABELS
类型: |
字典 |
默认值: |
{'unknown': 'unknown', 'ok': 'ok', 'problem': 'problem', 'critical': 'critical'} |
此设置允许更改健康状况标签,例如,如果我们想用 online 代替 ok,用 offline 代替 critical,则可以使用以下配置
OPENWISP_MONITORING_HEALTH_STATUS_LABELS = {
'ok': 'online',
'problem': 'problem',
'critical': 'offline'
}
OPENWISP_MONITORING_MANAGEMENT_IP_ONLY
类型: |
布尔型 |
默认值: |
True |
默认情况下,只有管理 IP 将用于对设备执行主动检查。
如果设备正在使用共享层 2 网络连接到您的 OpenWISP 实例,因此 OpenWSP 服务器可以使用 last_ip 字段访问设备,则可以将此设置为 False。
OPENWISP_MONITORING_DEVICE_RECOVERY_DETECTION
类型: |
布尔型 |
默认值: |
True |
当启用设备恢复检测时,设备恢复会在设备再次联系 openwisp 系统时被发现(例如:获取配置校验和或发送监控指标)。
此功能默认启用。
如果您使用 OpenVPN 作为管理 VPN,您可能希望查看 openwisp-network-topology 中内置的类似集成:当 OpenVPN 链路的状态发生变化时(通过监视 OpenVPN 的状态信息检测),网络拓扑模块将触发监控检查。有关更多信息,请参阅:网络拓扑设备集成
OPENWISP_MONITORING_MAC_VENDOR_DETECTION
类型: |
布尔型 |
默认值: |
True |
指示是否通过在 OUI(组织唯一标识符)表中查找来使用硬件厂商信息补充 MAC 地址。
此功能默认启用。
OPENWISP_MONITORING_WRITE_RETRY_OPTIONS
类型: |
字典 |
默认值: |
见下文 |
# default value of OPENWISP_MONITORING_RETRY_OPTIONS:
dict(
max_retries=None,
retry_backoff=True,
retry_backoff_max=600,
retry_jitter=True,
)
在指标写入期间可恢复失败的重新尝试设置。
默认情况下,如果指标写入失败(例如:由于当时时间序列数据库负载过高),则操作将无限期地使用指数随机退避和最大延迟 10 分钟进行重试。
此功能使监控系统对暂时中断具有弹性,并有助于防止数据丢失。
有关这些设置的更多信息,请参阅 Celery 关于已知错误自动重试的文档。
OPENWISP_MONITORING_TIMESERIES_RETRY_OPTIONS
类型: |
字典 |
默认值: |
见下文 |
# default value of OPENWISP_MONITORING_RETRY_OPTIONS:
dict(
max_retries=6,
delay=2
)
在繁忙的系统上,与时间序列 DB 的通信有时会失败。时间序列 DB 后端将根据这些设置在任何异常上重试。延迟仅在第三次连续尝试后启动。
此设置不应与 OPENWISP_MONITORING_WRITE_RETRY_OPTIONS 混淆,后者用于配置将指标数据写入时序数据库的 celery 任务无限重试,而 OPENWISP_MONITORING_TIMESERIES_RETRY_OPTIONS 用于处理可能失败的时序数据库上的任何其他读写操作。
然而,这些重试是由 celery 处理的,而不是简单的 python 循环,如果问题持续存在,最终会放弃。
OPENWISP_MONITORING_TIMESERIES_RETRY_DELAY
类型: |
整型 |
默认值: |
2 |
此设置允许您配置在时序数据库中失败 3 次尝试后的重试延迟时间(以秒为单位)。
此重试设置用于重试机制,以使对时序数据库的请求具有弹性。
此设置独立于 celery 重试设置。
OPENWISP_MONITORING_DASHBOARD_MAP
类型: |
布尔型 |
默认值: |
True |
仪表板中的地理地图是否启用。此功能提供一张显示安装了设备的地理位置的地图,并提供了设备监控状态的视觉表示,这使得可以一瞥网络概览。
默认启用此功能,并依赖于来自 openwisp-utils 的设置 OPENWISP_ADMIN_DASHBOARD_ENABLED 被设置为 True(默认值)。
如果您不使用 OpenWISP 的地理功能,可以将其关闭。
OPENWISP_MONITORING_METRICS
类型: |
字典 |
默认值: |
{} |
此设置允许您定义额外的指标配置或覆盖在 openwisp_monitoring.monitoring.configuration.DEFAULT_METRICS 中定义的默认指标配置。
例如,如果您只想更改 clients 指标的 field_name 为 wifi_clients,则可以使用以下内容:
from django.utils.translation import gettext_lazy as _
OPENWISP_MONITORING_METRICS = {
'clients': {
'label': _('WiFi clients'),
'field_name': 'wifi_clients',
},
}
例如,如果您只想更改 memory 指标的默认警报设置,则可以使用以下内容:
OPENWISP_MONITORING_METRICS = {
'memory': {
'alert_settings': {'threshold': 75, 'tolerance': 10}
},
}
例如,如果您只想更改 config_applied 指标的警报通知,则可以使用以下内容:
from django.utils.translation import gettext_lazy as _
OPENWISP_MONITORING_METRICS = {
'config_applied': {
'notification': {
'problem': {
'verbose_name': 'Configuration PROBLEM',
'verb': _('has not been applied'),
'email_subject': _(
'[{site.name}] PROBLEM: {notification.target} configuration '
'status issue'
),
'message': _(
'The configuration for device [{notification.target}]'
'({notification.target_link}) {notification.verb} in a timely manner.'
),
},
'recovery': {
'verbose_name': 'Configuration RECOVERY',
'verb': _('configuration has been applied again'),
'email_subject': _(
'[{site.name}] RECOVERY: {notification.target} {notification.verb} '
'successfully'
),
'message': _(
'The device [{notification.target}]({notification.target_link}) '
'{notification.verb} successfully.'
),
},
},
},
}
或者,如果您想定义一个新的指标配置,然后可以在自定义代码(例如:自定义检查类)中调用它,可以这样操作:
from django.utils.translation import gettext_lazy as _
OPENWISP_MONITORING_METRICS = {
'top_fields_mean': {
'name': 'Top Fields Mean',
'key': '{key}',
'field_name': '{field_name}',
'label': '_(Top fields mean)',
'related_fields': ['field1', 'field2', 'field3'],
},
}
OPENWISP_MONITORING_CHARTS
类型: |
字典 |
默认值: |
{} |
此设置允许您定义额外的图表或覆盖在 openwisp_monitoring.monitoring.configuration.DEFAULT_CHARTS 中定义的默认图表配置。
例如,如果您想将流量图表更改为显示 MB(兆字节)而不是 GB(千兆字节),则可以使用以下内容:
OPENWISP_MONITORING_CHARTS = {
'traffic': {
'unit': ' MB',
'description': (
'Network traffic, download and upload, measured on '
'the interface "{metric.key}", measured in MB.'
),
'query': {
'influxdb': (
"SELECT SUM(tx_bytes) / 1000000 AS upload, "
"SUM(rx_bytes) / 1000000 AS download FROM {key} "
"WHERE time >= '{time}' AND content_type = '{content_type}' "
"AND object_id = '{object_id}' GROUP BY time(1d)"
)
},
}
}
或者,如果您想定义一个新的图表配置,然后可以在自定义代码(例如:自定义检查类)中调用它,可以这样操作:
from django.utils.translation import gettext_lazy as _
OPENWISP_MONITORING_CHARTS = {
'ram': {
'type': 'line',
'title': 'RAM usage',
'description': 'RAM usage',
'unit': 'bytes',
'order': 100,
'query': {
'influxdb': (
"SELECT MEAN(total) AS total, MEAN(free) AS free, "
"MEAN(buffered) AS buffered FROM {key} WHERE time >= '{time}' AND "
"content_type = '{content_type}' AND object_id = '{object_id}' "
"GROUP BY time(1d)"
)
},
}
}
如果您只想更改图表中使用的颜色,以下是操作方法:
OPENWISP_MONITORING_CHARTS = {
'traffic': {
'colors': ['#000000', '#cccccc']
}
}
OPENWISP_MONITORING_AUTO_CLEAR_MANAGEMENT_IP
类型: |
布尔型 |
默认值: |
True |
此设置允许您在设备离线时自动清除设备的 management_ip
。默认启用。
OPENWISP_MONITORING_API_URLCONF
类型: |
字符串 |
默认值: |
无 |
更改 django urls 的 urlconf 选项,以便将监控 API urls 指向另一个已安装的模块,例如 myapp.urls。(当您有一个单独的 API 实例时很有用。)
OPENWISP_MONITORING_API_BASEURL
类型: |
字符串 |
默认值: |
无 |
如果您有在另一个域上运行的 openwisp-monitoring API 服务器,您可以使用此选项更改 URL 的基础,这将使您能够将所有 API urls 指向您的 openwisp-monitoring API 服务器域,例如:https://mymonitoring.myapp.com。
注册/注销指标配置
OpenWISP Monitoring 提供通过实用函数 openwisp_monitoring.monitoring.configuration.register_metric 和 openwisp_monitoring.monitoring.configuration.unregister_metric 注册和注销指标配置。
register_metric
此函数用于从代码的任何位置注册一个新的指标配置。
参数 |
描述 |
metric_name: |
一个 str 定义指标配置的名称。 |
metric_configuration: |
一个 dict 定义指标的配置。 |
下面已显示示例用法。
from django.utils.translation import gettext_lazy as _
from openwisp_monitoring.monitoring.configuration import register_metric
# Define configuration of your metric
metric_config = {
'label': _('Ping'),
'name': 'Ping',
'key': 'ping',
'field_name': 'reachable',
'related_fields': ['loss', 'rtt_min', 'rtt_max', 'rtt_avg'],
'charts': {
'uptime': {
'type': 'bar',
'title': _('Uptime'),
'description': _(
'A value of 100% means reachable, 0% means unreachable, values in '
'between 0% and 100% indicate the average reachability in the '
'period observed. Obtained with the fping linux program.'
),
'summary_labels': [_('Average uptime')],
'unit': '%',
'order': 200,
'colorscale': {
'max': 100,
'min': 0,
'label': _('Reachable'),
'scale': [
[[0, '#c13000'],
[0.1,'cb7222'],
[0.5,'#deed0e'],
[0.9, '#7db201'],
[1, '#498b26']],
],
'map': [
[100, '#498b26', _('Reachable')],
[90, '#7db201', _('Mostly Reachable')],
[50, '#deed0e', _('Partly Reachable')],
[10, '#cb7222', _('Mostly Unreachable')],
[None, '#c13000', _('Unreachable')],
],
'fixed_value': 100,
},
'query': chart_query['uptime'],
},
'packet_loss': {
'type': 'bar',
'title': _('Packet loss'),
'description': _(
'Indicates the percentage of lost packets observed in ICMP probes. '
'Obtained with the fping linux program.'
),
'summary_labels': [_('Average packet loss')],
'unit': '%',
'colors': '#d62728',
'order': 210,
'query': chart_query['packet_loss'],
},
'rtt': {
'type': 'scatter',
'title': _('Round Trip Time'),
'description': _(
'Round trip time observed in ICMP probes, measuered in milliseconds.'
),
'summary_labels': [
_('Average RTT'),
_('Average Max RTT'),
_('Average Min RTT'),
],
'unit': _(' ms'),
'order': 220,
'query': chart_query['rtt'],
},
},
'alert_settings': {'operator': '<', 'threshold': 1, 'tolerance': 0},
'notification': {
'problem': {
'verbose_name': 'Ping PROBLEM',
'verb': 'cannot be reached anymore',
'level': 'warning',
'email_subject': _(
'[{site.name}] {notification.target} is not reachable'
),
'message': _(
'The device [{notification.target}] {notification.verb} anymore by our ping '
'messages.'
),
},
'recovery': {
'verbose_name': 'Ping RECOVERY',
'verb': 'has become reachable',
'level': 'info',
'email_subject': _(
'[{site.name}] {notification.target} is reachable again'
),
'message': _(
'The device [{notification.target}] {notification.verb} again by our ping '
'messages.'
),
},
},
}
# Register your custom metric configuration
register_metric('ping', metric_config)
以上示例将注册一个指标配置(命名为 ping),三个图表配置(命名为 rtt、packet_loss、uptime),如 charts 键中定义;两个通知类型(命名为 ping_recovery、ping_problem),如 notification 键中定义。
ping 指标的 AlertSettings 默认将使用在 alert_settings 键中定义的 threshold 和 tolerance。您始终可以通过 admin 覆盖它们并定义自己的自定义值。
注意:如果已注册具有相同名称(不要与 verbose_name 混淆)的指标配置,将引发 ImproperlyConfigured 异常。
如果您不需要注册新的指标,但需要更改现有指标配置的特定键,可以使用 OPENWISP_MONITORING_METRICS。
unregister_metric
此功能用于从代码中的任何位置注销指标配置。
参数 |
描述 |
metric_name: |
一个 str 定义指标配置的名称。 |
以下是一个示例用法。
from openwisp_monitoring.monitoring.configuration import unregister_metric
# Unregister previously registered metric configuration
unregister_metric('metric_name')
注意:如果相关的指标配置未注册,将引发 ImproperlyConfigured 异常。
注册/注销图表配置
OpenWISP 监控 提供了通过实用函数 openwisp_monitoring.monitoring.configuration.register_chart 和 openwisp_monitoring.monitoring.configuration.unregister_chart 注册和注销图表配置。使用这些函数,您可以从代码中的任何位置注册或注销图表配置。
register_chart
此功能用于从代码中的任何位置注册新的图表配置。
参数 |
描述 |
chart_name: |
定义图表配置名称的 str。 |
chart_configuration: |
定义图表配置的 dict。 |
下面已显示示例用法。
from openwisp_monitoring.monitoring.configuration import register_chart
# Define configuration of your chart
chart_config = {
'type': 'histogram',
'title': 'Histogram',
'description': 'Histogram',
'top_fields': 2,
'order': 999,
'query': {
'influxdb': (
"SELECT {fields|SUM|/ 1} FROM {key} "
"WHERE time >= '{time}' AND content_type = "
"'{content_type}' AND object_id = '{object_id}'"
)
},
}
# Register your custom chart configuration
register_chart('chart_name', chart_config)
注意:如果已注册具有相同名称(不要与 verbose_name 混淆)的图表配置,将引发 ImproperlyConfigured 异常。
如果您不需要注册新的图表,但需要更改现有图表配置的特定键,可以使用 OPENWISP_MONITORING_CHARTS。
unregister_chart
此功能用于从代码中的任何位置注销图表配置。
参数 |
描述 |
chart_name: |
定义图表配置名称的 str。 |
以下是一个示例用法。
from openwisp_monitoring.monitoring.configuration import unregister_chart
# Unregister previously registered chart configuration
unregister_chart('chart_name')
注意:如果相关的图表配置未注册,将引发 ImproperlyConfigured 异常。
注册新的通知类型
您可以使用 OpenWISP 通知中的 register_notification_type 函数定义自己的通知类型。有关更多信息,请参阅有关注册通知类型的相关 openwisp-notifications 部分。
注册新通知类型后,您必须使用 openwisp-notifications 中提供的“notify”信号来发送此类通知。
异常
TimeseriesWriteException
路径: openwisp_monitoring.db.exceptions.TimeseriesWriteException
如果在时序数据库中写入数据时出现任何失败,将引发此异常,并带有有用的错误消息,解释失败的原因。通常将捕获此异常,并在后台重试失败的写入任务,以确保在 Timeseries 服务器过载的情况下不会丢失数据。您可以在 OPENWISP_MONITORING_WRITE_RETRY_OPTIONS 中了解有关此重试机制的更多信息。
InvalidMetricConfigException
路径: openwisp_monitoring.monitoring.exceptions.InvalidMetricConfigException
如果指标配置损坏,将引发此异常。
InvalidChartConfigException
路径: openwisp_monitoring.monitoring.exceptions.InvalidChartConfigException
如果图表配置损坏,将引发此异常。
REST API
实时文档
这是一个通用的实时API文档(遵循OpenAPI规范),位于/api/v1/docs/。
可浏览的Web界面
此外,在浏览器中直接打开以下列出的任何端点,将显示Django-REST-Framework的可浏览API界面,这使得查找每个端点的详细信息变得更加容易。
端点列表
由于详细的说明包含在每个点的实时文档和可浏览网页中,因此这里我们只提供可用端点的列表,更多信息请打开浏览器中的端点URL。
检索设备图表和设备状态数据
GET /v1/monitoring/device/{pk}/?key={key}&status=true
设备状态使用的格式灵感来源于NetJSON DeviceMonitoring。
注意:如果请求没有?status=true
,则只会返回设备图表数据。
收集设备指标和状态
POST /v1/monitoring/device/{pk}/?key={key}&time={time}
如果数据是最新数据,则还可以传递额外的参数current。例如。
POST /v1/monitoring/device/{pk}/?key={key}&time={time}¤t=true
设备状态使用的格式灵感来源于NetJSON DeviceMonitoring。
注意:设备数据将以指定的时间存储在时间序列数据库中,该时间应采用以下格式:%d-%m-%Y_%H:%M:%S.%f
,否则将返回400错误响应。
如果请求没有传递时间参数,则将使用服务器本地时间。
添加time
参数以支持OpenWISP Monitoring Agent的弹性收集和发送数据。
信号
device_metrics_received
路径: openwisp_monitoring.device.signals.device_metrics_received
参数:
instance:已接收度量值的Device实例
request:HTTP请求对象
time:将保存度量的时间。如果没有提供,则使用服务器时间
current:数据是否刚刚收集,或者由于网络连接问题而以前收集但现在发送
当接收到的设备度量发送到DeviceMetric视图时(仅当使用HTTP POST时)会发出此信号。
信号在返回成功响应之前发出,如果响应不成功则不会发出。
health_status_changed
路径: openwisp_monitoring.device.signals.health_status_changed
参数:
instance:状态已更改的DeviceMonitoring实例
status:通过它更新了DeviceMonitoring的现有状态
只有当DeviceMonitoring对象的健康状态更新时,才会发出此信号。
threshold_crossed
路径: openwisp_monitoring.monitoring.signals.threshold_crossed
参数:
metric:定义在相关警报设置中的阈值的Metric对象
alert_settings:与Metric相关的AlertSettings
target:相关的Device对象
first_time:当第一次写入度量时,将其设置为true。之后应将其设置为false。
tolerance_crossed:如果度量已越过警报设置中配置的容差阈值,则将其设置为true。否则,将其设置为false。
first_time参数可用于避免启动不必要的操作。例如,发送恢复通知。
当在警报设置中定义的指标的阈值被越过时,将发出此信号。
pre_metric_write
路径: openwisp_monitoring.monitoring.signals.pre_metric_write
参数:
metric:需要存储在时序数据库中的指标对象
values:需要存储在时序数据库中的指标数据
time:与指标一起保存的时间
current:数据是否刚刚收集,或者由于网络连接问题而以前收集但现在发送
在将写操作发送到时序数据库之前,为每个指标发出此信号。
post_metric_write
路径: openwisp_monitoring.monitoring.signals.post_metric_write
参数:
metric:正在存储在时序数据库中的指标对象
values:正在存储在时序数据库中的指标数据
time:与指标一起保存的时间
current:数据是否刚刚收集,或者由于网络连接问题而以前收集但现在发送
在后台成功执行写操作后,为每个指标发出此信号。
管理命令
run_checks
此命令将执行所有设备的所有可用检查。默认情况下,检查由celery beat定期运行。您可以在设置中了解更多信息。
示例用法
cd tests/
./manage.py run_checks
migrate_timeseries
此命令触发时序数据库的异步迁移。
示例用法
cd tests/
./manage.py migrate_timeseries
监控脚本
现在为了监控包,监控脚本已被弃用。请参阅本文档从监控脚本迁移到监控包部分的迁移指南。
从监控脚本迁移到监控包
本节面向现有openwisp-monitoring用户。较旧的openwisp-monitoring版本使用了现在已被弃用的监控脚本,现在改用监控包。
如果您已在安装上创建了一个监控模板,那么openwisp-monitoring的迁移将更新该模板,并进行以下更改
所有脚本的文件名都将附加legacy-关键词,以便与新包捆绑的脚本区分。
/usr/sbin/legacy-openwisp-monitoring(之前为/usr/sbin/openwisp-monitoring)脚本将被更新,如果设备上安装了openwisp-monitoring包,则退出。
在您的设备上正确配置了openwisp-monitoring包之后,您可以从设备中删除监控模板。
我们建议一次删除一个设备上的监控模板,而不是删除模板。这确保了openwisp监控包配置的正确性,并且您不会错过任何监控数据。
注意:如果您已对openwisp-monitoring创建的默认监控模板进行了更改或您正在使用自定义监控模板,则在安装监控包之前,应从设备中删除此类模板。
扩展openwisp-monitoring
OpenWISP项目的核心价值观之一是软件可重用性,因此openwisp-monitoring提供了一套基础类,可以被导入、扩展和重用以创建衍生应用。
为了实现您自己的openwisp-monitoring版本,您需要执行本节其余部分描述的步骤。
如有疑问,测试项目中的代码和以下示例应用(例如sample_check、sample_monitoring、sample_device_monitoring)将指导您走向正确的方向:只需复制并修改该代码即可使openwisp-monitoring的基本衍生版本工作。
前提:如果您打算使用此模块的定制版本,我们建议您从一开始就使用它,因为将您的数据从默认模块迁移到扩展版本可能会很耗时。
1. 初始化自定义模块
要扩展任何openwisp-monitoring应用,您首先需要创建一个新的django应用,该应用将包含您对该openwisp-monitoring应用的定制版本。
django应用 nothing more than a python package(一个python脚本目录),在以下示例中,我们将这些django应用称为mycheck、mydevicemonitoring、mymonitoring,但您可以按照自己的意愿命名
django-admin startapp mycheck django-admin startapp mydevicemonitoring django-admin startapp mymonitoring
请注意,上述命令必须从您的PYTHON_PATH目录中调用,以便您可以将结果导入到项目中。
现在,您需要将mycheck添加到您的settings.py中的INSTALLED_APPS,并确保已从您的项目中移除了openwisp_monitoring.check
INSTALLED_APPS = [
# ... other apps ...
# 'openwisp_monitoring.check', <-- comment out or delete this line
# 'openwisp_monitoring.device', <-- comment out or delete this line
# 'openwisp_monitoring.monitoring' <-- comment out or delete this line
'mycheck',
'mydevicemonitoring',
'mymonitoring',
'nested_admin',
]
有关如何使用django项目和django应用的更多信息,请参阅django文档中的“教程:编写您的第一个Django应用”。
2. 安装openwisp-monitoring
安装(并将openwisp-monitoring添加到您的项目需求中)
pip install --U https://github.com/openwisp/openwisp-monitoring/tarball/master
3. 添加EXTENDED_APPS
将以下内容添加到您的settings.py
EXTENDED_APPS = ['device_monitoring', 'monitoring', 'check']
4. 添加openwisp_utils.staticfiles.DependencyFinder
将openwisp_utils.staticfiles.DependencyFinder添加到您的settings.py中的STATICFILES_FINDERS
STATICFILES_FINDERS = [
'django.contrib.staticfiles.finders.FileSystemFinder',
'django.contrib.staticfiles.finders.AppDirectoriesFinder',
'openwisp_utils.staticfiles.DependencyFinder',
]
5. 添加openwisp_utils.loaders.DependencyLoader
将openwisp_utils.loaders.DependencyLoader添加到您的settings.py中的TEMPLATES
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'OPTIONS': {
'loaders': [
'django.template.loaders.filesystem.Loader',
'django.template.loaders.app_directories.Loader',
'openwisp_utils.loaders.DependencyLoader',
],
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
}
]
6. 继承AppConfig类
请参阅测试项目示例应用中的以下文件
有关AppConfig概念的相关信息,请参阅django文档中的“Applications”部分。
7. 创建自定义模型
要扩展check应用,请参阅sample_check models.py文件。
要扩展monitoring应用,请参阅sample_monitoring models.py文件。
要扩展device_monitoring应用,请参阅sample_device_monitoring models.py文件。
注意:
有关如何使用、扩展或开发模型的相关疑问,请参阅django文档中的“Models”部分。
有关代理模型的问题,请参考代理模型。
8. 添加交换器配置
将以下内容添加到您的settings.py
# Setting models for swapper module
# For extending check app
CHECK_CHECK_MODEL = 'YOUR_MODULE_NAME.Check'
# For extending monitoring app
MONITORING_CHART_MODEL = 'YOUR_MODULE_NAME.Chart'
MONITORING_METRIC_MODEL = 'YOUR_MODULE_NAME.Metric'
MONITORING_ALERTSETTINGS_MODEL = 'YOUR_MODULE_NAME.AlertSettings'
# For extending device_monitoring app
DEVICE_MONITORING_DEVICEDATA_MODEL = 'YOUR_MODULE_NAME.DeviceData'
DEVICE_MONITORING_DEVICEMONITORING_MODEL = 'YOUR_MODULE_NAME.DeviceMonitoring'
将<YOUR_MODULE_NAME>替换为你的实际django应用名称(也称为app_label)。
9. 创建数据库迁移
创建并应用数据库迁移
./manage.py makemigrations ./manage.py migrate
有关更多信息,请参阅django文档中的“迁移”部分。
10. 创建自定义管理器
要扩展check应用,请参考sample_check admin.py文件。
要扩展monitoring应用,请参考sample_monitoring admin.py文件。
要扩展device_monitoring应用,请参考sample_device_monitoring admin.py文件。
要修改admin,你可以按照以下两种方式之一进行。
注意:有关django admin工作方式或如何定制的疑问,请参阅django文档中的“django admin网站”部分。
1. Monkey patching
如果你需要添加的更改相对较小,可以求助于猴子补丁。
例如,对于check应用,你可以这样做
from openwisp_monitoring.check.admin import CheckAdmin
CheckAdmin.list_display.insert(1, 'my_custom_field')
CheckAdmin.ordering = ['-my_custom_field']
同样,对于device_monitoring应用,你可以这样做
from openwisp_monitoring.device.admin import DeviceAdmin
DeviceAdmin.list_display.insert(1, 'my_custom_field')
DeviceAdmin.ordering = ['-my_custom_field']
同样,对于monitoring应用,你可以这样做
from openwisp_monitoring.monitoring.admin import MetricAdmin, AlertSettingsAdmin
MetricAdmin.list_display.insert(1, 'my_custom_field')
MetricAdmin.ordering = ['-my_custom_field']
AlertSettingsAdmin.list_display.insert(1, 'my_custom_field')
AlertSettingsAdmin.ordering = ['-my_custom_field']
2. 继承admin类
如果你需要引入重大更改,并且不想求助于猴子补丁,你可以按照以下步骤进行
对于check应用,
from django.contrib import admin
from openwisp_monitoring.check.admin import CheckAdmin as BaseCheckAdmin
from swapper import load_model
Check = load_model('check', 'Check')
admin.site.unregister(Check)
@admin.register(Check)
class CheckAdmin(BaseCheckAdmin):
# add your changes here
对于device_monitoring应用,
from django.contrib import admin
from openwisp_monitoring.device_monitoring.admin import DeviceAdmin as BaseDeviceAdmin
from swapper import load_model
Device = load_model('config', 'Device')
admin.site.unregister(Device)
@admin.register(Device)
class DeviceAdmin(BaseDeviceAdmin):
# add your changes here
对于monitoring应用,
from django.contrib import admin
from openwisp_monitoring.monitoring.admin import (
AlertSettingsAdmin as BaseAlertSettingsAdmin,
MetricAdmin as BaseMetricAdmin
)
from swapper import load_model
Metric = load_model('Metric')
AlertSettings = load_model('AlertSettings')
admin.site.unregister(Metric)
admin.site.unregister(AlertSettings)
@admin.register(Metric)
class MetricAdmin(BaseMetricAdmin):
# add your changes here
@admin.register(AlertSettings)
class AlertSettingsAdmin(BaseAlertSettingsAdmin):
# add your changes here
11. 创建根URL配置
请参考测试项目中的urls.py文件。
有关django中URL配置的更多信息,请参阅django文档中的“URL分发器”部分。
12. 创建celery.py
请参考测试项目中的celery.py文件。
有关celery在django中使用方式的更多信息,请参阅celery文档中的“使用Django的初学者指南”部分。
13. 导入Celery任务
在settings.py中添加以下内容以从device_monitoring应用导入celery任务。
CELERY_IMPORTS = ('openwisp_monitoring.device.tasks',)
14. 创建自定义命令run_checks
请参考测试项目中的run_checks.py文件。
有关django中自定义管理命令使用方式的更多信息,请参阅django文档中的“编写自定义django-admin命令”部分。
15. 导入自动测试
当基于此模块开发自定义应用时,同时导入和运行基本测试是个好主意,这样你可以确保你引入的更改不会破坏openwisp-monitoring的一些现有功能。
如果需要添加破坏性更改,可以覆盖基类中定义的测试以测试自己的行为。
有关扩展check应用的更多信息,请参阅sample_check应用的测试。
要扩展 device_monitoring 应用程序,请查看 sample_device_monitoring 应用的测试 以了解如何操作。
要扩展 monitoring 应用程序,请查看 sample_monitoring 应用的测试 以了解如何操作。
可以继承和扩展的其他基类
以下步骤不是必需的,而是为了进行更高级的定制。
DeviceMetricView
此视图主要负责显示 图表 和 状态。
完整的 Python 路径是: openwisp_monitoring.device.api.views.DeviceMetricView。
如果您想扩展此视图,您必须执行以下附加步骤。
步骤 1. 导入并扩展视图
# mydevice/api/views.py
from openwisp_monitoring.device.api.views import (
DeviceMetricView as BaseDeviceMetricView
)
class DeviceMetricView(BaseDeviceMetricView):
# add your customizations here ...
pass
步骤 2:从您的根 urls.py 文件中删除以下行
re_path(
'api/v1/monitoring/device/(?P<pk>[^/]+)/$',
views.device_metric,
name='api_device_metric',
),
步骤 3:在 urls.py 文件中添加一个指向您的自定义视图的 URL 路由
# urls.py
from mydevice.api.views import DeviceMetricView
urlpatterns = [
# ... other URLs
re_path(r'^(?P<path>.*)$', DeviceMetricView.as_view(), name='api_device_metric',),
]
贡献
请参阅 OpenWISP 贡献指南。
项目详情
下载文件
下载适用于您的平台的文件。如果您不确定选择哪个,请了解更多关于 安装包 的信息。
源分发
构建分发
openwisp-monitoring-1.0.4.tar.gz 的散列
算法 | 散列摘要 | |
---|---|---|
SHA256 | 66fa1f6fa0bf441a4104388b3cf98f061c1d605dd06a4dab3ba7dce15d693c14 |
|
MD5 | 4eb933ce23329093481761aee056a4d0 |
|
BLAKE2b-256 | 4b3a74bfcbb6c8411762060fbe9deba442a2d571d6f0ffd1efa01f39051fdef5 |
openwisp_monitoring-1.0.4-py2.py3-none-any.whl 的散列
算法 | 散列摘要 | |
---|---|---|
SHA256 | 61717c284d1dd9fb3d1bf1cdb6c9b80a010e04b4e33924647c4fb801abe4a031 |
|
MD5 | 9e2f6b3746d7a72b8ed173748c026fa5 |
|
BLAKE2b-256 | 0c2bb3c9c6e05b704b74288aa675dff1e2cabc1b78ef7b2e74255ff40ce58b58 |