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

下面我们一起来看一个关于Zabbix与RRDtool绘图之创建每台主机每张图的rrd文件文章,希望这个例子可以给你有帮助。

RRDtool对于图形展示有多优秀,想必懂的人都知道。

兵马未动粮草先行。搞IT的得手册先行RRDtool的官方手册地址http://oss.oetiker.ch/rrdtool/doc/index.en.html 还有ailms整理的“RRDtool简体中文教程 v1.01” 该教材通俗易懂,先膜拜下!基本看了alims的 那个教程就对RRDtool清楚了。

我创建每台主机每张rrd文件用的是多线程,遍历每张图的时间大概12秒的样子,千张图的rrd文件创建大概2分钟的样子,主要受硬件的限制,如果

有更快的硬盘和更多的线程应该会快不少。rrd文件分类参考了cacti的风格,创建的rrd文件按主机ID分文件夹存放(hostid),每张图的名称

由图形ID和.rrd后缀组成(graphid.rrd)。



创建每个rrd文件的py模块如下,写的有点笨,有多少个不同的item组成的图形就得定义不同的创建函数,我找了一个下午都没有找到更好的传参方法,先

就用这个笨方法。记住有几种DS就需要写对应的Item函数,下面我只列出Item03,我是不会告诉你们我总共堆了24个一直到Item24

代码如下复制代码

#!/usr/bin/env python

#coding=utf-8

import rrdtool

def Item01(rrdname, startStamp, DS):

rrdtool.create(rrdname, '--step', '60', '--start', startStamp, DS[0],

'RRA:AVERAGE:0.5:1:3000',

'RRA:AVERAGE:0.5:5:4200',

'RRA:AVERAGE:0.5:24:3800',

'RRA:AVERAGE:0.5:240:4400',

'RRA:MAX:0.5:1:3000',

'RRA:MAX:0.5:5:4200',

'RRA:MAX:0.5:24:3800',

'RRA:MAX:0.5:240:4400',

'RRA:MIN:0.5:1:3000',

'RRA:MIN:0.5:5:4200',

'RRA:MIN:0.5:24:3800',

'RRA:MIN:0.5:240:4400')

def Item02(rrdname, startStamp, DS):

rrdtool.create(rrdname, '--step', '60', '--start', startStamp, DS[0],

DS[1],

'RRA:AVERAGE:0.5:1:3000',

'RRA:AVERAGE:0.5:5:4200',

'RRA:AVERAGE:0.5:24:3800',

'RRA:AVERAGE:0.5:240:4400',

'RRA:MAX:0.5:1:3000',

'RRA:MAX:0.5:5:4200',

'RRA:MAX:0.5:24:3800',

'RRA:MAX:0.5:240:4400',

'RRA:MIN:0.5:1:3000',

'RRA:MIN:0.5:5:4200',

'RRA:MIN:0.5:24:3800',

'RRA:MIN:0.5:240:4400')

def Item03(rrdname, startStamp, DS):

rrdtool.create(rrdname, '--step', '60', '--start', startStamp, DS[0],

DS[1], DS[2],

'RRA:AVERAGE:0.5:1:3000',

'RRA:AVERAGE:0.5:5:4200',

'RRA:AVERAGE:0.5:24:3800',

'RRA:AVERAGE:0.5:240:4400',

'RRA:MAX:0.5:1:3000',

'RRA:MAX:0.5:5:4200',

'RRA:MAX:0.5:24:3800',

'RRA:MAX:0.5:240:4400',

'RRA:MIN:0.5:1:3000',

'RRA:MIN:0.5:5:4200',

'RRA:MIN:0.5:24:3800',

'RRA:MIN:0.5:240:4400')

基本创建rrd文件的模块写好了,然后组织数据、调用函数传递相应的参数就可以了,下面是我写的一个多线程程序,同时启用16个线程工作(CPU线程数的2倍)。可更改线程数适应不同的硬件环境。

代码如下复制代码

#!/usr/bin/env python

#coding=utf-8

from zabbixget import Zabbix

from time import ctime

import threading

import createsub

import os

import time, datetime

def rrd_create(grinfo):

#如果主机存放rrd图形目录不存在,则创建

bashdir = "/opt/rrd/"

path = bashdir + grinfo[0]['hostid'] + "/"

if not os.path.exists(path):

os.makedirs(path)

rrdname = str(path + grinfo[0]['graphid'] + '.rrd')

timeDaysAgo = (datetime.datetime.now() - datetime.timedelta(days = 730))

startStamp = str(int(time.mktime(timeDaysAgo.timetuple())))

DS = []

for sub in grinfo:

DStmp = str('DS:' + sub['itemid'] + ':GAUGE:120:0:U')

DS.append(DStmp)

if len(DS) == 1: createsub.Item01(rrdname, startStamp, DS)

elif len(DS) == 2: createsub.Item02(rrdname, startStamp, DS)

elif len(DS) == 3: createsub.Item03(rrdname, startStamp, DS)

elif len(DS) == 4: createsub.Item04(rrdname, startStamp, DS)

elif len(DS) == 5: createsub.Item05(rrdname, startStamp, DS)

elif len(DS) == 6: createsub.Item06(rrdname, startStamp, DS)

elif len(DS) == 7: createsub.Item07(rrdname, startStamp, DS)

elif len(DS) == 8: createsub.Item08(rrdname, startStamp, DS)

elif len(DS) == 9: createsub.Item09(rrdname, startStamp, DS)

elif len(DS) == 10: createsub.Item10(rrdname, startStamp, DS)

elif len(DS) == 11: createsub.Item11(rrdname, startStamp, DS)

elif len(DS) == 12: createsub.Item12(rrdname, startStamp, DS)

elif len(DS) == 13: createsub.Item13(rrdname, startStamp, DS)

elif len(DS) == 14: createsub.Item14(rrdname, startStamp, DS)

elif len(DS) == 15: createsub.Item15(rrdname, startStamp, DS)

elif len(DS) == 16: createsub.Item16(rrdname, startStamp, DS)

elif len(DS) == 17: createsub.Item17(rrdname, startStamp, DS)

elif len(DS) == 18: createsub.Item18(rrdname, startStamp, DS)

elif len(DS) == 19: createsub.Item19(rrdname, startStamp, DS)

elif len(DS) == 20: createsub.Item20(rrdname, startStamp, DS)

elif len(DS) == 21: createsub.Item21(rrdname, startStamp, DS)

elif len(DS) == 22: createsub.Item22(rrdname, startStamp, DS)

elif len(DS) == 23: createsub.Item23(rrdname, startStamp, DS)

elif len(DS) == 24: createsub.Item24(rrdname, startStamp, DS)

def rrd_update(rrdfile, data):

pass

def hosts_get():

global zb

zb = Zabbix()

hostsName = zb.hostsid_get()

return hostsName

#遍历每台主机每张图的每个项目的最新10的值,后来考虑到api的压力改成每张图的最新值(减少了一个for循环变量items)

def items_get(host):

bashdir = "/opt/rrd/"

graphsName = zb.hostgraph_get(host.keys())

for graph in graphsName:

grapitem = zb.graphitems_get(graph['graphid'])

rrdfile = bashdir + host.values()[0] + "/" + str(graph['graphid']) + '.rrd'

if os.path.isfile(rrdfile):

data = []

for item in grapitem:

tmp = {'itemid':item['itemid'],'lastvalue':item['lastvalue']}

data.append(tmp)

rrd_update(rrdfile, data)

print data

else:

grinfo = []

for item in grapitem:

tmp = {'hostid': host.values()[0], 'graphid': graph['graphid'], 'itemid': item['itemid']}

grinfo.append(tmp)

rrd_create(grinfo)

def main():

threads = []

keys = hosts_get()

numkey = len(keys)

loop = 0

for i in range(0, numkey, 16):

nkeys = range(loop*16, (loop+1)*16, 1)

for i in nkeys:

if i >= numkey:

break

else:

t = threading.Thread(target=items_get, args=(keys[i],))

threads.append(t)

for i in nkeys:

if i >= numkey:

break

else:

threads[i].start()

for i in nkeys:

if i >= numkey:

break

threads[i].join()

loop = loop + 1

if __name__ == "__main__":

main()

上面还有更新数据的函数没有写完,用pass站位。过多的解释就不用了,对着相应的注释大家都应该看的懂。

(0)

相关推荐

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

    一起来看一个Zabbix与RRDtool绘图篇之用ZabbixAPI取监控数据技巧文章,希望下文可以帮助到各位。 经过一个星期的死磕,Zabbix取数据和RRDtool绘图都弄清楚了,做第一运维平台的 ...

  • zabbix配置监控项、创建触发器方法

    zabbix是一款监控告警软件,能监控服务器.网路设备等性能指标.监控项就是取实时最新的数据,触发器就是通过取到的监控项等值配置告警阀值,达到预警的目的. 操作方法 01 采集数据之前需要先配置应用集 ...

  • 如何在电脑端Excel中创建以条形图和折线图为组合的图表?

    相信很多小伙伴在日常办公中都会用到Excel,在其中如何才能创建以条形图和折线图为组合的图表呢?方法很简单,下面小编就来为大家介绍.具体如下:1. 首先,打开电脑上的Excel,在其中新建一个空白工作 ...

  • 如何创建 Nginx 虚拟主机(服务器块)

    服务器块,在 Nginx 中通常称为虚拟主机,允许您在一台服务器上托管多个网站,本文将教大家如何使用它们.Nginx旨在处理单个服务器和 IP 地址上的多个域,换句话说,如果您有一台用作Web 服务器 ...

  • win10“这台电脑”里的6个子文件夹怎么删除

    win10“这台电脑”里的6个子文件夹删除方法 对着开始点击右键点运行 在运行对话框中输入REGEDIT打开注册表编辑器 打开注册表编辑器后,定位到HKEY_LOCAL_MACHINE\SOFTWAR ...

  • 两台电脑怎么通过网线进行文件传输?

    电脑之间传输文件的方法很多种,接下来小编就给大家介绍一下两台电脑怎么通过网线进行文件传输.方法/步骤(一):共享设置1. 首先第一步打开电脑进入桌面后,鼠标右键单击任务栏网络图标,在弹出的菜单栏中点击 ...

  • 4台主机共用1台显示器同时输出信号教程

    没错, 今天小编要讲的是4台主机共用1台显示器同时输出信号教程, 平时1台主机带4个以上的显示器,相信大家都会弄.这里就反过来讲吧. 您可能在问,4台主机共用1台显示器同时输出信号怎么可能?只有您想不 ...

  • ps怎样创建透明/部分透明的图?

    我们有时可能需要用ps做不规则的图,或透明/部分透明的图. 操作方法 01 打开ps,依次点击文件--新建(或者利用快捷键ctrl+N).在弹出的属性选择中,填写适当的宽高度,在背景内容一栏,下拉,选 ...

  • 一台主机怎么设置成双屏显示?

    一台主机怎么设置成双屏显示?有时候我们可能会买一个扩展显示屏.现在Intel的CPU一般都集成了显卡,下面就给大家介绍一下如何通过设置集成显卡来让电脑内容在两个屏幕上显示,有时候我们可能会买一个扩展显 ...