Python管理vSphere - 性能数据采集
一、简介
vSphere中纳管着物理主机,在虚拟化管理平台中可以通过【监控-性能-高级】查看cpu、数据存储、内存、网络、磁盘等 的性能数据。但vSphere中管理的对象非常多,如果逐个查看对象的性能数据曲线进行巡检判断,那么运维工作就会变得非常的低效,如果我们通过接口获取对象的性能数据,根据实际的需求配置监控告警,会大大提升运维的效率,为运维工作带来很大便利。
二、查询可获取的性能指标清单
查看官网文档,找到Managed Object - PerformanceManager(vim.PerformanceManager)该对象,查看详细说明
示例代码如下:
from pprint import pprint
from pyVim import connect
from pyVmomi import vim # noqa
si = connect.SmartConnect(host='', port=443, user='', pwd='')
content = si.RetrieveContent()
perf_list = content.perfManager.perfCounter
perf_dict = {}
for counter in perf_list:
counter_data = f'{counter.groupInfo.key}.{counter.nameInfo.key}.{counter.rollupType}'
perf_dict[counter_data] = counter.key
pprint(perf_dict)
三、查询对象的性能指标数据
使用QueryPerf方法查询性能指标数据,详情见官方文档:https://dp-downloads.broadcom.com/api-content/apis/API_VWSA_001/7.0/html/vim.PerformanceManager.html#queryStats
参数说明:
startTime:查询性能数据的起始时间
endTime:查询性能数据的截止时间
intervalId:时间粒度,最小为20秒,推荐5分钟,减少返回的数据
maxSample:控制返回的数据
entity:查询性能的对象
metricId:待检索的性能指标对象
示例代码如下:
import datetime
from pprint import pprint
from pyVim import connect
from pyVmomi import vim # noqa
si = connect.SmartConnect(host='', port=443, user='', pwd='')
# 查询性能指标对应counterId信息
content = si.RetrieveContent()
perf_list = content.perfManager.perfCounter
perf_dict = {}
for counter in perf_list:
counter_data = f'{counter.groupInfo.key}.{counter.nameInfo.key}.{counter.rollupType}'
perf_dict[counter_data] = counter.key
pprint(perf_dict) # 返回格式:{'cpu.usage.average':对应的counterId}
# 举例
metric_name_list = ['cpu.usage.average', 'mem.usage.average']
counter_id_list = [perf_dict.get(i) for i in metric_name_list if perf_dict.get(i) is not None]
def build_query_perf(counter_id_list, entity_list, refresh_rate=20, instance='', max_sample=None, start_time=None,
end_time=None):
"""
查询指定对象的性能数据
:param counter_id_list: 性能指标名称对象的id
:param entity_list: 查询对象列表
:param refresh_rate: 时间粒度
:param instance: 目标对象 例如在查询主机的多个网卡时,可以指定instance为*,则会返回所有的网卡指标数据
:param max_sample: 返回的样本数,-1表示不限制返回样本数量
:param start_time: 开始时间
:param end_time: 结束时间
:return: 返回查询结果
"""
perf_manager = content.perfManager
metric_obj_list = []
for counter_id in counter_id_list:
metric_obj = vim.PerformanceManager.MetricId(counterId=counter_id, instance=instance)
metric_obj_list.append(metric_obj)
data = []
for entity in entity_list:
spec = {'entity': entity, 'metricId': metric_obj_list}
if refresh_rate and refresh_rate != -1:
spec['intervalId'] = refresh_rate
if max_sample:
spec['maxSample'] = max_sample
if start_time:
spec['startTime'] = start_time
if end_time:
spec['endTime'] = end_time
query_obj = vim.PerformanceManager.QuerySpec(**spec)
data.append(query_obj)
#
perf_data = perf_manager.QueryPerf(querySpec=data)
return perf_data
if __name__ == '__main__':
query_end_time = datetime.datetime.now()
query_start_time = query_end_time - datetime.timedelta(minutes=5)
build_query_perf(counter_id_list=counter_id_list,
entity_list=['例如主机对象'],
refresh_rate=300,
instance='',
max_sample=None,
start_time=query_start_time,
end_time=query_end_time
)
获取到对象的性能数据后再根据实际需求,对数据的格式进行重新组织以及数据清洗,可以对接到各种监控平台。建议采集频率不要太频繁以及采集的样本数尽量少,减少虚拟化平台的压力。批量查询时也应尽量减少同时查询很多指标,不要一次性返回对象的所有指标,接口可能会报错