利用zabbix生成awstats日志分析图表并用Python调用zabbix API批量添加item

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介:

  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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#!/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

1
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[站点名,监控项]”,例如

wKioL1czRTXDNt-9AAA2gArdX7k085.png

能取到值,说明自定义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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
#!/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生成的靓图吧

wKiom1cz7y3gx8H_AAFbYDcLV3Q395.png

wKiom1cz77qSrYKWAAGSoXMhnv4994.png





     本文转自kai404 51CTO博客,原文链接:http://blog.51cto.com/kaifly/1772377,如需转载请自行联系原作者


相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
15天前
|
JSON 安全 API
如何使用Python开发API接口?
在现代软件开发中,API(应用程序编程接口)用于不同软件组件之间的通信和数据交换,实现系统互操作性。Python因其简单易用和强大功能,成为开发API的热门选择。本文详细介绍了Python开发API的基础知识、优势、实现方式(如Flask和Django框架)、实战示例及注意事项,帮助读者掌握高效、安全的API开发技巧。
41 3
如何使用Python开发API接口?
|
3天前
|
存储 API 数据库
使用Python和Flask构建简单的RESTful API
使用Python和Flask构建简单的RESTful API
|
8天前
|
JSON API 数据格式
如何使用Python开发1688商品详情API接口?
本文介绍了如何使用Python开发1688商品详情API接口,获取商品的标题、价格、销量和评价等详细信息。主要内容包括注册1688开放平台账号、安装必要Python模块、了解API接口、生成签名、编写Python代码、解析返回数据以及错误处理和日志记录。通过这些步骤,开发者可以轻松地集成1688商品数据到自己的应用中。
24 1
|
18天前
|
数据可视化 JavaScript 前端开发
Python中交互式Matplotlib图表
【10月更文挑战第20天】Matplotlib 是 Python 中最常用的绘图库之一,但默认生成的图表是静态的。通过结合 mpld3 库,可以轻松创建交互式图表,提升数据可视化效果。本文介绍了如何使用 mpld3 在 Python 中创建交互式散点图、折线图和直方图,并提供了详细的代码示例和安装方法。通过添加插件,可以实现缩放、平移和鼠标悬停显示数据标签等交互功能。希望本文能帮助读者掌握这一强大工具。
48 5
|
16天前
|
前端开发 API 开发者
Python Web开发者必看!AJAX、Fetch API实战技巧,让前后端交互如丝般顺滑!
在Web开发中,前后端的高效交互是提升用户体验的关键。本文通过一个基于Flask框架的博客系统实战案例,详细介绍了如何使用AJAX和Fetch API实现不刷新页面查看评论的功能。从后端路由设置到前端请求处理,全面展示了这两种技术的应用技巧,帮助Python Web开发者提升项目质量和开发效率。
31 1
|
22天前
|
JSON API 数据格式
如何使用Python和Flask构建一个简单的RESTful API。Flask是一个轻量级的Web框架
本文介绍了如何使用Python和Flask构建一个简单的RESTful API。Flask是一个轻量级的Web框架,适合小型项目和微服务。文章从环境准备、创建基本Flask应用、定义资源和路由、请求和响应处理、错误处理等方面进行了详细说明,并提供了示例代码。通过这些步骤,读者可以快速上手构建自己的RESTful API。
27 2
|
30天前
|
数据可视化 数据挖掘 Python
Seaborn 库创建吸引人的统计图表
【10月更文挑战第11天】本文介绍了如何使用 Seaborn 库创建多种统计图表,包括散点图、箱线图、直方图、线性回归图、热力图等。通过具体示例和代码,展示了 Seaborn 在数据可视化中的强大功能和灵活性,帮助读者更好地理解和应用这一工具。
41 3
|
12天前
|
安全 API 网络架构
Python中哪个框架最适合做API?
本文介绍了Python生态系统中几个流行的API框架,包括Flask、FastAPI、Django Rest Framework(DRF)、Falcon和Tornado。每个框架都有其独特的优势和适用场景。Flask轻量灵活,适合小型项目;FastAPI高性能且自动生成文档,适合需要高吞吐量的API;DRF功能强大,适合复杂应用;Falcon高性能低延迟,适合快速API开发;Tornado异步非阻塞,适合高并发场景。文章通过示例代码和优缺点分析,帮助开发者根据项目需求选择合适的框架。
39 0
|
1月前
|
JSON API 数据格式
使用Python和Flask构建简单的RESTful API
【10月更文挑战第12天】使用Python和Flask构建简单的RESTful API
46 1
|
1月前
|
数据采集 人工智能 自然语言处理
Python实时查询股票API的FinanceAgent框架构建股票(美股/A股/港股)AI Agent
金融领域Finance AI Agents方面的工作,发现很多行业需求和用户输入的 query都是和查询股价/行情/指数/财报汇总/金融理财建议相关。如果需要准确的 金融实时数据就不能只依赖LLM 来生成了。常规的方案包括 RAG (包括调用API )再把对应数据和prompt 一起拼接送给大模型来做文本生成。稳定的一些商业机构的金融数据API基本都是收费的,如果是以科研和demo性质有一些开放爬虫API可以使用。这里主要介绍一下 FinanceAgent,github地址 https://github.com/AI-Hub-Admin/FinanceAgent

热门文章

最新文章

下一篇
无影云桌面