zoukankan      html  css  js  c++  java
  • 通过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('
    NOTE: Any VM statistics are averages of the last {} minutes
    '.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
    '.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
  • 相关阅读:
    Ubuntu下OpenCV的安装和QT调用openCV库的方法
    VC维含义的个人理解
    红黑树的学习笔记
    Linux下Matlab的安装和中文显示支持
    《Python学习手册》读书笔记
    稀疏图上的Johnson算法
    利用隐藏神经元解决异或问题的小型示例程序
    gdb调试命令
    MATLAB生成正态样本以及正态矩阵、从文件读入矩阵
    Python遍历路径下文件并转换成UTF8编码
  • 原文地址:https://www.cnblogs.com/vincenshen/p/7656440.html
Copyright © 2011-2022 走看看