orabbix结合python发送图形报表(二) (r6笔记第38天)

在之前的博文中分享过通过结合python来发送图形报表邮件的例子。 http://blog.itpub.net/23718752/viewspace-1776784/ 当然我们还是需要实现,意味着那些碰到的硬骨头都需要啃下来,大体的思路如下,每个步骤都有一些难点。 1.知道screenid和graphid和mysql表的关联关系 2.利用screenid和graphid得到对应的报表图片 3.把图形存储在临时目录下 4.把图形以附件的形式发送。 首先就是表的关联。这个部分还真没有什么捷径,最好的方法就是自己去根据里面的数据去找规律,至少从我的尝试,没有找到对应的datamodel之类的文档,不过这个开源的一个优点就是表定义还是很规范的,能够根据字面意思就基本能够看出来对应的数据含义。 我们可以根据图片的链接地址来倒推,链接地址一般为http://zabbix.xxx.com/chart2.php?graphid=524&screenid=22&width=400&height=156&period=86400 的形式,可以根据url看出screenid的部分,这个screenid其实就是做数据推理的关键。在MySQL的库中这个表的定义如下: [zabbix] [11:43:34]> desc screens +------------+---------------------+------+-----+ | Field | Type | Null | Key | +------------+---------------------+------+-----+ | screenid | bigint(20) unsigned | NO | PRI | | name | varchar(255) | NO | | | hsize | int(11) | NO | | | vsize | int(11) | NO | | | templateid | bigint(20) unsigned | YES | MUL | +------------+---------------------+------+-----+ 根据screenid就能够得到screen的基本信息 [zabbix] [09:56:49]> select screenid from screens where name='Oracle Graphs'; +----------+ | screenid | +----------+ |22 | +----------+ 然后根据screen的信息和对应的screen_item结合起来,screen_item和监控项是有关联的,比如我们的图形中某个监控图中需要显示active session数,inactive session数,那么这两个就是screen_item,他们有会对应相应的监控项,比如screenid=22,screenitem=86,就能找到对应的一个resourceid [zabbix] [10:51:22]> select resourceid,screenid,screenitemid from screens_items where resourceid=627; +------------+----------+--------------+ | resourceid | screenid | screenitemid | +------------+----------+--------------+ | 627 | 22 | 86 | +------------+----------+--------------+ 这个时候要多提一句,一般的资料中都会说这个resourceid就是graph的id,其实这个是相对的,在我的例子里面,我配置的监控项都是基于一个Oracle监控的模板,然后对于Oracle相关的服务器都添加这个模板进行统一管理,所以查看graphs的时候,其实graphs的templateid(非空)和resourceid是对应的。 [zabbix] [10:19:23]> select *from graphs where name like '%arch%'; +---------+-------------+-------+--------+----------+----------+------------+ | graphid | name | width | height | yaxismin | yaxismax | templateid | +---------+-------------+-------+--------+----------+----------+------------+ | 627 | Archivelog | 900 | 200 | 0.0000 | 100.0000 | NULL | | 665 | Archivelog | 900 | 200 | 0.0000 | 100.0000 | 627 | | 678 | Archivelog | 900 | 200 | 0.0000 | 100.0000 | 627 | | 770 | Archivelog | 900 | 200 | 0.0000 | 100.0000 | 627 | 所以我们知道某一个screenid,要得到对应的graphid,就可以使用下面的方式来查询。 select *from graphs where templateid in (select resourceid from screens_items where screenid=22) and templateid is not null; 这会得到一系列graphid的列表,我们可以根据templateid进行进一步的过滤。 这个过程完成的时候再回过头来就会发现,第1,2步我们都解决了。 第3步就是把对应的图片下载下来生成在对应的目录中。 当然这个方法也很多,python只是一种实现的思路。鉴于mysql+python的结合确实很轻巧和强大。当然python结合mysql还是需要对应的安装包的。 如果有yum就可以直接下载一个。 yum install MySQL-python -y 。。。。。 Installed: MySQL-python.x86_64 0:1.2.3-0.3.c1.1.el6 下载图片的部分,需要进行大量的url解析,也是术业有专攻。 可以使用下面的Python代码块来实现。 这个部分会在mysql进行表的关联,通过screen得到对应的screenid,然后进一步匹配,得到需要的graphid,我们在这个地方假定只需要做templateid=1047的graph的下载。 它会把属于对应的模板中所有相关的数据库实例的那个监控项对应的图片都给下载下来。

def get_graph(zabbix_host,username,password,screen,width,height,period,save_graph_path):
    screenid_list = []
    global html
    html = ''
    for i in mysql_query("select screenid from screens where name='%s'"%(screen)):
                for screenid in i:
                    graphid_list = []
                    #for c in mysql_query("select resourceid from screens_items where screenid='%s'"%(int(screenid))):
                    for c in mysql_query("select graphid from graphs where templateid=1047 "):
                                            for d in c:
                            graphid_list.append(int(d))
                    for graphid in graphid_list:
                        login_opt = urllib.urlencode({
                        "name": username,
                        "password": password,
                        "autologin": 1,
                        "enter": "Sign in"})
                        get_graph_opt = urllib.urlencode({
                        "graphid": graphid,
                        "screenid": screenid,
                        "width": width,
                        "height": height,
                        "period": period})
                        cj = cookielib.CookieJar()
                        opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))
                        login_url = r"http://%s/index.php"%zabbix_host
                        save_graph_url = r"http://%s/chart2.php"%zabbix_host
                        opener.open(login_url,login_opt).read()
                        data = opener.open(save_graph_url,get_graph_opt).read()
                        filename = "%s/%s.%s.png"%(save_graph_path,screenid,graphid)
                        html += '<img width="600" height="250" src="http://%s/%s/%s/%s.%s.png">'%(zabbix_host,save_graph_path.split("/")[len(save_graph_path.split("/"))-2],save_graph_path.split("/")[len(save_graph_path.split("/"))-1],screenid,graphid)
                        f = open(filename,"wb")
                        f.write(data)
                        f.close()

至于发送邮件,还是继续套用python的工具包来做。可以采用下面的方式来发送html格式的邮件。

def send_mail2(user,subject,content):
        me = mail_head+"<"+mail_user+"@"+mail_postfix+">"
        print me
       # msg = MIMEText(content,'plain','utf-8')
        msg = MIMEText(content,_subtype="html",_charset="utf8")
        #msg['Subject'] = Header(subject,'utf-8')
        msg['From'] = me
        msg['to'] = user
        global sendstatus
        global senderr
        try:
                smtp = smtplib.SMTP()
                smtp.connect(mail_host)
                #smtp.login(mail_user,mail_pass)
                smtp.sendmail(me,user,msg.as_string())
                smtp.close()
                print 'send ok'
                sendstatus = True
        except Exception,e:
                senderr = str(e)
                print senderr
                sendstatus = False
        logging.debug(user + ' ' + subject + ' ' + content)

这两个部分都结合起来,得到图片,然后作为附件发送邮件,整个监控发送图形报表的工作就基本完成了。 可能有些地方还是没有说的很清楚,我们可以继续讨论。我也在不断完善这个部分。

原文发布于微信公众号 - 杨建荣的学习笔记(jianrong-notes)

原文发表时间:2015-08-24

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏皮振伟的专栏

[linux][network]互联网后台模型

前言: 虽然话题的范围有点大,但是在这里作者不打算谈框架,侃架构。 这里也只是作者最熟悉的一种后台架构模型。 并发模型: 多进程模型: 来一个请求,设定环境...

29880
来自专栏点滴积累

geotrellis使用(三十二)大量GeoTiff文件实时发布TMS服务

前言 在上一篇文章中我讲了如何直接将Geotiff文件发布为TMS服务,在其中只讲了单幅Geotiff的操作,其实单幅这种量级的数据对Geotrellis来说就...

32970
来自专栏Android 研究

Android跨进程通信IPC之1——Linux基础

由于Android系统是基于Linux系统的,所以有必要简单的介绍下Linux的跨进程通信,对大家后续了解Android的跨进程通信是有帮助的,本篇的主要内容如...

23730
来自专栏Kirito的技术分享

浅析项目中的并发(二)

分布式遭遇并发 在前面的章节,并发操作要么发生在单个应用内,一般使用基于JVM的lock解决并发问题,要么发生在数据库,可以考虑使用数据库层面的锁,而在分布式...

404130
来自专栏Jack-Cui

Jetson TX1开发笔记(三):开发利器-Nsight Eclipse Edition

PC平台(Host): 虚拟机Ubuntu14.04 嵌入式平台(Target): Jeston TX1 一、NSight简介     Jetpack开...

31550
来自专栏智能大石头

ObjectDataSource选择业务对象列表为空的探讨

前天晚上,在一个页面上拖了一个ObjectDataSource,配置数据源时发现选择业务对象的列表没有列出当前项目的实体类,甚至连NewLife.CommonE...

19270

控制MongoDB中的集合分布

分片标记(Shard tagging)是MongoDB 2.2.0版中的一项新功能。通过对集合进行标记使其被强制写入到本地数据中心,也可以用来将某个集合固定到一...

24260
来自专栏智能算法

Jupyter notebook使用指南

一、Jupyter介绍 Jupyter Notebook是以web交互式的编程接口,是IPython notebook的升级版本。主要是针对python,另外...

2.8K80
来自专栏java达人

众里寻她千百度,蓦然回首,那bug却在灯火阑珊处

今天发现consul上的A服务处于failed状态,幸运的是服务部署了两份,以预防单点故障,做负载均衡,连忙查看http://ip:port/health输出,...

24090
来自专栏FreeBuf

代码审计之任意文件下载漏洞案例分享

继上次审计HDWiki之后,最近拿到一套新的源码Ear_Music_20180510_UTF8最新版进行审计,发现这套cms还是比较安全的,而当我审计遇到一处下...

16440

扫码关注云+社区

领取腾讯云代金券