感谢支持
我们一直在努力

Orabbix结合Python发送图形报表

在数据库的运维工作中,如果有一种运筹帷幄的感觉,那么其中一种方式就是看报表,比如喝着咖啡缓缓打开电脑,几十台,上百台的机器的负载明细都在眼底。如果某个地方出现了异常或者明显的抖动,在报表中也能够很清晰的显示出来。

目前这种情况还是很难实现,但是我们可以创造,之前的博文中也分析过了zabbix+orabbix的监控方式,还是存在很多亮点,在监控和定制功能上确实很强大,gc功能本身就很强大,但是扩展相对还是比较困难的。

首先我们来show一个概览图,这个是我们努力的目标。比如我们有几十台DB服务器,在开始工作前看看这个报表无疑会让你的工作针对性更强,哪些是需要重点关注的,哪些可能是潜在的问题,哪些问题迫在眉睫需要解决。

比如我们收到了下面的形式的邮件,描述的是4台DB在过去的24个小时内的等待事件,是不是相对来说感觉要清晰一些,当然我们还可以扩展其它的监控项。

要实现这个效果,着实不是一件容易的事情。
自己也是各方找了各种资料,也是在不断的失败经历中总算看到了一丝曙光。
首先要通过zabbix得到这个图片,大体的原理如下:
要得到一个基本的图形,除了基本指定长宽之外,最主要的就是graphid和screenid这两个属性

orabbix会把数据通过Jdbc得到后传给zabbix中的mysql表中,当需要取得对应的数据信息时,通过图形的方式还是要依赖screenid和graphid,在对应的表中进行关联得到数据的变化情况。

明白了基本原理,我们为了实现发送邮件中嵌入图形的需求,就需要把这些图形以附件的形式发送邮件。
按照这个思路还是有几件必须要完成的事情,
1.知道screenid和graphid和mysql表的关联关系
2.利用screenid和graphid得到对应的报表图片
3.把图形存储在临时目录下
4.把图形以附件的形式发送。

 第1步从网络中也会得到一些基本的信息,如果想得到更多的明细信息,似乎资源也有限,从我的实验来看,表关联关系和网络还是存在一定的差别,最后我是根据几个关联表的数据反复比较,最后也算是找出了规律,后面详细介绍表关联关系的细节。
 第2步通过screenid和graphid得到对应的报表图片,这个步骤是基于第1步,我们可以做基本的测试,得到图片的url格式,然后把一些非必须字段,比如长宽等给定一个默认值即可。
 第3步需要把图片能够下载下来存放在临时目录下,这个过程还是需要借助脚本来完成,这方面python的强大的web功能就派上了用场。可以基于根据url下载图片,然后把图片放入web服务器的默认路径下,比如/var/www/zabbix/reports
第4步就是借用邮件发送的功能来把图片放入附件中,这个部分还是使用python来做,把步骤3,步骤4的功能都独立成对应的功能点。
 看起来各个功能还是紧密关联的,但是我们可以把它拆分开来,比如我们可以直接实现第4步,模拟我们收到了图片的场景即可。
 得到图片graphid和screenid的部分,我们可以在已有的监控图中查看属性得到一个url样例,然后按照这个格式来进行修改定制。
 如果实现得都差不多了,再回到第一步来解析数据字典也不迟。解析数据字典的比偶关联有点懵懵懂懂,压根没有datamodel之类的详细文档,好在开源项目的表结构还是很清晰,还是能够基本看出字段,表名的含义,比较清晰,侥幸解析出来了关联关系。

详细的步骤阅读下一页的精彩内容: http://www.linuxidc.com/Linux/2015-08/122359p2.htm

下面关于Python的文章您也可能喜欢,不妨看看:

Python:在指定目录下查找满足条件的文件  http://www.linuxidc.com/Linux/2015-08/121283.htm

Python2.7.7源码分析  http://www.linuxidc.com/Linux/2015-08/121168.htm

无需操作系统直接运行 Python 代码  http://www.linuxidc.com/Linux/2015-05/117357.htm

CentOS上源码安装Python3.4  http://www.linuxidc.com/Linux/2015-01/111870.htm

《Python核心编程 第二版》.(Wesley J. Chun ).[高清PDF中文版] http://www.linuxidc.com/Linux/2013-06/85425.htm

《Python开发技术详解》.( 周伟,宗杰).[高清PDF扫描版+随书视频+代码] http://www.linuxidc.com/Linux/2013-11/92693.htm

Python脚本获取Linux系统信息 http://www.linuxidc.com/Linux/2013-08/88531.htm

在Ubuntu下用Python搭建桌面算法交易研究环境 http://www.linuxidc.com/Linux/2013-11/92534.htm

Python 语言的发展简史 http://www.linuxidc.com/Linux/2014-09/107206.htm

当然我们还是需要实现,意味着那些碰到的硬骨头都需要啃下来,大体的思路如下,每个步骤都有一些难点。   
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)

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

Python 的详细介绍:请点这里
Python 的下载地址:请点这里

本文永久更新链接地址:http://www.linuxidc.com/Linux/2015-08/122359.htm

赞(0) 打赏
转载请注明出处:服务器评测 » Orabbix结合Python发送图形报表
分享到: 更多 (0)

听说打赏我的人,都进福布斯排行榜啦!

支付宝扫一扫打赏

微信扫一扫打赏