利用python3爬取特定数据,zabbix通过自定义key自动添加item

OS:CentOS 7
工具:Zabbix,Grafana,Python3
目的:代理服务器并发连接数有上限,当总的并发连接数达到上限时,监控是哪一个客户端导致的
总并发数和客户端并发数,服务器仅提供网页版的数据,所以需要使用python爬取相关数据
传送给zabbix进行监控

一,Python脚本
1,将ip和并发连接数保存成文件 main_getcon.py

由于最开始使用该脚本直接把数据发送给zabbix,而且zabbix仅能识别json结构的数据,所以输出是json.dump,后期改成保存成文件,相关部分懒得改回来了

#!/usr/bin/python  
# -*- coding: utf-8 -*- 
import requests
import re
from requests.auth import AuthBase
from requests.auth import HTTPBasicAuth
import ssl
import json
import sys

#全局取消https证书验证(因为服务器的证书已经过期,所以取消证书盐城才能抓取页面)
ssl._create_default_https_context = ssl._create_unverified_context

#关闭https证书异常警告(同上)
requests.packages.urllib3.disable_warnings()

#获取web页面
userName = 'username'
passWord = 'password'
dstUrl = "https://url"
auth = HTTPBasicAuth(userName,passWord)
r = requests.get(url=dstUrl,auth=auth,verify=False).content

#提取IP以及连接数信息  (提取{172.16.一到三位数字.一到三位数字 +若干空格+至少一位数字+若干空格+至少一位数字}这样的数据到list)
jihe = re.findall(r'172\.16\.[0-9]{1,3}\.[0-9]{1,3} *[0-9]{1,} *[0-9]{1,}', str(r))

#提取最大连接数(提取{1到4位数字+若干空格+Proxy-Connections结尾})
pre_number = re.findall(r'[0-9]{1,4} *Proxy-Connections', str(r))
#提取数字
numCons = re.findall(r'[0-9]{1,4}', str(pre_number))


ipaddr = []
dict_ipindex = {}

for i in range(len(jihe)):
	ipaddr.append({"{#BCINDEX}": i,"{#IPADDRESS}": jihe[i].split()[0],"{#CONS}": jihe[i].split()[1],"{#OPENCONS}": jihe[i].split()[2]}) 
#上面这句是生成zabbix需要的数据,#IPADDRESS是zabbix可以识别的marco,数据送给zabbix后,zabbix可以通过{#IPADDRESS}来调用数据
	dict_ipindex.update({jihe[i].split()[0]: i})
#上面这句是生成ip与对应并发连接数的一个list

#生成json数据
alldata = json.dumps({'data': ipaddr},indent=4)


#把相关数据保存成文件
#这里的路径还可以写成相对路径,之后的两个脚本不知道为什么必须携程绝对路径。。。
f = open('./ipaddr.txt', 'w', encoding = 'utf-8')
g = open('./dict_ipindex.txt', 'w', encoding = 'utf-8')
h = open('./maxcons.txt', 'w', encoding = 'utf-8')
f.write(json.dumps({'data': ipaddr},indent=4))#indent=4可以让数据更美观
g.write(json.dumps({'data': dict_ipindex},indent=4))
h.write(numCons[0])
f.close
g.close
h.close

这句在后边解释为什么要这样结构的数据

ipaddr.append({"{#BCINDEX}": i,"{#IPADDRESS}": jihe[i].split()[0],"{#CONS}": jihe[i].split()[1],"{#OPENCONS}": jihe[i].split()[2]}) 
2,将ipaddr.txt发送给zabbix getalldata.py
#!/usr/bin/python3
# -*- coding: utf-8 -*-
import json

fi = open('/home/script/ipaddr.txt')
gi = fi.read()
hi = json.loads(gi)#因为之前是json.dump出来的数据,所以要json.load回来,这步懒得改了
alldata = hi['data']#之前加的data,读取回来之后就成了data为键的字典了。。。
a = json.dumps({'data': alldata},indent=4)
print(a)

3,提取某IP对应的并发连接数 getcons.py
#!/usr/bin/python3
# -*- coding: utf-8 -*-
import sys
import json

def getCons(ip):
        fi = open('/home/script/dict_ipindex.txt')
        gi = fi.read()
        hi = json.loads(gi)
        dict_ipindex = hi['data']
        conIndex = dict_ipindex[ip]
        fp = open('/home/script/ipaddr.txt')
        gp = fp.read()
        hp = json.loads(gp)
        ipaddr = hp['data']
        openConnections = ipaddr[conIndex]['{#OPENCONS}']
        fi.close()
        fp.close()
        print(openConnections)

if __name__ == '__main__':
        ip = sys.argv[1]
        getCons(ip)

4,提取并发连接总数 getmaxcons.py
#!/usr/bin/python
# -*- coding: utf-8 -*-

import json

fi = open('/home/script/maxcons.txt')
gi = fi.read()
fi.close()
print(gi)
二,Zabbix设定

因为IP和并发连接数是变化的,所以要用自动发现
首先创建template

1,创建自定义key

编辑zabbix agent配置文件
vim /etc/zabbix/zabbix_agent.conf

允许使用自定义key
将UnsafeUserParameters的值修改为1,默认是0

UnsafeUserParameters=1

添加自定义key
这里添加了三个自定义的key
stat.proxy.all
stat.proxy.cons[参数]
stat.proxy.maxcons

UserParameter=stat.proxy.all,python3 /home/script/getalldata.py
#逗号前边是key,后边是对应的命令,当zabbix发现该key时执行后边的命令
UserParameter=stat.proxy.cons[*],python3 /home/script/getcons.py $1
#[*],允许从外部输入参数,$1就是参数的位置
#实际执行, getcons.py 192.168.1.1,用来提取该IP对应的连接数的
UserParameter=stat.proxy.maxcons,python3 /home/script/getmaxcons.py
2,Discover Rules

创建一个template,然后点击Discovery rules
创建template画面
创建Discovery Rule
这里的key输入stat.proxy.all,可以使zabbix获取客户端的IP地址等信息
可以通过#IPADDRESS来引用IP地址创建DiscoveryRules
点击Filters,输入之前数据中定义的marco,不输入的话,就无法引用相关数据
格式:
{#IPADDRESS}
{#CONS}
之前在main_getcon.py中定义的marco,在此处使用

在Filters中定义MARCO,用于引用数据
点击Item Prototypes,创建自动发现的item,发现多少,自动创建多少item
这里就可以引用之前建立的MARCO了
1.标题使用以下格式来注明客户端的IP地址

{#IPADDRESS}

2.因为zabbix中,key不允许重复,所以加上#IPADDRESS来保证key的唯一性,同时#IPADDRESS作为参数输入到stat.proxy.cons所对应的脚本getcons.py中。这个脚本会根据输入的IP地址,来提取该IP对应的并发连接数,发送给zabbix

这个是通过以下这个格式实现的

stat.proxy.cons[{#IPADDRESS}]

可以引用参数的前提是,在zabbix_agent.conf中创建允许使用参数的的自定义key:

stat.proxy.cons[*]

后边的

[*]

就是允许输入参数创建item,可以根据IP自动添加监控item
向下滚动,可以选择不同的APPLICATION,用于将ITEM分类
Application选项中可以创建用于选择的Application

选择用于分类的Application

添加针对全部并发连接数的监控
通过stat.proxy.maxcons实现,这个key对应的脚本会返回全部并发连接的数量
创建普通ITEM监控并发连接总数
添加完成后,zabbix就可以自动发现和添加相关Item了

这里就是创建Application的页面
创建分组用Application的页面

三,Grafana

zabbix的图形化功能比较简陋,通过Grafana可以实现更灵活的图表

1,关于本项目的相关设定

Query选择zabbix(需要安装Grafana的zabbix插件)
Group对应监控项的group
Host是主机名,这里选择全部
Application对应监控想所属的Application
Item,这里选择全部Item都显示
这样就可以
Grafana设定图表数据

2,关于Item的筛选

如果需要显示的Item名,有特定的规律
可以使用相关关键字进行筛选
这里具体的语法没有详细研究,暂时只发现下面这一种应用
sent 结尾的item
可以使用以下命令筛选

/.*sent/

筛选sent结尾的item

3,关于Variables

Grafana可以自定义变量
变量的数据可以直接从mysql进行筛选
如下图从mysql中选择name中,hostid是10349的,开头是Interface Gi1/0 + 1到2位数字 + 结尾是sent的
自定义变量

四,crontab

main_getcons.py是通过crontab来实现定时获取数据的
Python脚本在crontab中不能直接执行
执行的语句需要写入到sh脚本中

#!/usr/bin/bash

cd /home/script
/usr/bin/python3 main_getcon.py

然后在crontab执行sh脚本,就可以执行python脚本了

*/1 * * * * root /usr/bin/bash /home/script/main.sh

开头的

*/1

表示每隔一分钟就执行脚本

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值