1. 目的
zabbix获取某些groups的某个item的最大值。
2. 思路
获取数据无非是两种,一种是通过api,另一张则更暴力,通过database。我之前用api的较多,但是发现这个场景下面直接从database下面获取反而更容易编码。
3. 具体做法
逆向思维,历史数据存在history的几张表里,那个item类型是int,所以放在history_uint下面。现在想想还一部分在trend表里面。
history_uint的数据结构如下:
1 2 3 4 5 6 7 8
| +--------+---------------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +--------+---------------------+------+-----+---------+-------+ | itemid | bigint(20) unsigned | NO | MUL | NULL | | | clock | int(11) | NO | | 0 | | | value | bigint(20) unsigned | NO | | 0 | | | ns | int(11) | NO | | 0 | | +--------+---------------------+------+-----+---------+-------+
|
是根据itemid来存放的,那么怎么通过host group来获取itemid, 自然联系到items这个表,
1 2 3 4 5 6 7 8 9 10 11 12 13
| +-----------------------+---------------------+------+-----+---------+-------+ | 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 | | | | | `
|
select一个row:
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
| itemid: 10009 type: 0 snmp_community: snmp_oid: hostid: 10001 name: Number of processes key_: proc.num[] delay: 60 history: 7 trends: 365 status: 0 value_type: 3 trapper_hosts: units: multiplier: 0 delta: 0 snmpv3_securityname: snmpv3_securitylevel: 0 snmpv3_authpassphrase: snmpv3_privpassphrase: formula: 1 error: lastlogsize: 0 logtimefmt: templateid: NULL valuemapid: NULL delay_flex: params: ipmi_sensor: data_type: 0 authtype: 0 username: password: publickey: privatekey: mtime: 0 flags: 0 interfaceid: NULL port: description: Total number of processes in any state. inventory_link: 0 lifetime: 0 snmpv3_authprotocol: 0 snmpv3_privprotocol: 0 state: 0 snmpv3_contextname: evaltype: 0
|
再看下具体数据,那么大致就了解思路了。可以通过hostid来查itemid 。
然后就是怎么获取hostid了,数据库里面有hosts表,groups表,但是两者并没有直接联系的,关键联系表是hosts_groups,
1 2 3 4 5 6 7
| +-------------+---------------------+------+-----+---------+-------+ | 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 | | +-------------+---------------------+------+-----+---------+-------+
|
非常赞,通过groupid能直接找到hostid ,用sql 来表示就是
1
| select hostid from hosts_groups where groupid in (a, b ,c);"
|
因为我是多个group,所以用in来代替等于号。这样我们有了hostid。
再通过查询items表获取itemid, 这里要根据key_来过滤:
1
| select itemid from items where key_ like 'emsmob.connect' and hostid=xx
|
最后有了itemid以后就可以用过history_uint来查最大值:
1
| select max(value) from history_uint where itemid=%d and clock>1493598330
|
这里我加了个clock ,查一个月的数据,不加的话会很慢。加了以后查询一般在10s左右。。还是比较慢。但是比不加要好多了。
clock可以用date命令来找到:
1
| date -d "2017-05-01 00:25:30" +%s
|
把上面所有要素连起来就是完整程序了,再用csv处理一下,输出成csv格式的~