Zabbix与RRDtool绘图篇之用ZabbixAPI取监控数据

  一起来看一个Zabbix与RRDtool绘图篇之用ZabbixAPI取监控数据技巧文章,希望下文可以帮助到各位。

  经过一个星期的死磕,Zabbix取数据和RRDtool绘图都弄清楚了,做第一运维平台的时候绘图取数据是直接从Zabbix的数据库取的,显得有点笨拙,不过借此也了解了Zabbix数据库结构还是有不少的收获。

  学习Zabbix的API官方文档少不了,官方文档地址链接https://www.zabbix.com/documentation/ 大家选择对应的版本就好了,不过2.0版本的API手册位置有点特别开始我还以为没有,后来找到了如下https://www.zabbix.com/documentation/2.0/manual/appendix/api/api 用ZabbixAPI取监控数据的思路大致是这样的,先获取所有监控的主机,再遍历每台主机获取每台主机的所有图形,最后获取每张图形每个监控对象(item)的最新的监控数据或者一定时间范围的数据。 下面按照上面的思路就一段一段的贴出我的程序代码:

  1、登录Zabbix获取通信token

  #!/usr/bin/env python

  #coding=utf-8

  import json

  import urllib2

  import sys

  ##########################

  class Zabbix:

  def __init__(self):

  self.url = "http://xxx.xxx.xxx.xxx:xxxxx/api_jsonrpc.php"

  self.header = {"Content-Type": "application/json"}

  self.authID = self.user_login()

  def user_login(self):

  data = json.dumps({

  "jsonrpc": "2.0",

  "method": "user.login",

  "params": {"user": "用户名", "password": "密码"},

  "id": 0})

  request = urllib2.Request(self.url,data)

  for key in self.header:

  request.add_header(key,self.header[key])

  try:

  result = urllib2.urlopen(request)

  except URLError as e:

  print "Auth Failed, Please Check Your Name And Password:",e.code

  else:

  response = json.loads(result.read())

  result.close()

  authID = response['result']

  return authID

  ##################通用请求处理函数####################

  def get_data(self,data,hostip=""):

  request = urllib2.Request(self.url,data)

  for key in self.header:

  request.add_header(key,self.header[key])

  try:

  result = urllib2.urlopen(request)

  except URLError as e:

  if hasattr(e, 'reason'):

  print 'We failed to reach a server.'

  print 'Reason: ', e.reason

  elif hasattr(e, 'code'):

  print 'The server could not fulfill the request.'

  print 'Error code: ', e.code

  return 0

  else:

  response = json.loads(result.read())

  result.close()

  return response

  2、获取所有主机

  #####################################################################

  #获取所有主机和对应的hostid

  def hostsid_get(self):

  data = json.dumps({

  "jsonrpc": "2.0",

  "method": "host.get",

  "params": { "output":["hostid","status","host"]},

  "auth": self.authID,

  "id": 1})

  res = self.get_data(data)['result']

  #可以返回完整信息

  #return res

  hostsid = []

  if (res != 0) and (len(res) != 0):

  for host in res:

  if host['status'] == '1':

  hostsid.append({host['host']:host['hostid']})

  elif host['status'] == '0':

  hostsid.append({host['host']:host['hostid']})

  else:

  pass

  return hostsid

  返回的结果是一个列表,每个元素是一个字典,字典的key代表主机名,value代表hostid


  3、获取每台主机的每张图形

  ###################################################################

  #查找一台主机的所有图形和图形id

  def hostgraph_get(self, hostname):

  data = json.dumps({

  "jsonrpc": "2.0",

  "method": "host.get",

  "params": { "selectGraphs": ["graphid","name"],

  "filter": {"host": hostname}},

  "auth": self.authID,

  "id": 1})

  res = self.get_data(data)['result']

  #可以返回完整信息rs,含有hostid

  return res[0]['graphs']

  注意传入的参数是主机名而不是主机id,结果也是由字典组成的列表。


  4、获取每张图的监控对象item

  #可以返回完整信息rs,含有hostid

  tmp = res[0]['items']

  items = []

  for value in tmp:

  if '$' in value['name']:

  name0 = value['key_'].split('[')[1].split(']')[0].replace(',', '')

  name1 = value['name'].split()

  if 'CPU' in name1:

  name1.pop(-2)

  name1.insert(1,name0)

  else:

  name1.pop()

  name1.append(name0)

  name = ' '.join(name1)

  tmpitems = {'itemid':value['itemid'],'delay':value['delay'],'units':value['units'],'name':name,'value_type':value['value_type'],

'lastclock':value['lastclock'],'lastvalue':value['lastvalue']}

  else:

  tmpitems = {'itemid':value['itemid'],'delay':value['delay'],'units':value['units'],'name':value['name'],'value_type':value['value_type'],

'lastclock':value['lastclock'],'lastvalue':value['lastvalue']}

  items.append(tmpitems)

  return items

  返回的数据已经包含了最新的一次监控数据的值和取值的时间戳,如果只需要取最新的监控数据,到这里其实就可以了,记得这次传入的参数是graphid。


  5、根据itemid取得更多的监控数据

  下面是取10条监控数据,可以任意更改参数获取更多的数据,全凭自己所需了。

  ################################################################

  #获取历史数据,history必须赋值正确的类型0,1,2,3,4 float,string,log,integer,text

  def history_get(self, itemid, i):

  data = json.dumps({

  "jsonrpc": "2.0",

  "method": "history.get",

  "params": { "output": "extend",

  "history": i,

  "itemids": itemid,

  "sortfield": "clock",

  "sortorder": "DESC",

  "limit": 10},

  "auth": self.authID,

  "id": 1})

  res = self.get_data(data)['result']

  return res


 

  上面的所有代码加起来就是一个Zabbix取数据的类。取出来的数据可以用RRDtool绘图或做其它用途了

时间: 2024-10-25 11:12:44

Zabbix与RRDtool绘图篇之用ZabbixAPI取监控数据的相关文章

Zabbix与RRDtool绘图篇之用RRDtool绘制图形

RRDtool在python里面的绘图函数是rrdtool.graph(),函数的各个参数代表什么意义就不讲了,主要讲思路,后面贴上绘图函 数的代码就会明白了.在成千上万的监控图的海洋里怎样用最短和最通用的方法将这些图片绘出了是个问题.我目前由于水平的限制能够想到的解决问题的方法是这 样的. 1.所有的图形都有有限的item,将相同数目item的图片用同一个函数来绘制. 2.一些特别的图形如内存堆栈图(stack),可以在该函数中写个判断语句单独配置相应的绘图参数. 3.关于item的颜色和绘制

Zabbix与RRDtool绘图篇之图形属性归档

我按要求分了两大类主机硬件类和应用信息类.主机类主要展示主与机器相关的监控图如网络.硬盘.CPU负载.内存等.应用信息大类又细分为Nginx_PHP.MySQL.Redis等.效果如下:     实现这些图形的分类第一步,数据库表的设计models. from django.db import models, connection # Create your models here. ################################################# class

Zabbix与RRDtool绘图之创建每台主机每张图的rrd文件

下面我们一起来看一个关于Zabbix与RRDtool绘图之创建每台主机每张图的rrd文件文章,希望这个例子可以给你有帮助. RRDtool对于图形展示有多优秀,想必懂的人都知道. 兵马未动粮草先行.搞IT的得手册先行RRDtool的官方手册地址http://oss.oetiker.ch/rrdtool/doc/index.en.html 还有ailms整理的"RRDtool简体中文教程 v1.01" 该教材通俗易懂,先膜拜下!基本看了alims的 那个教程就对RRDtool清楚了. 我

使用zabbix_sender主动发送监控数据到zabbix server

通常来讲,大部分的zabbix key都是预先在server端定义好抓取数据的行为(比如抓取脚本,时间间隔,单位),然后由server端按照这个行为去向agent索要数据,或者由agent按照这个行为往server端发送数据,但都逃不开"定时"这个概念,即抓取数据的时间间隔是固定的.有一种场景,需要监控的数据不是随时(比如cpu,load)都能拿到的,而是由某些程序不定时的产生(比如crontab,某些用户触发的数据),这时候再用常规的zabbix key解决起来就不是那么的优雅,而且

CYQ.Data 轻量数据层之路 使用篇三曲 MAction 取值赋值(十四)

上一篇:CYQ.Data 轻量数据层之路 使用篇二曲 MAction 数据查询(十三)   内容概要 本篇继续上一篇内容,本节介绍所有取值与赋值的相关操作.1:原生:像操作Row一样 2:扩展:对UI操作 GetFrom与SetTo 3:扩展:非UI操作 Get与Set   代码共同部分提前说明,我们假设以通过以下方法查询完一行数据 MAction action = new MAction(TableNames.Users);if (action.Fill("UserName='路过秋天'&qu

Vuejs第九篇之组件作用域及props数据传递实例详解_javascript技巧

本篇资料来于官方文档: http://cn.vuejs.org/guide/components.html 本教程是小编结合官方文档整理的一套更加细致,代码更多更全的教程,特别适合新手阅读. props数据传递 ①组件实例的作用域: 是孤立的,简单的来说,组件和组件之间,即使有同名属性,值也不共享. <div id="app"> <add></add> <del></del> </div> <script&g

解剖SQLSERVER 第五篇 OrcaMDF里读取Bits类型数据(译)

原文:解剖SQLSERVER 第五篇 OrcaMDF里读取Bits类型数据(译) 解剖SQLSERVER 第五篇  OrcaMDF里读取Bits类型数据(译) http://improve.dk/reading-bits-in-orcamdf/ Bits类型的存储跟SQLSERVER其他定长数据类型的存储很不一样.通常,所有定长列都会显示出来,一个条记录里定长数据部分的字段数据总是一个挨着一个 我们可以写入磁盘的最小数据单位是一个字节,存储位类型数据的天真的方法就是使用一整个(字节@)来存储每一

GSM Sniffing入门之软件篇:GSMTAP抓取与SMS(Short Message Service)

重点介绍如何利用50元左右的设备,抓包并还原SMS短信内容: ps:研究GSM Sniffing纯属个人兴趣,能抓SMS报文只是捡了个明文传输的漏子,切勿用于非法用途.就像sylvain说的,osmocomBB并不是为抓包而实现的,如果没有足够的GSM相关知识,想实现还原语音通话内容根本就无从下手. ---------------------------------------------------------------------------------------------------

Android UI效果之绘图篇(四)_Android

上一篇博文说到了Shader的五个子类 - BitmapShader - LinearGradient - RadialGradient - SweepGradient - ComposeShader 其中BitmapShader和LinearGradient已经做了说明,今天就把剩余的三个Shader补充一下 3. RadialGradient 先看下构造方法 /** @param centerX 中心X坐标 @param centerY 中心Y坐标 @param radius 半径 @par