Zabbix是一款开源的监控工具,使用广泛。然而,它竟然不支持将监控数据导出。为此,本文尝试分析一下,应该如何去做Zabbix的数据导出功能。
1. 首先应该搞清楚,Zabbix的监控数据都是放在哪里
2. 其次要搞清楚,有什么手段可以把这些监控数据拿出来
3. 最后,选择一种比较方便的手段来做
一、Zabbix的监控数据放在哪里
答案当然是放在MySQL数据库里,当然,根据用户的配置,也可能是PostgreSQL数据库等。但是表结构应该是一样的。
好吧,开始研究MySQL. 笔者的操作系统是CentOS,首先在上面装个MySQL Workbench吧。费了老大劲了!一直提示python-paramiko和python2-cypto在yum源里找不到。又懒得去找一个其他的yum源。于是最终在RPM Search的网站上找到了rpm包,download下来直接安装,解决问题了。也算一个小小的trouble shooting吧。
数据库里面最重要的几个表是:items, hosts, history, history_uint, history_str, history_text.
介绍概念:
- hosts - 就是主机
- item - 是每一个监控项,每一个监控项是属于一个host,比如,监控cpu_utilizaiton, host-1和host-2上的cpu_utilization是两个不同的item,具有不同的itemid
- 每个监控项所需要监控的数据的类型不同,有些是double型,有些是string型,也有些是int型
好了,如果各位使用 desc 命令去看表结构,又或者直接用select * 把数据从以上这几张表拉出来,就可以看出:
- 真正的监控数据是存放在history开头的几个表里的;
- history开头的表里有一个字段叫做itemid,它是一个数字;
- items表里重要的几项column如下:
- itemid
- type - int,double, string等,表明将来应该去哪个history表里找这个item的历史数据
- hostid - 表明是属于哪个host的,hostid是一个数字
- name - 描述性语言,比如:Processor Load (15 min average per core)
- key_ - 这个是用于将来在API里面搜索用的key值,比如system.cpu.load[percpu,avg15]
- hosts表里有hostid,host,和name这三个字段比较重要。其中,host和name比较接近。
二、如何取出监控数据?
由以上可以看出,我们主要的任务就是根据items表里面的描述,来把数据从history表里拉出来,就是完成任务啦。下面举个栗子,比如,我们要拿node-1这个host上的2天内的平均15分钟的CPU负载信息,应该怎么做呢?
第一步,要找出这个node-1上的cpu load average 15min 这个item的itemid到底是多少:
SELECT i.itemid, i.key_, h.host, h.hostid
FROM itmes as i join hosts as h
WHERE i.hostid=h.hostid
AND h.host='node-1.domain.tld'
AND i.key_='system.cpu.load[percpu,avg15]';
第二步,既然找到这个itemid了,比如是24021,那么就接着去history表里面找了:
SELECT from_unixtime(clock) as DateTime, value as CPU_load_avg_15min
FROM history
WHERE itemid=24021
AND from_unixtime(clock) >= '2017-03-15'
AND from_unixtime(clock) < '2017-03-17';
至此,任务完成。
三、还有什么方法可以取监控数据?
当然还有办法,最直接的就是用Zabbix API. 比如,最主要的就是关于Histroy和Items的API. 贴几个链接如下:
以上就是发curl命令了。有没有更简单的?也有啊。用别人封装好的库。你喜欢什么编程语言就用什么库。看如下:
1.
http://zabbix.org/wiki/Docs/api/libraries - 这是几乎所有语言库的集合
2.
https://github.com/blacked/py-zabbix - 这是其中一个Python库,笔者看了一下,似乎使用还比较方便。
最后的API和library的方法,笔者暂时没有时间去试了。将来如果有机会再来试验后补写笔记吧。
(完)