Zabbix Top10頁面的製作

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數據對排障是有重要幫助的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章