通过vSphere API获取对象Statistics

预备知识点:

1、vim.PerformanceManager.MetricId()    通过counter_id获取到metric_id

2、vim.PerformanceManager.QuerySpec()    通过对象、metric_id、起始时间进行装配

3、content.perfManager.QueryPerf()    通过QuerySpec获取对象的Statistics

4、content.perfManager.perfCounter   获取所有Performance Counter相关信息

 

 

示例1: 获取ESXI主机的网络利用率

from pyVim.connect import SmartConnectNoSSL, Disconnect
from pyVmomi import vim
from datetime import timedelta
import atexit


def connect_vc(host, user, pwd, port):
    si = SmartConnectNoSSL(host=host, user=user, pwd=pwd, port=port)

    # disconnect this thing
    atexit.register(Disconnect, si)
    return si


def build_query(content, vc_time, counter_id, obj, interval):
    metric_id = vim.PerformanceManager.MetricId(counterId=counter_id, instance="")
    start_time = vc_time - timedelta(minutes=(interval + 1))
    end_time = vc_time - timedelta(minutes=1)
    query = vim.PerformanceManager.QuerySpec(intervalId=20,
                                             entity=obj,
                                             metricId=[metric_id],
                                             startTime=start_time,
                                             endTime=end_time)
    perf_results = content.perfManager.QueryPerf(querySpec=[query])
    if perf_results:
        return perf_results
    else:
        pass


def print_statistics(obj, content, vc_time, interval, perf_dict, ):
    stat_interval = interval * 3  # There are 3per 20s samples in each minute

    # Network usage (Tx/Rx)
    # statNetworkTx = BuildQuery(content, vchtime, (stat_check(perf_dict, 'net.usage.maximum')), obj, interval)
    # networkTx = (float(sum(statNetworkTx[0].value[0].value) * 8 / 1024) / statInt)
    # statNetworkRx = BuildQuery(content, vchtime, (stat_check(perf_dict, 'net.usage.minimum')), obj, interval)
    # networkRx = (float(sum(statNetworkRx[0].value[0].value) * 8 / 1024) / statInt)

    # Network utilization (combined transmit-rates and receive-rates) during the interval = 145
    network_usage = build_query(content, vc_time, stat_check(perf_dict, 'net.usage.average'), obj, interval)
    try:
        print('statNetworkThroughput:%sMB' % (round((((sum(network_usage[0].value[0].value)) / 1024) / stat_interval), 2)))

    except TypeError:
        # 关机的ESXi主机无法获取到数据
        pass


def stat_check(perf_dict, counter_name):
    """通过performance counter名称获取counter id"""
    counter_id = perf_dict[counter_name]
    return counter_id


def main():
    username = 'administrator@vsphere.local'
    password = 'xxxxxx'
    vc_ip = '172.16.65.99'
    vc_port = '443'
    statistics_interval_time = 10   # 分钟为单位
    si = connect_vc(host=vc_ip, user=username, pwd=password, port=vc_port)
    content = si.RetrieveContent()

    # Get vCenter date and time for use as baseline when querying for counters
    vc_time = si.CurrentTime()

    # 获取所有performance counter,并放入字典中
    perf_dict = {}
    perf_list = content.perfManager.perfCounter
    for counter in perf_list:
        counter_full = "{}.{}.{}".format(counter.groupInfo.key, counter.nameInfo.key, counter.rollupType)
        perf_dict[counter_full] = counter.key  # perf_dict包含了所有的perfCounter

    # 获取ESXi主机对象
    container_view = content.viewManager.CreateContainerView(content.rootFolder, [vim.HostSystem], True)

    for obj in container_view.view:
        print_statistics(obj, content, vc_time, statistics_interval_time, perf_dict)


# Start program
if __name__ == "__main__":
    main()

 

示例2: 获取VM相关的performance

"""
Python program that generates various statistics for one or more virtual machines
A list of virtual machines can be provided as a comma separated list.
"""

from __future__ import print_function
from pyVim.connect import SmartConnectNoSSL, Disconnect
from pyVmomi import vmodl, vim
from datetime import timedelta, datetime
import atexit


def connect_vc(host, user, pwd, port):
    si = SmartConnectNoSSL(host=host, user=user, pwd=pwd, port=port)

    # disconnect this thing
    atexit.register(Disconnect, si)
    return si


def BuildQuery(content, vchtime, counterId, instance, vm, interval):
    perfManager = content.perfManager
    metricId = vim.PerformanceManager.MetricId(counterId=counterId, instance=instance)
    startTime = vchtime - timedelta(minutes=(interval + 1))
    endTime = vchtime - timedelta(minutes=1)
    query = vim.PerformanceManager.QuerySpec(intervalId=20, entity=vm, metricId=[metricId], startTime=startTime,
                                             endTime=endTime)
    perfResults = perfManager.QueryPerf(querySpec=[query])
    if perfResults:
        return perfResults
    else:
        print('ERROR: Performance results empty.  TIP: Check time drift on source and vCenter server')
        print('Troubleshooting info:')
        print('vCenter/host date and time: {}'.format(vchtime))
        print('Start perf counter time   :  {}'.format(startTime))
        print('End perf counter time     :  {}'.format(endTime))
        print(query)
        exit()



def PrintVmInfo(vm, content, vchtime, interval, perf_dict, ):
    statInt = interval * 3  # There are 3 20s samples in each minute
    summary = vm.summary
    disk_list = []
    network_list = []

    # Convert limit and reservation values from -1 to None
    if vm.resourceConfig.cpuAllocation.limit == -1:
        vmcpulimit = "None"
    else:
        vmcpulimit = "{} Mhz".format(vm.resourceConfig.cpuAllocation.limit)
    if vm.resourceConfig.memoryAllocation.limit == -1:
        vmmemlimit = "None"
    else:
        vmmemlimit = "{} MB".format(vm.resourceConfig.cpuAllocation.limit)

    if vm.resourceConfig.cpuAllocation.reservation == 0:
        vmcpures = "None"
    else:
        vmcpures = "{} Mhz".format(vm.resourceConfig.cpuAllocation.reservation)
    if vm.resourceConfig.memoryAllocation.reservation == 0:
        vmmemres = "None"
    else:
        vmmemres = "{} MB".format(vm.resourceConfig.memoryAllocation.reservation)

    vm_hardware = vm.config.hardware
    for each_vm_hardware in vm_hardware.device:
        if (each_vm_hardware.key >= 2000) and (each_vm_hardware.key < 3000):
            disk_list.append('{} | {:.1f}GB | Thin: {} | {}'.format(each_vm_hardware.deviceInfo.label,
                                                         each_vm_hardware.capacityInKB/1024/1024,
                                                         each_vm_hardware.backing.thinProvisioned,
                                                         each_vm_hardware.backing.fileName))
        elif (each_vm_hardware.key >= 4000) and (each_vm_hardware.key < 5000):
            network_list.append('{} | {} | {}'.format(each_vm_hardware.deviceInfo.label,
                                                         each_vm_hardware.deviceInfo.summary,
                                                         each_vm_hardware.macAddress))

    #CPU Ready Average
    statCpuReady = BuildQuery(content, vchtime, (StatCheck(perf_dict, 'cpu.ready.summation')), "", vm, interval)
    cpuReady = (float(sum(statCpuReady[0].value[0].value)) / statInt)
    #CPU Usage Average % - NOTE: values are type LONG so needs divided by 100 for percentage
    statCpuUsage = BuildQuery(content, vchtime, (StatCheck(perf_dict, 'cpu.usage.average')), "", vm, interval)
    cpuUsage = ((float(sum(statCpuUsage[0].value[0].value)) / statInt) / 100)
    #Memory Active Average MB
    statMemoryActive = BuildQuery(content, vchtime, (StatCheck(perf_dict, 'mem.active.average')), "", vm, interval)
    memoryActive = (float(sum(statMemoryActive[0].value[0].value) / 1024) / statInt)
    #Memory Shared
    statMemoryShared = BuildQuery(content, vchtime, (StatCheck(perf_dict, 'mem.shared.average')), "", vm, interval)
    memoryShared = (float(sum(statMemoryShared[0].value[0].value) / 1024) / statInt)
    #Memory Balloon
    statMemoryBalloon = BuildQuery(content, vchtime, (StatCheck(perf_dict, 'mem.vmmemctl.average')), "", vm, interval)
    memoryBalloon = (float(sum(statMemoryBalloon[0].value[0].value) / 1024) / statInt)
    #Memory Swapped
    statMemorySwapped = BuildQuery(content, vchtime, (StatCheck(perf_dict, 'mem.swapped.average')), "", vm, interval)
    memorySwapped = (float(sum(statMemorySwapped[0].value[0].value) / 1024) / statInt)
    #Datastore Average IO
    statDatastoreIoRead = BuildQuery(content, vchtime, (StatCheck(perf_dict, 'datastore.numberReadAveraged.average')),
                                     "*", vm, interval)
    DatastoreIoRead = (float(sum(statDatastoreIoRead[0].value[0].value)) / statInt)
    statDatastoreIoWrite = BuildQuery(content, vchtime, (StatCheck(perf_dict, 'datastore.numberWriteAveraged.average')),
                                      "*", vm, interval)
    DatastoreIoWrite = (float(sum(statDatastoreIoWrite[0].value[0].value)) / statInt)
    #Datastore Average Latency
    statDatastoreLatRead = BuildQuery(content, vchtime, (StatCheck(perf_dict, 'datastore.totalReadLatency.average')),
                                      "*", vm, interval)
    DatastoreLatRead = (float(sum(statDatastoreLatRead[0].value[0].value)) / statInt)
    statDatastoreLatWrite = BuildQuery(content, vchtime, (StatCheck(perf_dict, 'datastore.totalWriteLatency.average')),
                                       "*", vm, interval)
    DatastoreLatWrite = (float(sum(statDatastoreLatWrite[0].value[0].value)) / statInt)

    #Network usage (Tx/Rx)
    statNetworkTx = BuildQuery(content, vchtime, (StatCheck(perf_dict, 'net.transmitted.average')), "", vm, interval)
    networkTx = (float(sum(statNetworkTx[0].value[0].value) * 8 / 1024) / statInt)
    statNetworkRx = BuildQuery(content, vchtime, (StatCheck(perf_dict, 'net.received.average')), "", vm, interval)
    networkRx = (float(sum(statNetworkRx[0].value[0].value) * 8 / 1024) / statInt)

    print('networkRx:', networkRx)
    print('networkTx:', networkTx)
    print('\nNOTE: Any VM statistics are averages of the last {} minutes\n'.format(statInt / 3))
    print('Server Name                    :', summary.config.name)
    print('Description                    :', summary.config.annotation)
    print('Guest                          :', summary.config.guestFullName)
    if vm.rootSnapshot:
        print('Snapshot Status                : Snapshots present')
    else:
        print('Snapshot Status                : No Snapshots')
    print('VM .vmx Path                   :', summary.config.vmPathName)
    try:
        print('Virtual Disks                  :', disk_list[0])
        if len(disk_list) > 1:
            disk_list.pop(0)
            for each_disk in disk_list:
                print('                                ', each_disk)
    except IndexError:
        pass
    print('Virtual NIC(s)                 :', network_list[0])
    if len(network_list) > 1:
        network_list.pop(0)
        for each_vnic in network_list:
            print('                                ', each_vnic)
    print('[VM] Limits                    : CPU: {}, Memory: {}'.format(vmcpulimit, vmmemlimit))
    print('[VM] Reservations              : CPU: {}, Memory: {}'.format(vmcpures, vmmemres))
    print('[VM] Number of vCPUs           :', summary.config.numCpu)
    print('[VM] CPU Ready                 : Average {:.1f} %, Maximum {:.1f} %'.format((cpuReady / 20000 * 100),
                                                                                       ((float(max(
                                                                                           statCpuReady[0].value[
                                                                                               0].value)) / 20000 * 100))))
    print('[VM] CPU (%)                   : {:.0f} %'.format(cpuUsage))
    print('[VM] Memory                    : {} MB ({:.1f} GB)'.format(summary.config.memorySizeMB, (float(summary.config.memorySizeMB) / 1024)))
    print('[VM] Memory Shared             : {:.0f} %, {:.0f} MB'.format(
        ((memoryShared / summary.config.memorySizeMB) * 100), memoryShared))
    print('[VM] Memory Balloon            : {:.0f} %, {:.0f} MB'.format(
        ((memoryBalloon / summary.config.memorySizeMB) * 100), memoryBalloon))
    print('[VM] Memory Swapped            : {:.0f} %, {:.0f} MB'.format(
        ((memorySwapped / summary.config.memorySizeMB) * 100), memorySwapped))
    print('[VM] Memory Active             : {:.0f} %, {:.0f} MB'.format(
        ((memoryActive / summary.config.memorySizeMB) * 100), memoryActive))
    print('[VM] Datastore Average IO      : Read: {:.0f} IOPS, Write: {:.0f} IOPS'.format(DatastoreIoRead,
                                                                                          DatastoreIoWrite))
    print('[VM] Datastore Average Latency : Read: {:.0f} ms, Write: {:.0f} ms'.format(DatastoreLatRead,
                                                                                      DatastoreLatWrite))
    print('[VM] Overall Network Usage     : Transmitted {:.3f} Mbps, Received {:.3f} Mbps'.format(networkTx, networkRx))
    print('[Host] Name                    : {}'.format(summary.runtime.host.name))
    print('[Host] CPU Detail              : Processor Sockets: {}, Cores per Socket {}'.format(
        summary.runtime.host.summary.hardware.numCpuPkgs,
        (summary.runtime.host.summary.hardware.numCpuCores / summary.runtime.host.summary.hardware.numCpuPkgs)))
    print('[Host] CPU Type                : {}'.format(summary.runtime.host.summary.hardware.cpuModel))
    print('[Host] CPU Usage               : Used: {} Mhz, Total: {} Mhz'.format(
        summary.runtime.host.summary.quickStats.overallCpuUsage,
        (summary.runtime.host.summary.hardware.cpuMhz * summary.runtime.host.summary.hardware.numCpuCores)))
    print('[Host] Memory Usage            : Used: {:.0f} GB, Total: {:.0f} GB\n'.format(
        (float(summary.runtime.host.summary.quickStats.overallMemoryUsage) / 1024),
        (float(summary.runtime.host.summary.hardware.memorySize) / 1024 / 1024 / 1024)))


def StatCheck(perf_dict, counter_name):
    counter_key = perf_dict[counter_name]
    return counter_key


def GetProperties(content, viewType, props, specType):
    # Build a view and get basic properties for all Virtual Machines
    objView = content.viewManager.CreateContainerView(content.rootFolder, viewType, True)
    tSpec = vim.PropertyCollector.TraversalSpec(name='tSpecName', path='view', skip=False, type=vim.view.ContainerView)
    pSpec = vim.PropertyCollector.PropertySpec(all=False, pathSet=props, type=specType)
    oSpec = vim.PropertyCollector.ObjectSpec(obj=objView, selectSet=[tSpec], skip=False)
    pfSpec = vim.PropertyCollector.FilterSpec(objectSet=[oSpec], propSet=[pSpec], reportMissingObjectsInResults=False)
    retOptions = vim.PropertyCollector.RetrieveOptions()
    totalProps = []
    retProps = content.propertyCollector.RetrievePropertiesEx(specSet=[pfSpec], options=retOptions)
    totalProps += retProps.objects
    while retProps.token:
        retProps = content.propertyCollector.ContinueRetrievePropertiesEx(token=retProps.token)
        totalProps += retProps.objects
    objView.Destroy()
    # Turn the output in retProps into a usable dictionary of values
    gpOutput = []
    for eachProp in totalProps:
        propDic = {}
        for prop in eachProp.propSet:
            propDic[prop.name] = prop.val
        propDic['moref'] = eachProp.obj
        gpOutput.append(propDic)
    return gpOutput


def main():
    username = 'administrator@vsphere.local'
    password = 'xxxxxx'
    vc_ip = '172.16.65.99'
    vc_port = '443'
    customization_spec_name = 'Ubuntu_Customization'

    si = connect_vc(host=vc_ip, user=username, pwd=password, port=vc_port)

    content = si.RetrieveContent()
    # Get vCenter date and time for use as baseline when querying for counters
    vchtime = si.CurrentTime()

    # Get all the performance counters
    perf_dict = {}
    perfList = content.perfManager.perfCounter
    for counter in perfList:
        counter_full = "{}.{}.{}".format(counter.groupInfo.key, counter.nameInfo.key, counter.rollupType)
        perf_dict[counter_full] = counter.key

    retProps = GetProperties(content, [vim.VirtualMachine], ['name', 'runtime.powerState'], vim.VirtualMachine)

    #Find VM supplied as arg and use Managed Object Reference (moref) for the PrintVmInfo
    for vm in retProps:
        PrintVmInfo(vm['moref'], content, vchtime, 20, perf_dict)
        break


# Start program
if __name__ == "__main__":
    main()
View Code

 

posted @ 2017-10-12 15:49  Vincen_shen  阅读(1692)  评论(0编辑  收藏  举报