因为接口压测平台需要获取接口服务器的性能数据,所以找了一圈 zabbix api 获取数据的方式,以此记录下来。
zabbix api 地址:https://www.zabbix.com/documentation/3.4/zh/manual/api 功能还真挺多,挺详细的。
1.获取 token
url = "http://ip/zabbix/api_jsonrpc.php"
header = {
"Content-Type": "application/json"
}
def get_token():
data = {"jsonrpc": "2.0", "method": "user.login", "params": {"user": "xxx", "password": "xxx"},
"id": 1, "auth": None}
resp = requests.post(url, json=data, headers=header)
print(resp.status_code)
print(resp.text)
if resp.status_code == 200:
json_data = json.loads(resp.text)
return json_data['result']
return None
2.获取服务器 ip,这个可以获取到 hostid
def get_machine():
auth = get_token()
data = {
"jsonrpc": "2.0",
"method": "host.get",
"params": {
"output": [
"hostid",
"host"
],
"selectInterfaces": [
"interfaceid",
"ip"
]
},
"id": 2,
"auth": auth
}
resp = requests.post(url, json=data, headers=header)
print(resp.status_code)
print(resp.text)
3.获取 graphid
def get_graph():
auth = get_token()
data = {
"jsonrpc": "2.0",
"method": "graph.get",
"params": {
"output": "extend",
"hostids": 10351,
"sortfield": "name"
},
"auth": auth,
"id": 1
}
resp = requests.post(url, json=data, headers=header)
print(resp.status_code)
print(resp.text)
4.获取图形写入文件
def get_png():
token = get_token()
print(token)
header = {
"Accept-Encoding": "gzip, deflate",
"Accept-Language": "zh-CN,zh;q=0.9",
"Cache-Control": "no-cache",
"Connection": "keep-alive",
"Cookie": "PHPSESSID=2bvctu9rva99ppd74gaopb8i42; zbx_sessionid=" + token,
"Pragma": "no-cache",
"Upgrade-Insecure-Requests": "1"
}
charUrl = "http://ip/zabbix/chart2.php?graphid=3396&period=120&stime=20200624103155&isNow=0&profileIdx=web.graphs&profileIdx2=3396&width=682&sid=96b019eb208dec18&screenid=&curtime=1592965915667"
resp = requests.get(charUrl, headers=header)
with open("test_img.png", 'wb') as f:
f.write(resp.content)
关键参数:
charUrl
可以从 graphs 查询的图片,然后右击 - 复制图片地址获取到
graphid=3396
这个就是 graph 下拉那块的 id,有 CPU、流量等,上面有方法通过 hostid 可以获取到
period=120
这个单位秒,即获取 2 分钟的图形,可以随便改
stime=20200624103155
开始时间,意思很明朗;所以其实获取的图形,就是从 stime 到 stime+period 这段的图形
width=682
这个是图片宽度
isNow=0
默认是 1,就是 5 分钟时长的图形,改为 0 后,period 就起作用了
有问题请指出哦~~