github項目地址: https://github.com/zhangrj/Zabbix-Top10
備註:該項目代碼粗糙,實現方式(sql查詢+數據展示)粗暴危險,不要用於對外開放的生產環境中。以後有時間我再進行改進。
1、項目結構及文件用途
TOP10
--include
------menu.inc.php.sample(web頁面添加二級菜單的示例配置文件)
--js
------echarts.min.js(echarts圖表庫)
------jquery.min.js(使用ajax請求數據)
--top10
------top10_config.php(數據庫配置文件)
------*.php(獲取top10數據並轉換爲json格式,如需自定義top10數據,只需更改腳本中數據庫查詢語句的監控項key值即可)
--top10.php(top10展示頁面)
2、使用方法
按Top10文件夾中的文件結構,將文件複製到zabbix-web服務器的/usr/share/zabbix/中,按照include文件夾中menu.inc.php.sample編輯/usr/share/zabbix/include/menu.inc.php,即在一級菜單“監測/Monitoring”下添加二級菜單“TOP10”:
[
'url' => 'top10.php',
'label' => _('TOP10')
],
編輯/top10/top10_config.php,填入數據庫相應信息 。刷新web頁面,即可看到如下效果:
3、工作原理
因爲我對zabbix api不熟悉,所以需要查詢top10時第一反應是從數據庫查詢,期望的top10數據應當包含以下信息:主機名稱、監控項名稱、最新監控數據。在觀察了zabbix的表結構後,確認需要使用如下三個表:hosts、items、history。
MariaDB [zabbix]> show tables;
+----------------------------+
| Tables_in_zabbix |
+----------------------------+
| acknowledges |
| actions |
| alerts |
| application_discovery |
| application_prototype |
| application_template |
| applications |
| auditlog |
| auditlog_details |
| autoreg_host |
| conditions |
| config |
| corr_condition |
| corr_condition_group |
| corr_condition_tag |
| corr_condition_tagpair |
| corr_condition_tagvalue |
| corr_operation |
| correlation |
| dashboard |
| dashboard_user |
| dashboard_usrgrp |
| dbversion |
| dchecks |
| dhosts |
| drules |
| dservices |
| escalations |
| event_recovery |
| event_suppress |
| event_tag |
| events |
| expressions |
| functions |
| globalmacro |
| globalvars |
| graph_discovery |
| graph_theme |
| graphs |
| graphs_items |
| group_discovery |
| group_prototype |
| history |
| history_log |
| history_str |
| history_text |
| history_uint |
| host_discovery |
| host_inventory |
| hostmacro |
| hosts |
| hosts_groups |
| hosts_templates |
| housekeeper |
| hstgrp |
| httpstep |
| httpstep_field |
| httpstepitem |
| httptest |
| httptest_field |
| httptestitem |
| icon_map |
| icon_mapping |
| ids |
| images |
| interface |
| interface_discovery |
| item_application_prototype |
| item_condition |
| item_discovery |
| item_preproc |
| items |
| items_applications |
| maintenance_tag |
| maintenances |
| maintenances_groups |
| maintenances_hosts |
| maintenances_windows |
| mappings |
| media |
| media_type |
| opcommand |
| opcommand_grp |
| opcommand_hst |
| opconditions |
| operations |
| opgroup |
| opinventory |
| opmessage |
| opmessage_grp |
| opmessage_usr |
| optemplate |
| problem |
| problem_tag |
| profiles |
| proxy_autoreg_host |
| proxy_dhistory |
| proxy_history |
| regexps |
| rights |
| screen_user |
| screen_usrgrp |
| screens |
| screens_items |
| scripts |
| service_alarms |
| services |
| services_links |
| services_times |
| sessions |
| slides |
| slideshow_user |
| slideshow_usrgrp |
| slideshows |
| sysmap_element_trigger |
| sysmap_element_url |
| sysmap_shape |
| sysmap_url |
| sysmap_user |
| sysmap_usrgrp |
| sysmaps |
| sysmaps_elements |
| sysmaps_link_triggers |
| sysmaps_links |
| tag_filter |
| task |
| task_acknowledge |
| task_check_now |
| task_close_problem |
| task_remote_command |
| task_remote_command_result |
| timeperiods |
| trends |
| trends_uint |
| trigger_depends |
| trigger_discovery |
| trigger_tag |
| triggers |
| users |
| users_groups |
| usrgrp |
| valuemaps |
| widget |
| widget_field |
+----------------------------+
144 rows in set (0.00 sec)
MariaDB [zabbix]> desc hosts;
+--------------------+---------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------------------+---------------------+------+-----+---------+-------+
| hostid | bigint(20) unsigned | NO | PRI | NULL | |
| proxy_hostid | bigint(20) unsigned | YES | MUL | NULL | |
| host | varchar(128) | NO | MUL | | |
| status | int(11) | NO | MUL | 0 | |
| disable_until | int(11) | NO | | 0 | |
| error | varchar(2048) | NO | | | |
| available | int(11) | NO | | 0 | |
| errors_from | int(11) | NO | | 0 | |
| lastaccess | int(11) | NO | | 0 | |
| ipmi_authtype | int(11) | NO | | -1 | |
| ipmi_privilege | int(11) | NO | | 2 | |
| ipmi_username | varchar(16) | NO | | | |
| ipmi_password | varchar(20) | NO | | | |
| ipmi_disable_until | int(11) | NO | | 0 | |
| ipmi_available | int(11) | NO | | 0 | |
| snmp_disable_until | int(11) | NO | | 0 | |
| snmp_available | int(11) | NO | | 0 | |
| maintenanceid | bigint(20) unsigned | YES | MUL | NULL | |
| maintenance_status | int(11) | NO | | 0 | |
| maintenance_type | int(11) | NO | | 0 | |
| maintenance_from | int(11) | NO | | 0 | |
| ipmi_errors_from | int(11) | NO | | 0 | |
| snmp_errors_from | int(11) | NO | | 0 | |
| ipmi_error | varchar(2048) | NO | | | |
| snmp_error | varchar(2048) | NO | | | |
| jmx_disable_until | int(11) | NO | | 0 | |
| jmx_available | int(11) | NO | | 0 | |
| jmx_errors_from | int(11) | NO | | 0 | |
| jmx_error | varchar(2048) | NO | | | |
| name | varchar(128) | NO | MUL | | |
| flags | int(11) | NO | | 0 | |
| templateid | bigint(20) unsigned | YES | MUL | NULL | |
| description | text | NO | | NULL | |
| tls_connect | int(11) | NO | | 1 | |
| tls_accept | int(11) | NO | | 1 | |
| tls_issuer | varchar(1024) | NO | | | |
| tls_subject | varchar(1024) | NO | | | |
| tls_psk_identity | varchar(128) | NO | | | |
| tls_psk | varchar(512) | NO | | | |
| proxy_address | varchar(255) | NO | | | |
| auto_compress | int(11) | NO | | 1 | |
+--------------------+---------------------+------+-----+---------+-------+
41 rows in set (0.00 sec)
MariaDB [zabbix]> desc items;
+-----------------------+---------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-----------------------+---------------------+------+-----+---------+-------+
| itemid | bigint(20) unsigned | NO | PRI | NULL | |
| type | int(11) | NO | | 0 | |
| snmp_community | varchar(64) | NO | | | |
| snmp_oid | varchar(512) | NO | | | |
| hostid | bigint(20) unsigned | NO | MUL | NULL | |
| name | varchar(255) | NO | | | |
| key_ | varchar(255) | NO | | | |
| delay | varchar(1024) | NO | | 0 | |
| history | varchar(255) | NO | | 90d | |
| trends | varchar(255) | NO | | 365d | |
| status | int(11) | NO | MUL | 0 | |
| value_type | int(11) | NO | | 0 | |
| trapper_hosts | varchar(255) | NO | | | |
| units | varchar(255) | NO | | | |
| snmpv3_securityname | varchar(64) | NO | | | |
| snmpv3_securitylevel | int(11) | NO | | 0 | |
| snmpv3_authpassphrase | varchar(64) | NO | | | |
| snmpv3_privpassphrase | varchar(64) | NO | | | |
| formula | varchar(255) | NO | | | |
| error | varchar(2048) | NO | | | |
| lastlogsize | bigint(20) unsigned | NO | | 0 | |
| logtimefmt | varchar(64) | NO | | | |
| templateid | bigint(20) unsigned | YES | MUL | NULL | |
| valuemapid | bigint(20) unsigned | YES | MUL | NULL | |
| params | text | NO | | NULL | |
| ipmi_sensor | varchar(128) | NO | | | |
| authtype | int(11) | NO | | 0 | |
| username | varchar(64) | NO | | | |
| password | varchar(64) | NO | | | |
| publickey | varchar(64) | NO | | | |
| privatekey | varchar(64) | NO | | | |
| mtime | int(11) | NO | | 0 | |
| flags | int(11) | NO | | 0 | |
| interfaceid | bigint(20) unsigned | YES | MUL | NULL | |
| port | varchar(64) | NO | | | |
| description | text | NO | | NULL | |
| inventory_link | int(11) | NO | | 0 | |
| lifetime | varchar(255) | NO | | 30d | |
| snmpv3_authprotocol | int(11) | NO | | 0 | |
| snmpv3_privprotocol | int(11) | NO | | 0 | |
| state | int(11) | NO | | 0 | |
| snmpv3_contextname | varchar(255) | NO | | | |
| evaltype | int(11) | NO | | 0 | |
| jmx_endpoint | varchar(255) | NO | | | |
| master_itemid | bigint(20) unsigned | YES | MUL | NULL | |
| timeout | varchar(255) | NO | | 3s | |
| url | varchar(2048) | NO | | | |
| query_fields | varchar(2048) | NO | | | |
| posts | text | NO | | NULL | |
| status_codes | varchar(255) | NO | | 200 | |
| follow_redirects | int(11) | NO | | 1 | |
| post_type | int(11) | NO | | 0 | |
| http_proxy | varchar(255) | NO | | | |
| headers | text | NO | | NULL | |
| retrieve_mode | int(11) | NO | | 0 | |
| request_method | int(11) | NO | | 0 | |
| output_format | int(11) | NO | | 0 | |
| ssl_cert_file | varchar(255) | NO | | | |
| ssl_key_file | varchar(255) | NO | | | |
| ssl_key_password | varchar(64) | NO | | | |
| verify_peer | int(11) | NO | | 0 | |
| verify_host | int(11) | NO | | 0 | |
| allow_traps | int(11) | NO | | 0 | |
+-----------------------+---------------------+------+-----+---------+-------+
63 rows in set (0.01 sec)
MariaDB [zabbix]> desc history;
+--------+---------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------+---------------------+------+-----+---------+-------+
| itemid | bigint(20) unsigned | NO | MUL | NULL | |
| clock | int(11) | NO | | 0 | |
| value | double(16,4) | NO | | 0.0000 | |
| ns | int(11) | NO | | 0 | |
+--------+---------------------+------+-----+---------+-------+
4 rows in set (0.01 sec)
以下是查詢system.cpu.util[,idle] top10的sql語句:
SELECT hosts.name, items.name, b.value
FROM (
SELECT *
FROM (
SELECT *
FROM history
WHERE itemid IN (
SELECT itemid
FROM items
WHERE key_ = 'system.cpu.util[,idle]'
AND hostid IN (
SELECT hostid
FROM hosts
WHERE available = 1
)
)
AND clock IN (
SELECT MAX(clock)
FROM history
GROUP BY itemid
)
ORDER BY clock
) a
GROUP BY a.itemid
ORDER BY a.value
LIMIT 10
) b
INNER JOIN items ON items.itemid = b.itemid
INNER JOIN hosts ON hosts.hostid = items.hostid;
如果需要查詢其他監控項,更改sql中的”key_”值即可。
取得數據後剩下的就是數據可視化了,不再贅述。
4、存在問題
1、top10頁面中的一級子菜單失效。因爲我本身沒有仔細研究zabbix的源代碼和api,只是本着能用即可的想法來做的,所以很粗糙,等有時間了再進行改進吧,我想這個功能使用原生的zabbix api開發應該不難,且視覺效果更好。
2、數據庫信息其實可以從/etc/zabbix/server.conf中讀取,而無需再次配置。
3、Top10數據直接從數據庫中讀取(且查詢語句效率不高,需要優化),很粗糙實現方式危險性也很大,好在我們的監控系統處在內網中,不建議將代碼直接用於開放的生產環境中。
5、後記
我覺得zabbix沒有自帶top10功能是有些遺憾的,在系統出現故障時top10數據對排障是有重要幫助的。