记录在工作中遇到的实际业务场景:需要对某Java语言开发的系统指定界面的若干接口状态进行监控。
zabbix中对web监控无非两种方式,一种是zabbix的web场景监控,一种是通过执行脚本创建监控项来实现监控。但是在实现的过程中遇到了困难,在设置好的web场景中模拟了登录操作,但是发现在步骤的变量设置中难以从登录接口的返回体中获取到token,不携带token将无法在通过zabbix来模拟具体业务场景的接口调用。
经过调查发现,zabbix的web场景监控可以实现对静态页面的访问情况实施监控,以及对指定接口进行模拟接口调用,从而监控接口的状态(其方法是在要求的字串一栏填写接口返回体所传回的数据中包含的任意字串,来监测该接口是否可正常调通),但是难以从接口返回的请求体中拿到返回的参数(当然也可能是本人学艺不精,但是网上关于这个问题的资料少之又少,仅有的几篇基本在复制官网api文档,无实际场景对照,参考价值不大)
因为所要监控的系统开发时使用了Spring Security来进行用户权限认证,不携带token将无法进行模拟登录后的其他操作,这也是设置监控指定接口的最大问题。
我曾想过使用执行脚本创建监控项来获取token值,再通过主机宏表达式的方式在web场景的步骤中进行调用,但是实际操作后发现,web场景的步骤中似乎不支持主机宏(刚开始以为是宏表达式写错了,为此纠结了好久,直到我发现用表达式构造器生成的表达式依然无法调用,才对宏表达式是否可以在web场景中调用产生疑问,但是据官方的api介绍,web中宏的引用在zabbix 2.2x后已经支持,但是我这4.x版本的zabbix中似乎不支持该操作),因此放弃了在web场景中进行设置。
经过多次尝试,最后还是选择了脚本创建监控项的方式进行监控。在实际操作下来也发现,通过该方法实施监控也更加灵活,话不多说了,具体步骤贴在下面,希望对抱有同样问题的同行们提供一些帮助。
1、创建脚本
在这里我使用python作为脚本开发语言,脚本内容如下:
import requests
import string
import random
import json
#生成指定长度的字符串,由数字和小写字母组成
def generate_string(length):
characters = string.ascii_lowercase + string.digits
random_string = ''.join(random.choice(characters) for _ in range(length))
return random_string
#token获取方法
def get_token():
#登录接口地址
url = "http://host:port/api/login"
#具体业务实现接口地址
data_url = "http://host:port/yoururl"
headers = {"Content-Type": "application/json"}
data = {"code": "6", "username": "admin", "password": "123456", "uuid": generate_string(32)}
serialized_data = json.dumps(data)
#调用登录接口
response = requests.post(url, headers=headers, data=serialized_data)
if response.status_code == 200:
token = response.json().get("token")
authorization = "Bearer " + token
#print(authorization)
headers2 = {"Content-Type": "application/json", "Authorization": "Bearer " + token}
#携带登录接口获取的token,进行调用
response2 = requests.get(data_url, headers=headers2)
#print(response2.json())
#此处data替换为返回体中字串
print(1 if response2.json().get("data") else 0)
return 1 if response2.json().get("data") else 0
else:
print 0
return 0
if __name__ == "__main__":
get_token()
在此脚本中先执行了登录接口的调用以获取token,并将token携带在请求头中去调用需要监控的接口,此时接口可以正常调用。接着对接口返回数据进行检查,若其返回体中包含了接口正常时可返回的字符串,说明接口可正常访问,输出1,反之则输出0(此处用0、1来表示接口正常状态,也可自规定其他值),此处注意zabbix监控项测试拿到的是脚本打印出来的值,若不加print将在zabbix前端获取不到数据。
我这里使用的python版本为3.10,但是由于服务器python为自带版本(2.7.5),故对代码进行了部分修改,这里也可以将服务器的python版本升级为所使用的版本来解决。
2、zabbix agent配置
将该脚本文件script.py上传至服务器(服务器为centOS 7系统)的/usr/local/bin目录下,在服务器系统中执行以确认无其他兼容问题:
python /usr/local/bin/script.py
可看到有正常打印,说明脚本正常执行。
此处需要注意,将文件放在usr外目录会出现文件操作权限不够的问题,尽量放在usr目录下,或者使用chmod命令对文件操作权限进行升级,亦可解决此问题。
紧接着在/etc/zabbix目录下找到配置文件zabbix_agentd.conf:
vi zabbix_agentd.conf
在配置文件中添加配置:
UserParameter=web.interface.getstatus,python /usr/local/bin/script.py
此处的web.interface.getstatus为设置监控项时对应的键值,后面则是执行命令及脚本文件所在位置,两者之间以逗号隔开。当需要执行数个脚本时,则创建多个UserParameter进行配置。
配置好后保存配置文件,重启zabbix agent服务。
systemctl restart zabbix-agent
3、创建监控项
agent配置完成后,我们在zabbix前端界面找到对应的agent主机,创建监控项:
如图在创建监控项界面填写监控项名键值等数据,监控项类型为zabbix agent。注意主机一定是之前进行过配置的主机,键值与agent配置文件中的键值相匹配,其他不做要求。
配置无误后可在监测下查看设置的监控项数据:
此处以折线图的形式进行展示,至此已实现通过该监控项监测指定业务接口的情况。
实际操作下来发现,通过脚本方法实现的接口监控比较灵活,可以通过脚本覆盖zabbix系统所不支持的部分业务监控,但是缺点是需要一定开发基础,并且若监控的接口数量多,得分别配置不同脚本进行监控。
本人接触zabbix时间不长,故还有很多地方需要学习,若有大佬有更好的方法可解决,欢迎评论共勉。