Tuesday, May 26, 2020

vRealize Operations Export the Latest Metrics for VM(s)

In a response to a customer asking about exporting VM metrics via the REST API, I put together the following post.  The REST API for vRealize Operations Manager provides a few methods for exporting metrics.  For this exercise, I'm showing a method to get the latest stats for a selected resource: 

"/suite-api/api/resources/stats/latest/query"

To use this method, the script requires the ID for the resource we will query.  To get the ID, I'll copy the code from one of my earlier posts to search for a VM based on the name entered and use that as the base for the script below.  The script is written in Python.

The script has the ability to return selected stats (metrics) or all the stats for virtual machines.  Once you run the script to return all of the metrics, you can modify the statKey parameters in vropsGetResIdStats to return selected metrics.  The script will return results for Virtual Machines that are not templates, powered on and currently providing data to vRealize Operations.

You can also return all the properties for the searched VMs.  At the end of the script, you'll see where that is commented out by default.  Remove the hashtag to enable that process.

To execute the script, enter the script name like this:

"python3 getstats.py -n vm-name"

or to return all virtual machines:

"python3 getstats.py -a"

The script is currently configured to display the results to the screen in JSON format.  I've included the parameters to return XML or CSV.  Those lines are commented out.

Like the other Python scripts in my blog, I'm using configparser to store and read the configuration parameters for username, password and server address.  The script is written to authenticate to vROps as a local user.

<--- Begin getstats.py --->

#!/usr/bin/python3


#imports

import getopt, sys, json, requests, configparser

from requests.packages.urllib3.exceptions import InsecureRequestWarning

requests.packages.urllib3.disable_warnings(InsecureRequestWarning)


# Authenticate (vROps local user - consider updating script to allow for IDM)

def Authenticate():

    #Read Config parameters

    config = configparser.ConfigParser()

    config.read('config.ini')


    #Your vROps environment parameters

    usrName = config['vrops user']['usrName']

    usrPass = config['vrops user']['usrPass']

    srvName = config['vrops server']['srvName']


    global baseURL

    baseURL = "https://" + srvName


    tokenURL = baseURL + "/suite-api/api/auth/token/acquire"

    authJSON = {"username": usrName,"authSource": "Local","password": usrPass,"others": [],"otherAttributes": {}}

    authHeaders = {"Content-Type":"application/json","Accept":"application/json"}

    authResponse = requests.post(tokenURL,data=json.dumps(authJSON),headers=authHeaders,verify=False)

    if (authResponse.status_code != 200):

        print('probably invalid credentials')

        print('Returned Status Code: ' + authResponse.status_code)

        sys.exit(2)

    else:

        authToken = "vRealizeOpsToken " + authResponse.json()['token']

        return authToken


# Get all VMs in the vROps database

# Return only VMs that are not templates and are receiving data from vCenter

def vropsGetAllVms(token):

    vmList=[]

    Headers = {"Content-Type":"application/json","Authorization":token,"Accept":"application/json"}

    vropsURL = baseURL+"/suite-api/api/resources?resourceKind=virtualmachine"

    response = requests.get(vropsURL,headers=Headers,verify=False)

    data = response.json()

    AddVmToList(token,data,vmList)

    return(vmList)


# Search vROps database for the VM Name

# Return only VMs that are not templates and are receiving data from vCenter

def vropsSearchName(token, vm_name):

    vmList = []

    Headers = {"Content-Type":"application/json","Authorization":token,"Accept":"application/json"}

    vropsURL = baseURL+"/suite-api/api/adapterkinds/VMWARE/resourcekinds/virtualmachine/resources?name="+vm_name

    response = requests.get(vropsURL,headers=Headers,verify=False)

    if (response.status_code == 200):

        data = response.json()

        if data['pageInfo']['totalCount'] == '0':

            return ('Searched term not found')

        else:

            AddVmToList(token,data,vmList)

    return (vmList)


# Add VM to the VM List only if it exists, is not a template and is Powered On

def AddVmToList(token,data,vmList):

    for x in range(int(data['pageInfo']['totalCount'])):

        for y in range(len(data['resourceList'][x]['resourceStatusStates'])):

            adapterKey = vropsGetAdapterKind(token,data['resourceList'][x]['resourceStatusStates'][y]['adapterInstanceId'])

            resState = data['resourceList'][x]['resourceStatusStates'][y]['resourceState'] 

            if (adapterKey == 'VMWARE'):

                if (resState == 'NOT_EXISTING'):

                    break

                else:

                    msg = vropsVmStatus(token,data['resourceList'][x]['identifier'])

                    if (msg[0]=='false' and msg[1]=='Powered On'):

                        vmList.append(data['resourceList'][x]['identifier'])

                        msg = data['resourceList'][x]['resourceKey']['name']+": "

                        msg += data['resourceList'][x]['identifier']+" "

#                        msg += data['resourceList'][x]['resourceKey']['resourceIdentifiers'][2]['value']

                        print(msg)

    return(vmList)


def vropsVmStatus(token,vmId):

    Headers = {"Content-Type":"application/json","Authorization":token,"Accept":"application/json"}

    Data = {

        "resourceIds":[vmId],

        "propertyKeys": ["summary|config|isTemplate","summary|runtime|powerState"],

        "other": [],

        "otherAttributes": {}

    }

    vropsURL = baseURL+"/suite-api/api/resources/properties/latest/query"

    response = requests.post(vropsURL,headers=Headers,data=json.dumps(Data),verify=False)

    resp = response.json()

    isTemplate = resp['values'][0]['property-contents']['property-content'][0]['values'][0]

    powerState = resp['values'][0]['property-contents']['property-content'][1]['values'][0]

    msg = [isTemplate,powerState]

    return(msg)


# Get the metrics for the VM

# Change the statKey parameter to select metrics.  An empty list will return all metrics

# Change maxSamples to return X past values for each metric.  1 returns the latest metric

def vropsGetResIdStats(token, vmId):

#    Headers = {"Content-Type":"application/json","Authorization":token,"Accept":"text/csv"}

#    Headers = {"Content-Type":"application/json","Authorization":token,"Accept":"application/xml"}

    Headers = {"Content-Type":"application/json","Authorization":token,"Accept":"application/json"}

    Data = {

     "resourceId" : [vmId],

     "statKey" : ["cpu|workload","cpu|demandPct"],

#     "statKey" : [],

     "metrics" : False,

     "currentOnly" : False,

     "maxSamples" : 1

    }

    vropsURL = baseURL+"/suite-api/api/resources/stats/latest/query"

    response = requests.post(vropsURL,headers=Headers,data=json.dumps(Data),verify=False)

    newstr=(response.text).replace("\n",",").strip()

    print(newstr)


# Get all the properties for the VM

def vropsGetResIdProps(token, vmId):

#    Headers = {"Content-Type":"application/json","Authorization":token,"Accept":"text/csv"}

#    Headers = {"Content-Type":"application/json","Authorization":token,"Accept":"application/xml"}

    Headers = {"Content-Type":"application/json","Authorization":token,"Accept":"application/json"}

    vropsURL = baseURL+"/suite-api/api/resources/"+vmId+"/properties"

    response = requests.get(vropsURL,headers=Headers,verify=False)

    newstr=(response.text).replace("\n",",").strip()

    print(newstr)


def vropsGetAdapterKind(token,adapterId):

    Headers = {"Content-Type":"application/json","Authorization":token,"Accept":"application/json"}

    vropsURL = baseURL+"/suite-api/api/adapters/"+adapterId

    response = requests.get(vropsURL,headers=Headers,verify=False)

    if response.status_code == 200:

        return(response.json()['resourceKey']['adapterKindKey'])

    else:

        print("There is a problem searching for the adapter")

        sys.exit(2)


def Logout(token):

    releaseURL = baseURL + "/suite-api/api/auth/token/release"

    authHeaders = {"Content-Type":"application/json","Authorization":token,"Accept":"application/json"}

    authResponse = requests.post(releaseURL,headers=authHeaders,verify=False)


def Usage():

    print("We need:")

    print(" -a or --all")

    print(" -n <VM Name>")

    print("for parameters")


def main():

# Check for passed arguments

    if len(sys.argv)==1:

        Usage()

        sys.exit()


    try:

        opts, args = getopt.getopt(sys.argv[1:], "han:",["help","all","name="])

    except getopt.GetoptError as err:

        print(err)

        Usage()

        sys.exit(2)

    authToken = Authenticate()

    vmList = []

    for key,value in opts:

        if key == ("-h", "--help"):

            Usage()

            sys.exit()

        elif key in ("-a", "--all"):

            vmList = vropsGetAllVms(authToken)

        elif key in ("-n", "--name"):

            vmList = vropsSearchName(authToken, value)

        else:

            Usage()


        for x in range(len(vmList)):

            vropsGetResIdStats(authToken,vmList[x])

#            vropsGetResIdProps(authToken,vmList[x])


    Logout(authToken)


if __name__ == "__main__":

    main()


<--- End getstats.py --->

Thanks for checking out the blog.

No comments:

Post a Comment