一、zabbix的简单介绍
1.什么是zabbix
zabbix是一个基于WEB界面的提供分布式系统监视以及网络监视功能的企业级的开源解决方案。
2.选用zabbix的原因
开源方案;提供win32和unix的高效率代理;容易掌握。
3.zabbix能干什么
zabbix能监视各种网络参数,保证服务器系统的安全运营;并提供柔软的通知机制以让系统管理员快速定位/解决存在的各种问题。我们在项目中前期主要是获取主机的一些CPU类型,内存,netWork,ip等主机的信息,告警、问题、事件等等一些基本信息,在我们的项目前端进行展示。
4.zabbix的组成
zabbix 由zabbix server和可选组件zabix agent两部分构成。
zabbix server可以通过SNMP,zabbix agent,ping,端口监视等方法提供对远程服务器/网络状态的监视,数据收集等功能,它可以运行在Linux, Solaris、Free BSD, Open BSD, OS X等平台之上。我们项目中就是运行在linux平台上的。zabbix agent需要安装在被监视的目标服务器上,它主要完成对硬件信息或与操作系统有关的内存,CPU等信息的收集。
zabbix server可以单独监视远程服务器的服务状态;同时也可以与zabbix agent配合,可以轮询zabbix agent主动接收监视数据(trapping方式),同时还可被动接收zabbix agent发送的数据(trapping方式)。 另外zabbix server还支持SNMP (v1,v2),可以与SNMP软件(例如:net-snmp)等配合使用
5.zabbix的架构图
可以通过分布式的方式安装部署代理的,具体的看下图:
6.zabbix功能
A.分布式监控网路,将监控的服务器(或网路)集中管理;
B.自动发现服务器和网络设备;
C.持polling和trapping机制:
轮询(polling)机制:这是最早的一种实现实时 Web 应用的方案。客户端以一定的时间间隔向服务端发出请求,以频繁请求的方式来保持客户端和服务器端的同步。
捕获(trapping)机制:该机制去接受代理服务器发送来的数据和接收监控数据。
D.有安全的用户认证功能;E.可灵活地分配用户权限;F.基于web的接口;G.可灵活地预定网络事件并使用邮件通知;H.高等级的资源监控;
等等。
监控指标:
- CPU负荷- 内存使用- 磁盘使用- 网络状况- 端口监视- 日志监视
等等,远不止上面列举的这些。
二、zabbix的api的使用
1.zabbix API简介
Zabbix api为批量操作,第三方软件集成以及其他可编程的操作提供可编程接口。所有的zabbix的移动客户端都是基于api开发的,甚至原生的web前端也是基于他之上的。它允许你通过json RPC协议来创建,获取,更新zabbix的对象,当然了你可以通过它做任何你想做的操作。
2.zabbix API提供的主要的功能
远程管理zabbix的配置;
远程检索配置和历史信息。
3.API的请求
Zabbix 采用的是Json-RPC实现的。这也就是说,zabbix请求和响应都是Json类型,传的参数的类型也应该是Json类型。
4.Java中的基本请求格式
ZabbixRequestrequest = ZabbixRequestBuilder.newBuilder()
"history.get")
"history", 0)
"output","extend")
"hostids", hostId)
"itemids", itemsId)
"time_from",startDate.getTime()/1000)
.paramEntry("time_till",endDate.getTime()/1000)
.build();
-method:定义的是真实执行的操作。例如:history.get(获取历史数据)等等。
-paramEntry:这里通过这个函数将json对象来作为method方法的参数。每个监控项需要的参数在zabbix的官网上都列举清清楚楚。
request.setAuth(auth);
response = zabbix.call(request);
JSONArray result = response.getJSONArray("result");
-result:便是我们需要的Json类型的数据。
-call函数:远程检索信息获取数据。
5.zabbix Java中的集成
A.调用zabix的方法:user.login,方法的参数是登陆的用户名和密码,去构建一个request请求如下:
ZabbixRequestrequest = ZabbixRequestBuilder.newBuilder()
.paramEntry("user",uname )
.paramEntry("password",upwd ).method("user.login")
.build();
user.login方法是登录认证方法。
B.用我们在配置文件里面配置的url和zabix的Request请求去构建httpRequest,再去执行方法登陆(或者获取数据),如下:
HttpUriRequesthttpRequest = org.apache.http.client.methods
.RequestBuilder.post().setUri(url)
"Content-Type","application/json")
new StringEntity(JSON.toJSONString
(request), ContentType.APPLICATION_JSON))
.build();
CloseableHttpClienthttpClient=HttpClients.custom().build()
CloseableHttpResponse response=
httpClient.execute(httpRequesest);
简单来说就是先构建一个zabixRequest请求,将zabix请求和URL构建http请求并且去执行,获取数据等等。
-url:是我们要访问的zabbix地址;
-Request:zabbixRequest类
6.数据的大致的流程
7.zabbix api 的使用
1)增删改查的操作
A. *.create:新增方法,将新增的字段放在param数里面例如paramEntry(“name”,”我的名字”),bulid一个request请求去执行增加。例如
JSONObject search = new JSONObject();
search.put("templateid",20045);
ZabbixRequestrequest = ZabbixRequestBuilder.newBuilder()
"host. create ")
"host","Linux Server"
"groups",50)
"templates", search)
.build()
B.*.delete:删除方法,例如host.delete,删除主机,可根据id删除多个主机。如下,hostIds是主机id的数组。
ZabbixRequestrequest = ZabbixRequestBuilder.newBuilder()
"host. delete ")
"hostids",hostIds
.build()
C.*.update:修改更新方法,例如host.update,更新主机的属性。
如下更新主机的状态:
ZabbixRequestrequest = ZabbixRequestBuilder.newBuilder()
"host.update ")
"hostids",10056)
"status",0)
.build()
D.*.get:查询方法,例如,host.get,history.get等等获取主机/历史数据。如下,根据主机id,监控项的id,获取一段时间浮点型的历史数据。
ZabbixRequestrequest = ZabbixRequestBuilder.newBuilder()
"history.get")
"history", 0)
"output","extend")
"hostids", hostId)
"itemids", itemsId)
"time_from",startDate.getTime()/1000)
.paramEntry("time_till", endDate.getTime()/1000)
.build();
2)有关联字段的关系
拿problem和event这两个为例子,problem的Object里面有eventid。这样有关联字段的,我们可以先查询eventid,通过事件的id数组去一起将事件下的problem取出。
3)没有关联字段关系
没有关联字段,在zabix Api里面总会有很多这样的表关系出现,这种的主要是对于zabix中的两个表没有一一对应关系字段,但是两张表的关系类似于关系表中的多对多的关系,所以我就取名字为多对多了。
多对多的关系数据查询时,zabix的api中提供了参数(例如:selectHosts)用于这种关系的数据的查询(zabix Api的get方法里面有的才可以查)。如下看一下根据主机id获取该主机在哪些主机组下面的request请求:
其中,extrend是默认输出所有的字段。
以此类推,如果output的属性改成extrend,也就是输出了host的所有数据和每一个hostid下面的所有的主机组的JSONObject对象。
三、使用的心得
就我自己使用zabbix的过程中,感觉zabbix的api封装的很好,使用起来也是非常方便的,对于每个监控项,他都提供了批量操作,用起来很是方便。其中的核心问题就是要先弄清楚host、hostGroup、event、alert、problem、trigger之间的关系,其中主机组和主机之间的是多对多的关系,problem和Event两个中problem对象有Eventid字段等等,具体的还得自己在学习中去慢慢体会,理解的时候可以像我一样与MYSQL对比学习,看看他们之间是一对一,一对多,还是多对多的关系。通过Java在zabbx中取数据,类似于将zabbix看成数据,进行操作,当你用的熟悉一点后,你会发现很多东西并没有你自己想的那么难。