【逗老师带你学IT】PRTG、Zabbix通过API监控深信服VDC和VMP云桌面运行状态

本文介绍,如果使用API让PRTG和Zabbix等第三方监控系统获取深信服云桌面产品(VDC+VMP)的运行状态,可以获取的监控项包括

1、集群性能汇总(CPU、内存、存储、网络IO)
2、集群运行状态(在线物理机数量、下线物理机数量、总虚机数量、运行虚机数量等)
3、单台物理机性能状态(CPU、内存、存储、运行虚拟机数量)
4、单台物理机硬件状态(CPU温度、电源功率、内存状态等IPMI监控项)

在这里插入图片描述
在这里插入图片描述

一、关于深信服VDC和VMP平台

1、VDC与VMP的关系

先说一下深信服桌面云产品中VDC和VMP的关系。
VDC(Virtual Desktop Controller)是云桌面的控制平台,负责云端桌面的接入、展现、控制等。
VMP(Virtual Management Platform)是虚拟化管理平台,负责将裸金属服务器构建成虚拟化集群。
在这里插入图片描述

2、VDC与VMP的监控指标

所以,结合一个正常云计算系统的框架,我们想象一下这二者面向的对象和能获取的监控项。
VDC面向桌面,能监控到桌面终端连接并发、用户操作行为、文件拷贝速率、虚拟桌面数量等。
VMP面向虚拟化,能监控到集群的CPU、内存、存储IO等指标。

但是!但是!但是!
深信服这个傻X玩意不按常理出牌,这也就是为什么我要写这么一篇文章来说明这个事情。
先上结论:
深信服的VMP自身就是个垃圾,对VMP的监控需要通过调用VDC的接口来实现。

那么VDC是如何获取VMP的运行情况,如一般的桌面云产品一样,VDC是可以管理VMP的,例如VDC可以直接调用VMP创建虚拟机。在深信服产品内,VDC内需要添加VMP的控制信息,如下图:
在这里插入图片描述

二、VDC API接口说明

深信服的云桌面API接口文档已经上传【CSDN资源】深信服桌面云开放平台(V1.2)
其中包含了资源管理接口、角色管理接口、虚拟机管理接口、策略组管理接口、用户管理接口、用户组管理接口、VMP管理虚拟机接口、日志接口、运维接口等接口说明。感兴趣的读者可以去下载原文手册。

本文全部代码已经上传Github,地址如下:
Public_Share_Project/PRTG 自定义传感器Customer Senser/深信服VDI监控接口/

本文对运维监控需要用到的接口做详细说明

1、操作权限认证接口

POST https://<VDC ip>/v1/auth/tokens

简介
操作权限认证,将auth_token赋值给请求头部中Auth-Token字段才能获取其余接口的访问权限。

请求参数

参数位置类型必选描述
authbodyobjecty认证对象
namebodystringy超级租户账号
passwordbodystringy超级租户密码

返回参数

参数位置类型必选描述
tokenbodyobjectytoken对象
tenant_idbodystringy租户ID号
auth_tokenbodystringy认证token

请求示例代码

def get_token(deviceip,name,password):
	try:
		headers={'Content-Type':'application/json'}
		data={
			"auth": {
				"name": name,
				"password": password
			}
		}
		post_url='https://%s:11111/v1/auth/tokens'%deviceip
		request = requests.post(url=post_url,headers=headers,json=data,verify = False)
		request_text=json.loads(request.text)
		token_text=request_text['data']['token']['auth_token']
	except Exception as err:
		raise err
	else:
		return token_text

2、获取集群在线用户数量接口

GET https://<VDC ip>/v1/user_groups

简介
获取指定用户组的基本信息,包括用户组ID、用户组名称、描述、父组ID、是否启用、区域名、策略组名、角色名

请求参数

参数位置类型必选描述
group_idPathIntY用户组ID
page_sizePathIntY每页显示的数量
pagePathIntY显示的页数

响应参数

参数位置类型必选描述
idBodyIntY用户组ID
nameBodyStringY用户组名称
noteBodyStringY描述
group_idBodyIntY所属用户组ID
enableBodyIntY是否启用 1是 0否
area_nameBodyStringY区域名
grpolicyBodyStringY策略组名
role_namesBodyStringY角色名列表

响应示例

{
	"error_code":0,
	"error_message":"Operation succeeded. ",
	"data":
	{
		"total_count":"2",
		"list":
		[
			{
				"id":-1,
				"name":"Default Group",
				"note":"System protected,unable to be deleted",
				"group_id":-100,
				"enable":0,
				"area_name":"\u5f85\u5206\u914d\u533a\u57df",
				"grpolicy":"Default policy set",
				"role_names":"c"
			}
		]
	}
}

请求示例代码

def get_online_user_info(deviceip,token):
	try:
		headers={'Content-Type':'application/json','Auth-Token':token}
		get_url='https://%s:11111/v1/users?group_id=-100&page_size=10&page=1&user_state=online'%deviceip
		request = requests.get(url=get_url,headers=headers,verify = False)
		value_text=request.text
	except Exception as err:
		raise err
	else:
		return value_text

def sort_online_user_info(value_text):
	try:
		value_dict={}
		value_json=json.loads(value_text)
		value_dict['Online_Users_Number']=[value_json['data']['total_count'],'#','']
	except Exception as err:
		raise err
	else:
		return value_dict

本示例可以获取到当前在线用户数量的监控指标,并用于后续在PRTG和Zabbix上进行展示。

3、获取VMP集群汇总性能信息

GET /v1/vtp?vtp_id=3

简介
获取VMP集群的集群信息,包括集群的主机、cpu、网卡、虚拟机、存储、内存数据。

请求参数

参数位置类型必选描述
vtp_idPathIntYVMP控制器 ID,根据添加的顺序,第一个VMP集群的vtp_id=1

响应参数

参数位置类型必选描述
clusterBodyObjectY集群信息
cpuBodyObjectYCPU信息
netBodyObjectY网卡信息
hostBodyObjectY主机信息
vmBodyObjectY虚拟机信息
stgBodyObjectY存储信息
memBodyObjectY内存信息
totalBodyIntY主机数量

响应示例

{
    "error_code": 0,
    "data": {
        "cluster": {
            "cluster_num": 1,
            "is_cluster": 0
        },
        "is_graphics_cluster": 0,
        "cpu": {
            "ratio": "0.64",
            "used": "22127.616",
            "total": "34574.4"
        },
        "version": "VMP 5.4.2_B \nVMP5.4.0_B-2019-11-26_18:30:00\nupdate=1",
        "net": {
            "receive": 894928,
            "send": 56412,
            "total": 951340
        },
        "host": {
            "offline": 0,
            "cnt": 1,
            "online": 1
        },
        "vm": {
            "on": 27,
            "vgpu_off": 0,
            "off": 125,
            "vgpu_on": 0,
            "cnt": 152,
            "vgpu_cnt": 0
        },
        "stg": {
            "itl": 1,
            "ratio": "0.44",
            "vs": 1,
            "used": 1745930420224,
            "ext": 0,
            "total": 3994554466304,
            "cnt": 2
        },
        "mem": {
            "ratio": "0.67",
            "used": 68899549184,
            "total": 103079215104
        }
    },
    "total": 2
}

请求示例代码

def get_vmp_cluster_info(deviceip,token):
	try:
		headers={'Content-Type':'application/json','Auth-Token':token}
		get_url='https://%s:11111/v1/vtp?vtp_id=1'%deviceip
		request = requests.get(url=get_url,headers=headers,verify = False)
		value_text=request.text
	except Exception as err:
		raise err
	else:
		return value_text

def sort_vmp_cluster_info(value_text):
	try:
		value_dict={}
		value_json=json.loads(value_text)
		value_dict['System_Version']=value_json['data']['data']['version'].replace('\n','')
		value_dict['CPU_Useage']=[float(value_json['data']['data']['cpu']['ratio'])*100,'%',3,-1,70,-1,80]
		value_dict['Memory_Useage']=[float(value_json['data']['data']['mem']['ratio'])*100,'%',3,-1,70,-1,80]
		value_dict['Storage_Useage']=[float(value_json['data']['data']['stg']['ratio'])*100,'%',3,-1,80,-1,85]
		value_dict['VMs_ON_Counts']=[value_json['data']['data']['vm']['on'],'#','']
		value_dict['VMs_Total_Counts']=[value_json['data']['data']['vm']['cnt'],'#','']
		value_dict['Physical_Servers_Online_Counts']=[value_json['data']['data']['host']['online'],'#','']
		value_dict['Physical_Servers_Offline_Counts']=[value_json['data']['data']['host']['offline'],'#',3,-1,0,-1,1]
		value_dict['Network_Total_Send_Speed']=[round(int(value_json['data']['data']['net']['send'])*8/1024/1024,2),'Mbps','']
		value_dict['Network_Total_Receive_Speed']=[round(int(value_json['data']['data']['net']['receive'])*8/1024/1024,2),'Mbps','']
		
		
	except Exception as err:
		raise err
	else:
		return value_dict

本示例可以获取到当前集群的CPU、内存等各种性能监控指标,并用于后续在PRTG和Zabbix上进行展示。

4、获取指定主机信息

GET /v1/vtp/host?vtp_id=3&host_id=xxx

简介
获取指定VMP集群上的指定主机信息。

请求参数

参数位置类型必选描述
vtp_idPathIntYVMP控制器 ID
host_idPathStringY主机ID

响应参数

参数位置类型必选描述
host_ipBodyStringYIP地址
running_vmsBodyIntY运行中的虚拟机数量
cpu_ratioBodyIntYCPU使用率
mem_ratioBodyIntY内存使用率

响应示例

{
    "error_code": 0,
    "error_message": "",
    "data": {
        "host_ip": "10.70.50.5",
        "running_vms": 20,
        "cpu_ratio": 57,
        "mem_ratio": 44
    }
}

请求示例代码

def get_server_info(deviceip,token,host_id):
	try:
		headers={'Content-Type':'application/json','Auth-Token':token}
		get_url='https://%s:11111/v1/vtp/host?vtp_id=1&host_id=%s'%(deviceip,host_id)
		request = requests.get(url=get_url,headers=headers,verify = False)
		value_text=request.text
	except Exception as err:
		raise err
	else:
		return value_text

def sort_vmp_cluster_info(value_text):
	try:
		value_dict={}
		value_json=json.loads(value_text)
		value_dict['host_ip']=value_json['data']['host_ip']
		value_dict['CPU_Useage']=[float(value_json['data']['cpu_ratio']),'%',3,-1,70,-1,80]
		value_dict['Memory_Useage']=[float(value_json['data']['mem_ratio']),'%',3,-1,70,-1,80]
		value_dict['VMs_Running_Counts']=[value_json['data']['running_vms'],'#','']
		
		
	except Exception as err:
		raise err
	else:
		return value_dict

本示例可以获取到单一物理机的性能指标,并用于后续在PRTG和Zabbix上进行展示。

三、代码使用说明

作者已经上传了PRTG监控系统可用的监控脚本,Zabbix版本大佬们简单改一下输出格式就可以了。

1、Github地址

本文全部代码已经上传Github,地址如下:
Public_Share_Project/PRTG 自定义传感器Customer Senser/深信服VDI监控接口/
在这里插入图片描述

2、PRTG添加自定义传感器

先将三个py脚本全部拷贝到PRTG探针传感器的如下目录

C:\Program Files (x86)\PRTG Network Monitor\Custom Sensors\python

然后,在所有操作之前,我们首先添加一个新的设备,设备IP地址为VDC管理平台的IP地址
在这里插入图片描述
添加设备的时候,配置Linux登录凭据,用户名和密码为VDC管理平台的用户名和密码。
在这里插入图片描述

2.1、添加在线用户监控项

添加一个新的传感器,传感器类型为Python自定义脚本,选中下拉列表里刚才拷贝进去的Sangfor_VDI_Oneline_Users.py脚本,同时勾选传递Linux凭据
在这里插入图片描述
稍等一会即可获取到监控数据。
在这里插入图片描述

2.2、添加集群性能汇总监控项

添加一个新的传感器,传感器类型为Python自定义脚本,选中下拉列表里刚才拷贝进去的Sangfor_vmp_cluster_summary.py脚本,同时勾选传递Linux凭据
在这里插入图片描述
稍等一会即可获取到监控数据。
在这里插入图片描述

2.3、添加单一物理机性能监控项

添加一个新的传感器,传感器类型为Python自定义脚本,选中下拉列表里刚才拷贝进去的Sangfor_vmp_host_info.py脚本,勾选传递Linux凭据,同时携带一个自定义参数

{'host_id':'host-b4055d719a00'}

这个host_id在登录VMP管理页面后,可以在查看物理机详情的时候通过iSCSI的IQN发现和获取。
在这里插入图片描述
在这里插入图片描述
稍等一会即可获取到监控数据。
在这里插入图片描述

2.4、添加服务器带外管理监控项

关于带外管理监控项,可以参考博主之前的另一篇文章。
【逗老师带你学IT】PRTG获取HUAWEI FusionServer iBMC传感器状态
深信服一般OEM浪潮的服务器,都是标准的IPMI接口,本文需要用到的浪潮IPMI监控脚本也已经上传到github,按照之前这篇文章的方式添加传感器就可以了。
在这里插入图片描述
在这里插入图片描述

3、PRTG运行Python脚本的传参

刚才细心的读者可能发现,我们在创建设备的时候填入了一个linux凭据,并且勾选了将linux凭据传递给python脚本。那么这两个字段的数据在脚本中是如何获取的呢。

我们来看一下python脚本的前几行,这里通过linuxloginusername字段获取linux凭据的登录名,通过linuxloginpassword字段获取linux登录凭据的密码。

data = json.loads(sys.argv[1])
deviceip = data['host']
name=data['linuxloginusername']
password=data['linuxloginpassword']

除了这两个字段,PRTG在运行Python脚本的时候还会传递更多的参数。所有参数以json结构体的形式传递给Python脚本。
以下是笔者抓到的PRTG给Python脚本传递的参数示例。各位同学在今后编写自定义脚本的时候。可以灵活的使用这些系统传递参数。

{
"momopersistent":"",
"fastcount":"0",
"lastuptime":"0",
"hostv6":"",
"writeresult":"0",
"blockedsens":"",
"reqmsginterval":"60",
"tlsexplicit_default":"",
"tlsexplicit_imap":"",
"uptimecount":"0",
"canlinux":"0",
"isexesensor":"0",
"mutexname":"",
"reboot":"44127.3734878588",
"usednstime":"0",
"pythonscript":"save_log.py",
"tlsexplicit_port":"",
"inerror":"1",
"sensorid":"4935",
"ipversion":"0",
"tlsexplicit_smtp":"",
"params":"{'host_id':'host-b4055d719a00'}",
"host":"172.16.0.22",
"usewindowsauthentication":"0",
"simulate":"0",
"timeout":"59",
"tlsexplicit_ftp":"",
"lastmsg":"#O2",
"notonpod":"0",
"tlsexplicit_pop3":"",
"linuxloginusername":"admin",
"linuxloginpassword":"123"
#如果此前勾选传递windows凭据,这里会变化为windowsloginusername和password字段
}

搞定!

往期回顾:
【逗老师带你学IT】PRTG监控通过Python通过串口监控UPS运行状态
【逗老师带你学IT】PRTG监控通过Python+Modbus RTU获取温湿度传感器数据
【逗老师带你学IT】PRTG监控通过Python+Modbus TCP获取温湿度传感器数据
【逗老师带你学IT】职场数据中心异地出口容灾,H3C的IP上一跳保持技术
【逗老师带你学IT】阿里云监控报警回调+转发企业微信+转发SnmpTrap+PRTG
【逗老师带你学IT】HUAWEI华为防火墙自动化运维Python ssh管理网络设备
【逗老师带你学IT】PRTG获取HUAWEI FusionServer iBMC传感器状态
【逗老师带你学IT】PRTG自定义脚本ssh登录网络设备获负载均衡链路状态
【逗老师带你学IT】Django+IIS+Python构建微软AD域控API管理中心
【逗老师带你学IT】通过企业微信推送AD域密码即将到期提醒
【逗老师带你学IT】AD域控 Dsquery 查询命令实例汇总
【逗老师带你学IT】Google Admin服务账号+API管理G suit内所有网域用户
【逗老师带你学IT】PRTG监控系统通过企业微信推送图文混排告警消息
【逗老师带你学IT】PRTG HTTP API获取指定传感器流量图表图片
【逗老师带你学IT】PRTG监控系统合并多个传感器通道数据
【逗老师带你学IT】PRTG监控系统通过企业微信推送告警消息
【逗老师带你学IT】PRTG监控系统配合树莓派采集企业内部无线网络质量
【逗老师带你学IT】vMware ESXi 6.7合并第三方硬件驱动
【逗老师带你学IT】Kiwi Syslog Server安装和配置教程
【逗老师带你学IT】Kiwi Syslog Web Access与Active Directory集成认证
【逗老师带你学IT】vMware ESXi 6.7合并第三方硬件驱动
【逗老师带你学IT】Windows Server Network Policy Service(NPS)记账与审计
【逗老师带你学IT】Windows Server NPS服务构建基于AD域控的radius认证
【逗老师带你学IT】AD域控和freeradius集成认证环境,PAP,MSCHAPV2
【逗老师带你学IT】深信服SSL远程接入与深信服行为审计同步登陆用户信息

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

逗老师

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值