orabbix结合python发送图形报表(二)

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
云数据库 RDS PostgreSQL,高可用系列 2核4GB
简介:    在之前的博文中分享过通过结合python来发送图形报表邮件的例子。http://blog.itpub.net/23718752/viewspace-1776784/ 当然我们还是需要实现,意味着那些碰到的硬骨头都需要啃下来,大体的思路如下,每个步骤都有一些难点。
   在之前的博文中分享过通过结合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)

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

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 &nbsp; 相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/mysql&nbsp;
目录
相关文章
|
Python
Python基础教程(第3版)中文版 第12章 图形用户界面 (笔记)
Python基础教程(第3版)中文版 第12章 图形用户界面 (笔记)
131 1
|
数据可视化 算法 JavaScript
基于图论的时间序列数据平稳性与连通性分析:利用图形、数学和 Python 揭示时间序列数据中的隐藏模式
本文探讨了如何利用图论分析时间序列数据的平稳性和连通性。通过将时间序列数据转换为图结构,计算片段间的相似性,并构建连通图,可以揭示数据中的隐藏模式。文章介绍了平稳性的概念,提出了基于图的平稳性度量,并展示了图分区在可视化平稳性中的应用。此外,还模拟了不同平稳性和非平稳性程度的信号,分析了图度量的变化,为时间序列数据分析提供了新视角。
341 0
基于图论的时间序列数据平稳性与连通性分析:利用图形、数学和 Python 揭示时间序列数据中的隐藏模式
在Python中,`tkinter`是一个用于创建图形用户界面(GUI)的标准库。
在Python中,`tkinter`是一个用于创建图形用户界面(GUI)的标准库。
|
开发框架 Python
Python的`pygame`库用于2D游戏开发,涵盖图形、音频和输入处理。
【6月更文挑战第21天】Python的`pygame`库用于2D游戏开发,涵盖图形、音频和输入处理。要开始,先通过`pip install pygame`安装。基本流程包括:初始化窗口、处理事件循环、添加游戏元素(如玩家和敌人)、响应用户输入、更新游戏状态及结束条件。随着项目发展,可逐步增加复杂性。
467 1
|
存储 前端开发 人机交互
23.Python 图形化界面编程
23.Python 图形化界面编程
314 2
|
Python 容器
Python与GUI编程:创建图形用户界面
Python的Tkinter库是用于构建GUI应用的内置工具,无需额外安装。它提供了丰富的控件,如按钮、文本框等,让用户通过图形界面与程序交互。创建GUI窗口的基本步骤包括:导入Tkinter库,创建窗口对象,设置窗口属性,添加控件(如标签和按钮),并使用布局管理器(如`pack()`或`grid()`)来组织控件的位置。此外,可以通过绑定事件处理函数来响应用户操作,例如点击按钮。Tkinter还有更多高级功能,适合开发复杂GUI应用。
|
存储 数据可视化 算法
最新Python-Matplotlib可视化(9)——精通更多实用图形的绘制,2024年最新小米面试题库
最新Python-Matplotlib可视化(9)——精通更多实用图形的绘制,2024年最新小米面试题库
最新Python-Matplotlib可视化(9)——精通更多实用图形的绘制,2024年最新小米面试题库
|
数据可视化 Linux 数据格式
`seaborn`是一个基于`matplotlib`的Python数据可视化库,它提供了更高级别的接口来绘制有吸引力的和信息丰富的统计图形。`seaborn`的设计目标是使默认图形具有吸引力,同时允许用户通过调整绘图参数来定制图形。
`seaborn`是一个基于`matplotlib`的Python数据可视化库,它提供了更高级别的接口来绘制有吸引力的和信息丰富的统计图形。`seaborn`的设计目标是使默认图形具有吸引力,同时允许用户通过调整绘图参数来定制图形。
`matplotlib`是Python中一个非常流行的绘图库,它提供了丰富的绘图接口,包括二维和三维图形的绘制。`Axes3D`是`matplotlib`中用于创建三维坐标轴的对象,而`plot_surface`则是用于在三维空间中绘制表面的函数。
`matplotlib`是Python中一个非常流行的绘图库,它提供了丰富的绘图接口,包括二维和三维图形的绘制。`Axes3D`是`matplotlib`中用于创建三维坐标轴的对象,而`plot_surface`则是用于在三维空间中绘制表面的函数。
|
人工智能 监控 数据可视化
bashplotlib,一个有趣的 Python 数据可视化图形库
bashplotlib,一个有趣的 Python 数据可视化图形库
210 4

推荐镜像

更多
下一篇
oss云网关配置