需求:
对 mysql 输出进行 groug by 排序并执行 top 10 返回
前提:
当前需对 zabbix 执行自定义监控数据返回.
涉及到的表比较多, 下面作出简单的说明
hosts_groups 用于记录主机与组的 id 关系
mysql> desc hosts_groups; +-------------+---------------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------------+---------------------+------+-----+---------+-------+ | hostgroupid | bigint(20) unsigned | NO | PRI | NULL | | | hostid | bigint(20) unsigned | NO | MUL | NULL | | | groupid | bigint(20) unsigned | NO | MUL | NULL | | +-------------+---------------------+------+-----+---------+-------+ 3 rows in set (0.00 sec) mysql> select * from hosts_groups limit 1, 2; +-------------+--------+---------+ | hostgroupid | hostid | groupid | +-------------+--------+---------+ | 47 | 10047 | 1 | | 98 | 10048 | 1 | +-------------+--------+---------+ 2 rows in set (0.00 sec)
groups 表用于记录主机组信息
mysql> desc groups; +----------+---------------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +----------+---------------------+------+-----+---------+-------+ | groupid | bigint(20) unsigned | NO | PRI | NULL | | | name | varchar(64) | NO | MUL | | | | internal | int(11) | NO | | 0 | | | flags | int(11) | NO | | 0 | | +----------+---------------------+------+-----+---------+-------+ 4 rows in set (0.01 sec) mysql> select * from groups where name in ( 'QA','DEV','MOBILE','OPS') ; +---------+--------+----------+-------+ | groupid | name | internal | flags | +---------+--------+----------+-------+ | 13 | QA | 0 | 0 | | 14 | DEV | 0 | 0 | | 15 | MOBILE | 0 | 0 | | 20 | OPS | 0 | 0 | +---------+--------+----------+-------+ 4 rows in set (0.00 sec)
hosts 表用于记录主机信息
mysql> 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(128) | NO | | | | | available | int(11) | NO | | 0 | | | errors_from | int(11) | NO | | 0 | | | lastaccess | int(11) | NO | | 0 | | | ipmi_authtype | int(11) | NO | | 0 | | | 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(128) | NO | | | | | snmp_error | varchar(128) | NO | | | | | jmx_disable_until | int(11) | NO | | 0 | | | jmx_available | int(11) | NO | | 0 | | | jmx_errors_from | int(11) | NO | | 0 | | | jmx_error | varchar(128) | NO | | | | | name | varchar(128) | NO | MUL | | | | flags | int(11) | NO | | 0 | | | templateid | bigint(20) unsigned | YES | MUL | NULL | | | description | text | NO | | NULL | | +--------------------+---------------------+------+-----+---------+-------+ 33 rows in set (0.00 sec) mysql> select name, hostid from hosts where name = 'tps_mq-awdpn.vclound.com'; +--------------------------+--------+ | name | hostid | +--------------------------+--------+ | tps_mq-awdpn.vclound.com | 10685 | +--------------------------+--------+ 1 row in set (0.00 sec)
item 用于记录监控项
mysql> 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(255) | NO | | | | | hostid | bigint(20) unsigned | NO | MUL | NULL | | | name | varchar(255) | NO | | | | | key_ | varchar(255) | NO | | | | | delay | int(11) | NO | | 0 | | | history | int(11) | NO | | 90 | | | trends | int(11) | NO | | 365 | | | status | int(11) | NO | MUL | 0 | | | value_type | int(11) | NO | | 0 | | | trapper_hosts | varchar(255) | NO | | | | | units | varchar(255) | NO | | | | | multiplier | int(11) | NO | | 0 | | | delta | int(11) | NO | | 0 | | | 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 | | | delay_flex | varchar(255) | NO | | | | | params | text | NO | | NULL | | | ipmi_sensor | varchar(128) | NO | | | | | data_type | int(11) | NO | | 0 | | | 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(64) | NO | | 30 | | | 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 | | +-----------------------+---------------------+------+-----+---------+-------+ 47 rows in set (0.00 sec) mysql> select a.key_, a.itemid, a.hostid from items a, hosts b where a.hostid = b.hostid and b.name='tps_mq-awdpn.vclound.com' and a.key_ in ( 'net.if.in[eth0]', 'net.if.out[eth0]', 'vm.memory.size[total]', 'vm.memory.size[available]' ); +---------------------------+--------+--------+ | key_ | itemid | hostid | +---------------------------+--------+--------+ | net.if.in[eth0] | 90380 | 10685 | | net.if.out[eth0] | 90382 | 10685 | | vm.memory.size[available] | 90340 | 10685 | | vm.memory.size[total] | 90341 | 10685 | +---------------------------+--------+--------+ 4 rows in set (0.00 sec)
history 与 history_uint 表结构一样, 都是用于记录 items 的记录, 但 history_unit 记录的是通过 discovery 方式发现的 items. (具体信息参考 www.zabbix.com 官方资料)
mysql> 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.00 sec) mysql> select * from history_uint where itemid in ( 90380,90340 ) and clock > 1416278920; +--------+------------+------------+-----------+ | itemid | clock | value | ns | +--------+------------+------------+-----------+ | 90340 | 1416278980 | 3972816896 | 508372588 | | 90380 | 1416278960 | 8096 | 188420279 | +--------+------------+------------+-----------+ 2 rows in set (0.00 sec)
如果觉得复杂, 可以直接创建下面的表进行测试.
select b.name project, d.name hostname, c.key_, e.value value from hosts_groups a, groups b, items c, hosts d, history e where b.groupid = a. groupid and b.name in ( 'QA','DEV','MOBILE','OPS') and c.hostid = d.hostid and c.hostid = a.hostid and e.itemid = c.itemid and c.key_ = 'net.if.out[eth0]' and e.clock >= ( select unix_timestamp() - (60 * 60 )) order by value desc limit 1; +---------+------------------------------------------------+------------------+----------+ | project | hosts | mkey | value | +---------+------------------------------------------------+------------------+----------+ | DEV | test_project-wezqp.vclound.com | net.if.out[eth0] | 3848928 | | DEV | lamcloud-xmcds.vclound.com | net.if.out[eth0] | 2846344 | | DEV | seven-test-server-9srvb.vclound.com | net.if.out[eth0] | 1031008 | | DEV | test_1-eyhxk.vclound.com | net.if.out[eth0] | 906168 | | DEV | query-uk6hq.vclound.com | net.if.out[eth0] | 564352 | | DEV | bmqiu-pcmhw.vclound.com | net.if.out[eth0] | 447984 | | DEV | chao-data01.vclound.com | net.if.out[eth0] | 353504 | | DEV | linqu-qu4pt.vclound.com | net.if.out[eth0] | 300120 | | DEV | jenkins_server-vduzh.vclound.com | net.if.out[eth0] | 293976 | | DEV | bmqiu-4p59i.vclound.com | net.if.out[eth0] | 248040 | | MOBILE | bencui-hh-dev-web-xunqy.vclound.com | net.if.out[eth0] | 283720 | | MOBILE | mobile_configcenter_dev-vvcuf.vclound.com | net.if.out[eth0] | 146368 | | MOBILE | stonexie_test-nf7qi.vclound.com | net.if.out[eth0] | 141656 | | MOBILE | bendevota-xjraf.vclound.com | net.if.out[eth0] | 137200 | | MOBILE | mobile_configcenter_data_dev-tsgw9.vclound.com | net.if.out[eth0] | 121096 | | MOBILE | test_01-czths.vclound.com | net.if.out[eth0] | 108960 | | MOBILE | mobile_test_automation-xztwz.vclound.com | net.if.out[eth0] | 107872 | | MOBILE | mobiletest_webpage-9vs38.vclound.com | net.if.out[eth0] | 103304 | | MOBILE | mobiletest_webpage-9vs38.vclound.com | net.if.out[eth0] | 103304 | | MOBILE | mobiletest_webpage-9vs38.vclound.com | net.if.out[eth0] | 103304 | | OPS | db_li-wkq54.vclound.com | net.if.out[eth0] | 180656 | | OPS | pp-pe5vs.vclound.com | net.if.out[eth0] | 153704 | | OPS | pp-aytgj.vclound.com | net.if.out[eth0] | 140104 | | OPS | pp-vqjky.vclound.com | net.if.out[eth0] | 139544 | | OPS | db_li-nrziy.vclound.com | net.if.out[eth0] | 125160 | | OPS | chima-hh-dev-web-tivix.vclound.com | net.if.out[eth0] | 125152 | | OPS | fei-usv76.vclound.com | net.if.out[eth0] | 106448 | | OPS | data_mining_web-kfjhn.vclound.com | net.if.out[eth0] | 104776 | | OPS | data_mining_file-532ev.vclound.com | net.if.out[eth0] | 96656 | | OPS | johnny_liu-vtceh.vclound.com | net.if.out[eth0] | 90816 | | QA | voptest3-dbkfr.vclound.com | net.if.out[eth0] | 37872920 | | QA | b2c-zhongbo-xdmpm.vclound.com | net.if.out[eth0] | 2131664 | | QA | voptest6-spupv.vclound.com | net.if.out[eth0] | 756000 | | QA | backendtest-ihuri.vclound.com | net.if.out[eth0] | 640128 | | QA | backend-sd66e.vclound.com | net.if.out[eth0] | 637856 | | QA | voptest-3mspf.vclound.com | net.if.out[eth0] | 604704 | | QA | dev_pay_app-xg3gb.vclound.com | net.if.out[eth0] | 266360 | | QA | voptest4-rwikf.vclound.com | net.if.out[eth0] | 252808 | | QA | vop_test_02-k7jum.vclound.com | net.if.out[eth0] | 243696 | | QA | dev_vis_app02-rkbux.vclound.com | net.if.out[eth0] | 208536 | +---------+------------------------------------------------+------------------+----------+ 真实数据超过 10 万条, 上述数据只为显示而已. 如有兴趣, 执行创建数据自行进行测试
看下面的方法, (以真实数据进行测试咯) 所以返回值与上述表不一样
1. 获取一行的 top 数据
select b.name project, substring_index( group_concat( d.name order by e.value desc),',',1) as hostname from zabbix.hosts_groups a, zabbix.groups b, zabbix.items c, zabbix.hosts d, zabbix.history_uint e where b.groupid = a. groupid and b.name in ( 'QA','DEV','MOBILE','OPS') and c.hostid = d.hostid and c.hostid = a.hostid and e.itemid = c.itemid and c.key_ = 'net.if.out[eth0]' and e.clock >= ( select unix_timestamp() - 60) group by project; +---------+------------------------------------------+ | project | hostname | +---------+------------------------------------------+ | DEV | iclub-8y9hy.vclound.com | | MOBILE | mobile_test_automation-xztwz.vclound.com | | OPS | db_li-nrziy.vclound.com | | QA | b2c-zhongbo-xdmpm.vclound.com | +---------+------------------------------------------+ 4 rows in set, 2 warnings (0.11 sec)
2. 把其他列的数据也添加上去
select b.name project, substring_index( group_concat( d.name order by e.value desc),',',1) as hostname, substring_index( group_concat( c.key_ order by e.value desc),',',1) as newkey, substring_index( group_concat( e.value order by e.value desc),',',1) as value from zabbix.hosts_groups a, zabbix.groups b, zabbix.items c, zabbix.hosts d, zabbix.history_uint e where b.groupid = a. groupid and b.name in ( 'QA','DEV','MOBILE','OPS') and c.hostid = d.hostid and c.hostid = a.hostid and e.itemid = c.itemid and c.key_ = 'net.if.out[eth0]' and e.clock >= ( select unix_timestamp() - 60) group by project; +---------+------------------------------------------------+------------------+--------+ | project | hostname | newkey | value | +---------+------------------------------------------------+------------------+--------+ | DEV | simanhu-hh-dev-web-puzys.vclound.com | net.if.out[eth0] | 94528 | | MOBILE | mobile_configcenter_data_dev-tsgw9.vclound.com | net.if.out[eth0] | 4672 | | OPS | db_li-nrziy.vclound.com | net.if.out[eth0] | 4552 | | QA | dev_ebs_app_db-uya9f.vclound.com | net.if.out[eth0] | 671960 | +---------+------------------------------------------------+------------------+--------+ 4 rows in set, 3 warnings (0.12 sec)
3. 要创建 group by 方式的 top 10 , 需要创建一个临时表.
CREATE TABLE tinyint_asc ( zhi tinyint(3) unsigned NOT NULL default '0', PRIMARY KEY (zhi) ) ; INSERT INTO tinyint_asc VALUES (0),(1),(2),(3),(4),(5),(6),(7),(8),(9),(10),(11),(12),(13),(14),(15),(16),(17),(18),(19),(20),(21),(22),(23),(24),(25),(26),(27),(28),(29),(30),(31),(32),(33),(34),(35),(36),(37),(38),(39),(40),(41),(42),(43),(44),(45),(46),(47),(48),(49),(50),(51),(52),(53),(54),(55),(56),(57),(58),(59),(60),(61),(62),(63),(64),(65),(66),(67),(68),(69),(70),(71),(72),(73),(74),(75),(76),(77),(78),(79),(80),(81),(82),(83),(84),(85),(86),(87),(88),(89),(90),(91),(92),(93),(94),(95),(96),(97),(98),(99),(100),(101),(102),(103),(104),(105),(106),(107),(108),(109),(110),(111),(112),(113),(114),(115),(116),(117),(118),(119),(120),(121),(122),(123),(124),(125),(126),(127),(128),(129),(130),(131),(132),(133),(134),(135),(136),(137),(138),(139),(140),(141),(142),(143),(144),(145),(146),(147),(148),(149),(150),(151),(152),(153),(154),(155),(156),(157),(158),(159),(160),(161),(162),(163),(164),(165),(166),(167),(168),(169),(170),(171),(172),(173),(174),(175),(176),(177),(178),(179),(180),(181),(182),(183),(184),(185),(186),(187),(188),(189),(190),(191),(192),(193),(194),(195),(196),(197),(198),(199),(200),(201),(202),(203),(204),(205),(206),(207),(208),(209),(210),(211),(212),(213),(214),(215),(216),(217),(218),(219),(220),(221),(222),(223),(224),(225),(226),(227),(228),(229),(230),(231),(232),(233),(234),(235),(236),(237),(238),(239),(240),(241),(242),(243),(244),(245),(246),(247),(248),(249),(250),(251),(252),(253),(254),(255);
4. 最终结果, 按照 group by 输出 top 10 信息
select b.name project, substring_index(substring_index( group_concat( d.name order by e.value desc),',',f.zhi),',',-1) as hostname, substring_index(substring_index( group_concat( c.key_ order by e.value desc),',',f.zhi),',',-1) as newkey, substring_index(substring_index( group_concat( e.value order by e.value desc),',',f.zhi),',',-1) as value from zabbix.hosts_groups a, zabbix.groups b, zabbix.items c, zabbix.hosts d, zabbix.history_uint e, tinyint_asc f where b.groupid = a. groupid and b.name in ( 'QA','DEV','MOBILE','OPS') and c.hostid = d.hostid and c.hostid = a.hostid and e.itemid = c.itemid and c.key_ = 'net.if.out[eth0]' and e.clock >= ( select unix_timestamp() - 60) and f.zhi >= 1 and f.zhi <= 10 group by project, zhi; +---------+------------------------------------------------+------------------+--------+ | project | hostname | newkey | value | +---------+------------------------------------------------+------------------+--------+ | DEV | chao-data01.vclound.com | net.if.out[eth0] | 9152 | | DEV | garnettwang-hh-qa-web-xrw6d.vclound.com | net.if.out[eth0] | 6656 | | DEV | lamcloud-xmcds.vclound.com | net.if.out[eth0] | 6160 | | DEV | ckjiang-hh-qa-web-ry4jw.vclound.com | net.if.out[eth0] | 5824 | | DEV | waf-1-satp3.vclound.com | net.if.out[eth0] | 5504 | | DEV | waf-1-satp3.vclound.com | net.if.out[eth0] | 5504 | | DEV | test-pq9ms.vclound.com | net.if.out[eth0] | 5072 | | DEV | ashen-yjnrc.vclound.com | net.if.out[eth0] | 5000 | | DEV | ftp_server-rtnhd.vclound.com | net.if.out[eth0] | 4992 | | DEV | jessenli-4535z.vclound.com | net.if.out[eth0] | 4680 | | MOBILE | mobile_configcenter_data_dev-tsgw9.vclound.com | net.if.out[eth0] | 4864 | | MOBILE | bendevota-xjraf.vclound.com | net.if.out[eth0] | 4568 | | MOBILE | bencui-hh-dev-web-xunqy.vclound.com | net.if.out[eth0] | 4296 | | MOBILE | test_01-czths.vclound.com | net.if.out[eth0] | 4144 | | MOBILE | stonexie_test-nf7qi.vclound.com | net.if.out[eth0] | 4008 | | MOBILE | mobile_configcenter_dev-vvcuf.vclound.com | net.if.out[eth0] | 3600 | | MOBILE | mobile_test_automation-xztwz.vclound.com | net.if.out[eth0] | 3480 | | MOBILE | mobiletest_webpage-9vs38.vclound.com | net.if.out[eth0] | 3472 | | MOBILE | mobiletest_webpage-9vs38.vclound.com | net.if.out[eth0] | 3472 | | MOBILE | mobiletest_webpage-9vs38.vclound.com | net.if.out[eth0] | 3472 | | OPS | data_mining_file-532ev.vclound.com | net.if.out[eth0] | 74104 | | OPS | db_li-wkq54.vclound.com | net.if.out[eth0] | 4568 | | OPS | db_li-nrziy.vclound.com | net.if.out[eth0] | 4560 | | OPS | data_mining_file-qfctf.vclound.com | net.if.out[eth0] | 4088 | | OPS | kingtest-k56ne.vclound.com | net.if.out[eth0] | 3864 | | OPS | chima-hh-dev-web-tivix.vclound.com | net.if.out[eth0] | 3816 | | OPS | pp-aytgj.vclound.com | net.if.out[eth0] | 3736 | | OPS | pp-pe5vs.vclound.com | net.if.out[eth0] | 3624 | | OPS | pp-vqjky.vclound.com | net.if.out[eth0] | 3584 | | OPS | fei-usv76.vclound.com | net.if.out[eth0] | 3512 | | QA | dev_ebs_app_db-uya9f.vclound.com | net.if.out[eth0] | 549448 | | QA | b2c-zhongbo-xdmpm.vclound.com | net.if.out[eth0] | 529344 | | QA | zhaoantan-hh-qa-web-ar5tx.vclound.com | net.if.out[eth0] | 67784 | | QA | dev_vis_app02-rkbux.vclound.com | net.if.out[eth0] | 63560 | | QA | voptest-3mspf.vclound.com | net.if.out[eth0] | 40232 | | QA | vop_test_02-k7jum.vclound.com | net.if.out[eth0] | 35632 | | QA | vop_test_03-gdqb2.vclound.com | net.if.out[eth0] | 30120 | | QA | voptest8-jnusa.vclound.com | net.if.out[eth0] | 29648 | | QA | voptest7-zbvxy.vclound.com | net.if.out[eth0] | 27152 | | QA | dev_fcs_app02-mpa9a.vclound.com | net.if.out[eth0] | 27072 | +---------+------------------------------------------------+------------------+--------+ 40 rows in set, 30 warnings (1.17 sec)