用zabbix生成awstats图表以及通过Python调zabbix API自动化操作

awstats作为一款日志分析软件,功能不错,但是界面过于简单,也没有图表功能,这里我采取了一种变通的方法,将awstats的分析结果(pv、hits(文件数)、bandwidth、visits(独立ip))添加到zabbix,并通过zabbix生成趋势图表。

在前两篇文章中,我们队awstats的使用及其工作方式进行了简明扼要的介绍:awstats对每个站点进行分析之后,会生成一个“awstats012016.txt”格式的“数据库”文件;awstats的展示页面便是从该文件中取数据生成的。

1. 多server多站点情况下awstats日志分析

2. awstats CGI模式下动态生成页面缓慢的改进

这篇文章的思路就是从这个文本格式的‘数据库文件’中取得我们想要的数据,然后通过自定义的脚本将其添加到zabbix中,最终满足我们生成pv趋势图表的需求。

而完成此任务的关键就是分析类似‘awstats052016.txt’的数据文件的内容格式(ps:以笔者“多年”shell经验来看,”分析源文件格式“和“生成目标文件格式”这俩“格式”在日常的shell编程中占用了很大一部分时间。扯远了O(∩_∩)O~)

首先是自定义脚本作为zabbix的key,从对应的‘数据文件’中取得pv、hits、bandwidth、visits的值。用shell实现如下

cat web_pv.sh

#!/bin/sh
#从例如api/awstats052016.txt这样的awstats数据库文件里取得昨天的pv等统计(因为awstats本身就是统计到昨天的日志)
#by  ljk  20160506
#blog    http://kaifly.blog.51cto.com/

#shell脚本的$1 $2分别代表站点名称(格式如www或bbs)和统计项(pv 文件数 字节 独立ip)

basedir=‘/usr/local/awstats-7.4/result‘
date_f1=$(date +%m%Y -d ‘1 day ago‘)
date_f2=$(date +%Y%m%d -d ‘1 day ago‘)

cd $basedir/$1
#下面关于awk的用法中有一个小技巧,匹配到指定的项之后,停止继续搜索余下的内容。这对于体积较大的文件可以节约不少时间
content=`awk ‘$1 == "‘$date_f2‘" {{print} {exit}}‘ awstats$date_f1\.txt`
case $2 in
    "pages")
        echo $content|awk ‘{print $2}‘;;    #pv
    "hits")
        echo $content|awk ‘{print $3}‘;;    #hits/文件数
    "bandwidth")
        echo $content|awk ‘{print $4}‘;;    #bandwidth/字节
    "visits")
        echo $content|awk ‘{print $5}‘;;    #visits/独立ip
    *)
        echo "unknow value";;
esac

然后在awstats所在的server的zabbix的‘userparameter.conf’文件中添用户自定义key,并重启zabbix_agentd

UserParameter=web_pv[*],/bin/sh /usr/local/zabbix/etc/zabbix_agentd.conf.d/web_pv.sh $1 $2

接着在zabbix_server端通过zabbix_get命令尝试获取这些值,key格式为“web_pv[站点名,监控项]”,例如

能取到值,说明自定义key是ok的。

接下来就是在zabbix里添加各站点的item了,这里通过Python实现(zbx接口通过json传递数据,处理json python比shell方便太多了)

这里需要仔细阅读下zabbix的api文档https://www.zabbix.com/documentation/3.0/manual/api和查看zabbix数据库结构(确保万无一失嘛)

首先在zabbix里创建一个template,名为Template site PV,这一步手动创建即可

然后开始通过Python自动化添加items

cat shells/add_web-pv_item_to_zabbix.py

#!/bin/env python3
"""
将各站点的4种(pages,hits,bandwidth,visits)item添加/更新到zabbix的 ‘Template Site-PV‘
by ljk  20160507
"""
import os,requests

basedir=‘/usr/local/services/awstats-7.4/result/‘
items=[‘pages‘,‘hits‘,‘bandwidth‘,‘visits‘]

url=‘http://192.168.1.199/api_jsonrpc.php‘
zbx_api_headers={‘Content-Type‘:‘application/json-rpc‘}    #定义通过zabbix api操作时必带的header

#取得用于zabbix api认证的token,通过用户名密码请求api生成
#生成方式请参考api文档,有个这个token,可以省去账号密码认证
api_auth="738024dfda33cc6020fb1f5e3617" 

#这里我在前期实验的时候,手动添加了几个item了,所以这里先取出template里已经存在的item,以便后期创建时过滤掉这些item
exist_items_filter={    #通过zabbix api查询已经存在的web_pv[*,*]的item,这里是json格式的过滤条件
    "jsonrpc": "2.0",
    "method": "item.get",
    "params": {
        "output":[
            "name",
        ],
        "search": {
            "key_":"web_pv"
        }
    },
    "auth":api_auth,
    "id": 0
}
exist_items=requests.post(url,headers=zbx_api_headers,json=exist_items_filter)

os.chdir(basedir)
sites=os.listdir(path=‘.‘)

def create_item():
    for site in sites:
        for item in items:
            if site+‘-‘+item not in exist_items.text:
                #先给不同情况下的units和multiplier赋值
                if item==‘pages‘ or item==‘hits‘:
                    units=‘万‘
                    multiplier=0.0001
                elif item==‘bandwidth‘:
                    units=‘B‘
                    multiplier=1
                else:
                    units=‘‘
                    multiplier=1
                #定义创建item的json数据格式
                num=10
                create_item_post={
                    "jsonrpc": "2.0",
                    "method": "item.create",
                    "params": {
                        "name": site+‘,‘+item,
                        "key_": "www_pv["+site+‘,‘+item+"]",
                        "hostid": "10134",
                        "type": 0,
                        "value_type": 3,
                        "history": 7,
                        "delay": 28800,
                        "units": units,
                        "applications": [774],
                        "interfaceid": "0",
                        "formula": multiplier
                    },
                    "auth": api_auth,
                    "id": num
                }
                try:
                    create_item_result=requests.post(url,headers=zbx_api_headers,json=create_item_post)            
                    #打印处理每个条目的结果
                    print(‘{}-{}: return_code {} details {}‘.format(site,item,create_item_result.status_code,create_item_result.json))
                    num+=1
                except:
                    print(‘{}-{}: error‘.format(site,item))
                    import sys
                    sys.exit(255)
#create_item()

#update函数,其实是我在执行create_item()的时候将key的名字写错了,无奈在写一个update_item()吧
def update_item():
    num=100    #对应zbx api中的id字段,随意指定,确保每次调用api时该值不同即可(这里用自增的方式)

    #定义更新item的json数据格式
    update={
        "jsonrpc": "2.0",
        "method": "item.update",
        "params": {
            "itemid": "",
            "key_": ""
        },
        "auth": api_auth,
        "id": num
    }
    #取得site pv模板下所有错误的item(key以www_py开头的),hostid的值实际为template site PV模板的templateid
    wrong_items_filter={
            "jsonrpc": "2.0",
            "method": "item.get",
            "params": {
               "output":["key_","hostid"],
                "search": {"hostid":"10134","key_":"www_pv"}
            },
            "auth": api_auth,
            "id": 0
        }
    wrong_items=requests.post(url,headers=zbx_api_headers,json=wrong_items_filter).json()[‘result‘]    #wrong_items为list

    for wrong_item in wrong_items:
        if wrong_item[‘hostid‘] != ‘10119‘:    #img2从template site pv继承而来 所以这里每个item对应两条记录对应template site pv的hostid:10134和img2的hostid:10119,所以不需要修改img2的
            update[‘params‘][‘itemid‘]=wrong_item[‘itemid‘]
            update[‘params‘][‘key_‘]=wrong_item[‘key_‘].replace(‘www‘,‘web‘,1)            
            try:
                update_item_result=requests.post(url,headers=zbx_api_headers,json=update)
                print(‘{} ---- details {}‘.format(wrong_item[‘key_‘],update_item_result.json()))
                num+=1
            except:
                print(‘{}-{}: error‘.format(site,item))
                import sys
                sys.exit(255)
#update_item()

后续的批量生成image和生成screen都可以通过zbx 的API来完成,这里就不再列举了

ok,最后看一下zabbix生成的靓图吧

时间: 2024-10-08 07:47:53

用zabbix生成awstats图表以及通过Python调zabbix API自动化操作的相关文章

Python脚本之——API自动化框架总结

学完了Python脚本接口自动化之后,一直没有对该框架做总结,今天终于试着来做一份总结了. 框架结构如下图: 来说一下每个目录的作用: Configs:该目录下存放的是.conf,.ini文件格式的配置文件;文件里面的内容可以通过封装好的读写配置文件的类去获取. datas:该目录下存放一些测试用例数据,如:Excel libs:存放修改源码后的ddt.py和HTMLTestRunner文档,这个两个文档主要是为了让测试报告看起来更明了 logs: 存放脚本运行的日志文件 reports: 执行

Python数据分析:手把手教你用Pandas生成可视化图表

大家都知道,Matplotlib 是众多 Python 可视化包的鼻祖,也是Python最常用的标准可视化库,其功能非常强大,同时也非常复杂,想要搞明白并非易事.但自从Python进入3.0时代以后,pandas的使用变得更加普及,它的身影经常见于市场分析.爬虫.金融分析以及科学计算中. 作为数据分析工具的集大成者,pandas作者曾说,pandas中的可视化功能比plt更加简便和功能强大.实际上,如果是对图表细节有极高要求,那么建议大家使用matplotlib通过底层图表模块进行编码.当然,我

python 实现zabbix自动发送报表

实现将zabbix中的screens中的图片以邮件的方式发送到管理员邮箱 大家都知道zabbix的screens一般是定义管理员比较关注的监控指标好方便浏览,那么我们就根据管理员自定义的screens name获取相关图信息的. 简介 首先我们来看下图片的url (右击screens中随便一张图片,选复制图片地址) http://zabbix.xxx.com/chart2.php?graphid=524&screenid=16&width=400&height=156&up

使用PowerDesigner 15进行逆向工程生成数据库图表时,列的注释问题

上一章讲了对数据库进行逆向工程生成图表操作,可能会遇到无法生成注释的问题: 一.解决PowerDesigner逆向工程没有列注释 1.打开PowerDesigner 15,选择菜单:File→Reverse Engineer→Database 对数据库进行逆向工程生成PDM图表,选择一张表生成:                生成后双击图表,打开表属性,选择Columns选项,可以看到注释却是空的,而数据库里的表是有注释的            2.选择菜单:Database→Edit Curr

FusionCharts生成Flash图表常见问题FAQ

本文主要汇总了FusionCharts生成Flash图表时的一些常见问题(FAQ)以及解决方法/调试方法,欢迎交流! 问题描述:利用FusionCharts创建Flash图表时,能否直接从数组或recordset或webservice中提取数据? 解决方法:不可以从数组等中直接提取数据.因为 FusionCharts需要XML格式的数据.如果你从数组或recordset或webservice中提取数据的话,你需要通过Flash代码从这 些数据源中检索数据,然后在运行时状态下将它们转换成XML格式

Java导出Highcharts生成的图表为图片源码

本文转载自:http://blog.csdn.net/dengsilinming/article/details/7352054 需要的jar包: 需要的js文件:(可以通过http://www.highcharts.com/download下载highcharts对应的js文件) 下面是一些主要部分 web.xml <?xml version="1.0" encoding="UTF-8"?> <web-app version="2.5&

phantomjs server + highchart 在服务器端生成highchart图表图片

前言 当项目需要将一个highchart图表以邮件发送的时候,js+css形式的highcharts 图表肯定是不好做的,有查可以借助flash去执行js,但很麻烦,所以折中将highchart图表转为图片.并且这个邮件里可能有几十个这样的图表,在浏览器端生成图片再上传发送的方案也不可取,所以选择直接在服务端生成highchart图表. 服务端图表其实也有PChart之类的直接在服务端生成图片的,不过那图片效果实在不敢恭维.最后找到了phantomjs+highchart的方式生成highcha

python install zabbix.4.0

1.安装 MySQLdb 模块; #!/bin/bash #this is rpm python Environment depends on function depends_rpm(){ yum clean all  yum -y install gcc* python-devel python-pip mariadb mariadb-devel mariadb-server if [ $? -eq 0 ]   then        pip install MySQL-python==1.

python利用zabbix API添加监控

首先说一下坑的地方就是python2和python3的模块改变问题,当然精通python的可以略过.这个在网上百度一下吧,第二个是导入xlsx文件的时候需要xlrd模块,而这个模块最好跟着我下面的方法走,那个python2 就可以用我下边的脚本了. 1.安装xlrd读取Excel文件 1.1. 下载setuptools-38.2.4.zip,上传至zabbix服务器解压安装,下载地址:https://pypi.python.org/packages/69/56/f0f52281b5175e3d9