1 背景

    每个DB Server都有zabbix监控,除了异常情况的报警信息外,也会在日检、周检、月检等工作中用到zabbix的监控数据,对zabbix监控数据会做两种处理:1 数据分析(环比分析、最大值、最小值及平均值分析);2 主要检测项目折线图留档(为啥需要留档呢,因为zabbix监控过多服务器,监控数据仅保留半年到1年间)。
 
    关于 数据分析类的,已嵌入 日检邮件报告跟 月度报告 中,而 zabbix 监控图留档 一直没实现自动化,每个月都是人工取截图。刚好最近遇到 国庆db报告跟9月数据库报告,需要各种截图留档,然后触发了写个小脚本来自动下载 zabbix的监控图。
 


 
    如果转载,请注明博文来源: www.cnblogs.com/xinysu/   ,版权归 博客园 苏家小萝卜 所有。望各位支持!
 


2 写个小脚本

2.1 获取图片url

首先打开日常的zabbix监控图页面,点击 F12,然后点击,这个时候选中页面中的折线图,就可以看到 对应的HTML代码,最后点击对应的html代码右键 copy下图片的链接地址,即可知道 zabbix的监控图 的url。

 
    根据获取的url如下:
    http://company.moniter.com/chart.php?period=2592000&stime=20170901000000&itemids%5B0%5D=32571&type=0&updateProfile=1&profileIdx=web.item.graph&profileIdx2=32571&width=1778&sid=341eb79599119b85&screenid=&curtime=1508809467171
 
    这里边有几个参数说明下
  • stime 是监控的开始时间按照 '%Y%m%d%H%M%S' 的时间格式
  • period 是监控图的时长,从 stime开始要展示 多少秒 的监控数据
  • itemid[0] 是 监控项目在zabbix 数据库的 itemid 号
    • 这个如何查呢?首先根据 host表格,找到监控服务器的hostid,然后根据 items表格找到对应的监控id
    • select i.hostid,itemid,i.name,key_,i.description from items i join hosts h on i.hostid=h.hostid where h.name = 'hostname';
  • curtime这里可以不填写,但是注意 stime 加上 period秒数后,不要超过当前查询时间即可
  • width 为图片的长度
 
    根据需要,仅保留4个参数,这里注意 stime 加上 period秒数后,不要超过当前查询时间 ,简化后的url如下(把zabbix部署的域名或者网址IP替换掉 company.moniter.com):
    http://company.moniter.com/chart.php?period=2592000&stime=20170901000000&itemids[0]=32571&width=1778

2.2 脚步及测试

    小脚本实现的功能是:根据批量的itemid,自动下载图片到本地目录,并且重命名图片名称。
 
    代码实现如下:
 # -*- coding: utf-8 -*-
__author__ = 'xinysu'
__date__ = '2017/10/12 14:38'
import sys
import datetime
import http.cookiejar, urllib.request, urllib
from lxml import etree
import requests
class ZabbixChart(object):
def __init__(self, name, password):
url="http://company.monitor.com/index.php";
self.url = url
self.name = name
self.password = password
cookiejar = http.cookiejar.CookieJar()
urlOpener = urllib.request.build_opener(urllib.request.HTTPCookieProcessor(cookiejar))
values = {"name": self.name, 'password': self.password, 'autologin': 1, "enter": 'Sign in'}
data = urllib.parse.urlencode(values).encode(encoding='UTF8')
request = urllib.request.Request(url, data)
try:
urlOpener.open(request, timeout=10)
self.urlOpener = urlOpener
except urllib.request.HTTPError as e:
print(e)
def download_chart(self, image_dir,itemids,stime,etime):
# 此url是获取图片是的,请注意饼图的URL 和此URL不一样,请仔细观察!
url="http://company.monitor.com/chart.php";
# 折线图的大小
url_par={}
url_par={"width":1778, "height":300,"itemids":itemids}
# 开始日期、结束日期从str转换为datetime
stime = datetime.datetime.strptime(stime, "%Y-%m-%d")
etime=datetime.datetime.strptime(etime, "%Y-%m-%d")
# 计算period
diff_sec = etime - stime
period = diff_sec.days*24*3600 + diff_sec.seconds
url_par["period"] = period
# stime转换str
stime = stime.strftime('%Y%m%d%H%M%S')
url_par["stime"] = stime
key = url_par.keys()
data = urllib.parse.urlencode(url_par).encode(encoding='UTF8')
request = urllib.request.Request(url, data)
url = self.urlOpener.open(request)
image = url.read()
html = requests.get('http://company.monitor.com/history.php?action=showgraph&itemids[]={}'.format(itemids)).text
page = etree.HTML(html)
hostname_itemname = page.xpath('//div[@class="header-title"]/h1/text()')[0].split(':')
hostname = hostname_itemname[0]
hostname_itemname.pop(0)
itemname = '_'.join(hostname_itemname).replace('/','_')
imagename = "{}\{}_{}_{}_({}).png".format(image_dir,hostname,stime,etime.strftime('%Y%m%d%H%M%S'),itemname)
f = open(imagename, 'wb')
f.write(image)

根据写好的类,输入zabbix的登录帐号、监控图的起始跟结束时间、本地存放图片目录、itemid的list,运行后如下:

 # 登陆URL
username = "xinysu"
password = "passwd" # 图片的参数,该字典至少传入graphid
stime = "2017-09-01"
etime = "2017-10-01" # 用于图片存放的目录
image_dir = "E:\\03 WORK\\03 work_sql\\201709" #运行
b = ZabbixChart(username, password)
item_list =(35295,35328,38080,37992,38102,38014,35059,35022,42765,35024,35028,35035,35036,35044,35045,35046,35047,38248,36369,36370,36371,36372)
for i in item_list:
itemids = i
b.download_chart(image_dir,itemids,stime,etime)

随便输入的itemid 测试下载,实际需要根据监控需要过滤itemid,下载后在文件夹中显示如下:

zabbix自动截图留档_python版的更多相关文章

  1. zabbix自动发现功能实现批量web url监控

    需求: 现在有大量url需要监控,形式如http://www.baidu.com ,要求url状态不为200即报警. 需求详细分析: 大量的url,且url经常变化,现在监控用的是zabbix,如果手 ...

  2. eoLinker 新功能发布,增加了识别代码注释自动生成文档功能

    产品地址:https://www.eolinker.com开源代码:https://www.eolinker.com/#/os/download在线生成代码注释工具:http://tool.eolin ...

  3. 20165234 [第二届构建之法论坛] 预培训文档(Java版) 学习总结

    [第二届构建之法论坛] 预培训文档(Java版) 学习总结 我通读并学习了此文档,并且动手实践了一遍.以下是我学习过程的记录~ Part1.配置环境 配置JDK 原文中提到了2个容易被混淆的概念 JD ...

  4. [Ext JS 4]后台自动产生图档

    前言 [Ext JS 4] 实战之将chart导出为png, jpg 格式的文件 承接上一篇, 我们可以做到在Browser端打开一个Chart,并导出为png或是jpg 等格式的图档. 但实际的需求 ...

  5. Selenium2+python自动化67-用例失败自动截图【转载】

    前言: 装饰器其实就是一个以函数作为参数并返回一个替换函数的可执行函数 上一篇讲到用装饰器解决异常后自动截图,不过并没有与unittest结合,这篇把截图的装饰器改良了下,可以实现用例执行失败自动截图 ...

  6. 使用 Swagger 自动生成 ASP.NET Core Web API 的文档、在线帮助测试文档(ASP.NET Core Web API 自动生成文档)

    对于开发人员来说,构建一个消费应用程序时去了解各种各样的 API 是一个巨大的挑战.在你的 Web API 项目中使用 Swagger 的 .NET Core 封装 Swashbuckle 可以帮助你 ...

  7. Zabbix监控nginx-rtmp status(json版)

    与前面的文章 zabbix监控nginx-rtmp status(html版)区别只在于取值的页面不一样 http://127.0.0.1:81/control/get/all_streams sta ...

  8. testng 失败自动截图

    testng执行case failed ,testng Listener会捕获执行失败,如果要实现失败自动截图,需要重写Listener的onTestFailure方法 那么首先新建一个Listene ...

  9. selenium遇到异常自动截图

    最近要在框架中添加case失败时,要自动截图,主要又两种方式,思想都是在抛异常的时候,捕获到异常,并作页面截图处理.今天坐下总结. 一.第一种方式,重写onException方法 只针对webdriv ...

随机推荐

  1. 201521145048《Java程序设计管理》第一周学习总结

    1. 本周学习总结 学习并了解Java的发展与历史 在网上视频中学习Java 了解并区分JVM JRE JDK 将java与已学语言做比较,发现相同处 2. 书面作业 Q1.为什么java程序可以跨平 ...

  2. Java补码表和位移运算符

    在java中数据都是以二进制的形式保存的. 但是我们看到的数据怎么是10进制的? 因为java展示之前会自动调用toString()方法 这里以4位2进制为例,4位2进制只能表示16个数,即0-15. ...

  3. expect实现scp/ssh-copy-id非交互

    expect工具可以实现自动应答,从而达到非交互的目的. expect具体使用用法比较复杂,中文手册我正在翻译中,以后翻译完了做了整理再补.本文只有几个ssh相关最可能用上的示例. yum -y in ...

  4. 【Socket编程】通过Socket实现UDP编程

    通过Socket实现UDP编程 UDP通信: 1.UDP协议(用户数据报协议)是无连接.不可靠.无序的. 2.UDP协议以数据报作为数据传输的载体. 3.使用UDP进行数据传输时,首先需要将要传输的数 ...

  5. Microsoft Visual Studio调试监视器(MSVSMON.EXE)未能启动

    在启动VS2010项目时,遇到如图所示"Microsoft Visual Studio调试监视器(MSVSMON.EXE)未能启动"的问题. 原因是VS2010安装路径(我的是D: ...

  6. Linux入门之常用命令(4)vi编辑器

    vi分为三种模式 一般模式:删除字符.删除整行.复制粘贴等操作 编辑模式:i o a r进入 输入字符  Esc退出 命令行模式::或/ 将光标移动到最末行 搜寻数据 读取或替换 退出vi 显示行号 ...

  7. 使用C语言和Java分别实现冒泡排序和选择排序

    经典排序算法--冒泡和选择排序法 Java实现冒泡排序 基本思想是,对相邻的元素进行两两比较,顺序相反则进行交换,这样,每一趟会将最小或最大的元素放到顶端,最终达到完全有序,首先看个动图: 我们要清楚 ...

  8. java核心卷轴之泛型程序设计

    本文根据<Java核心卷轴>第十二章总结而来,更加详细的内容请查看<Java核心卷轴> 1. 泛型类型只能是引用类型,不可以使用基本数据类型. 2. 类型变量含义 E : 集合 ...

  9. Happy 2006 poj2773

    Happy 2006 Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 9049   Accepted: 3031 Descri ...

  10. hdu1251字典树递归算法

    统计难题 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 131070/65535 K (Java/Others) Total Subm ...