VMware {code} Community
VirtualFisk
Contributor
Contributor
Jump to solution

Process Pulling Performance Data for Managed Entity C#

Could someone please describe the process for pulling performance data from the API? The documentation seems a little confusing.

Qustions:

Do you have to create an custom perf interval or can you use defaults?

If I have a performanceManager MOR and a hostSystem MOR which methods do I need to call on the PerformanceManger object in order to retrieve performance counters on the managed entity? I'm trying to retrieve the %ready time of a host. Looks like I need to use the QueryAvailablePerfMetric method to pull the MetricID's and then use the QueryPerf to pull the actual statics......

Any help is appreciated.

VirtualFisk

Tags (3)
0 Kudos
1 Solution

Accepted Solutions
admin
Immortal
Immortal
Jump to solution

You can use available perfIntervals to pull data.

You are correct to pull the performance data, you must first call QueryAvailablePerfMetric to get metricIds and then pass them in QueryPerf call.

Also to check that if real-time data is available on the entity or not you must first call QueryPerfProviderSummary on Entity and check currentSupported property of PerfProviderSummary. If it set as true then real-time data is available and you may pass refreshRate of PerfProviderSummary as intervalID in your QueryAvailablePerfMetric call and similarly pass this refreshRate as intervalID of PerfQuerySpec for QueryPerf Call.

Please refer following code snippet to retrieve data for HostSystem Managed entity (hostMoRef), you can replace it with Managed Object Reference of any entity

<br /><br/>
<br/><br/>
     int counterID;<br/><br/>
            int key;<br/><br/>
            String group;<br/><br/>
            String name;<br/><br/>
            String rollup;</p></p>
<p><p>            ManagedObjectReference pmRef = _sic.perfManager;<br/><br/>
            PerfCounterInfo[] cInfo = (PerfCounterInfo[])getObjectProperty(pmRef, "perfCounter");</p></p>
<p><p>            Hashtable PerfByID = new Hashtable();<br/><br/>
            for (int i = 0; i &lt; cInfo.Length; i++)<br/><br/>
            {<br/><br/>
                key = cInfo[i].key;<br/><br/>
                group = cInfo[i].groupInfo.key;<br/><br/>
                name = cInfo[i].nameInfo.key;<br/><br/>
                rollup = cInfo[i].rollupType.ToString();<br/><br/>
                Console.WriteLine("ID: " + key + "    group:  " + group + "." + name + "." + rollup);<br/><br/>
                PerfByID.Add(key, group + "." + name + "." + rollup);<br/><br/>
            }<br/><br/>
<br/><br/>
<br/><br/>
      Console.WriteLine("\n---------------------------------------------");<br/><br/>
                    Console.WriteLine("Entity: " + hostMoRef.Value);<br/><br/>
                    PerfProviderSummary perfSum = _service.QueryPerfProviderSummary(pmRef, hostMoRef);<br/><br/>
                    Console.WriteLine("Refresh Rate" + perfSum.refreshRate + "\nCurrentSupported :"<br/><br/>
                                      + perfSum.currentSupported + "\nisSummarySupported :" + perfSum.summarySupported);</p></p>
<p><p>                    Console.WriteLine("Fetching Perf Metric Ids");</p></p>
<p><p>                    DateTime curTime = _service.CurrentTime(_svcRef);<br/><br/>
                    DateTime beginTime = curTime.Subtract(new TimeSpan(1, 0, 0));<br/><br/>
                    DateTime endTime = curTime;<br/><br/>
                    int intervalID;<br/><br/>
<br/><br/>
                    if (perfSum.refreshRate &lt; 0) {<br/><br/>
                        intervalID = 300;<br/><br/>
                    } else {<br/><br/>
                        intervalID = perfSum.refreshRate;<br/><br/>
                    }<br/><br/>
                    intervalID = 300;<br/><br/>
                    PerfMetricId[] Ids = _service.QueryAvailablePerfMetric(pmRef, hostMoRef, beginTime, false, endTime, false, intervalID, true);</p></p>
<p><p>                    if (Ids != null && Ids.Length &gt; 0)<br/><br/>
                    {<br/><br/>
                        Console.WriteLine("Ids fetched from QueryAvailablePerfMetric API are:");<br/><br/>
                        for (int k = 0; k &lt; Ids.Length; k++) {<br/><br/>
                            Console.WriteLine("ID is: " + Ids[k].counterId + " Instance is: " + Ids[k].instance + "Name is: " + PerfByID[Ids[http://k].counterId|http://k].counterId]);<br/><br/>
                        }</p></p>
<p><p>                        PerfQuerySpec qSpec = new PerfQuerySpec();<br/><br/>
                        qSpec.entity = hostMoRef;<br/><br/>
                        qSpec.metricId = Ids;<br/><br/>
                        qSpec.format = "csv";<br/><br/>
                        qSpec.intervalId = intervalID;<br/><br/>
                        qSpec.startTime = beginTime;<br/><br/>
                        qSpec.startTimeSpecified = true;<br/><br/>
                        qSpec.endTime = endTime;<br/><br/>
                        qSpec.endTimeSpecified = true;<br/><br/>
                        qSpec.maxSample = 1;<br/><br/>
                        qSpec.maxSampleSpecified = true;</p></p>
<p><p>                        PerfQuerySpec[] qSpecs = new PerfQuerySpec[] { qSpec };<br/><br/>
                        if (hostMoRef != null)<br/><br/>
                        {<br/><br/>
                            PerfEntityMetricBase[] perfEntity = null;<br/><br/>
                            perfEntity = _service.QueryPerf(pmRef, qSpecs);</p></p>
<p><p>                            if (perfEntity != null && perfEntity.Length &gt; 0)<br/><br/>
                            {<br/><br/>
                                for (int i = 0; i &lt; perfEntity.Length; i++)<br/><br/>
                                {<br/><br/>
                                    PerfEntityMetricCSV pms = (PerfEntityMetricCSV)perfEntity[i];<br/><br/>
                                    PerfMetricSeriesCSV[] vals = pms.value;<br/><br/>
                                    if (vals != null)<br/><br/>
                                    {<br/><br/>
                                        Console.WriteLine("Perf Counters fetched");<br/><br/>
                                        for (int vi = 0; vi &lt; vals.Length; vi++)<br/><br/>
                                        {<br/><br/>
                                            PerfMetricSeriesCSV pmCSV = vals[vi];<br/><br/>
                                            if (PerfByID[vals[http://vi].id.counterId|http://vi].id.counterId].ToString().StartsWith("mem.vmmemctl")) {<br/><br/>
                                            Console.WriteLine("CounterId: " + vals[vi].id.counterId + " Name: " + PerfByID[vals[http://vi].id.counterId|http://vi].id.counterId] + " Instance: " + vals[vi].id.instance + " ----- ");<br/><br/>
                                            counterID = vals[vi].id.counterId;<br/><br/>
                                            //Console.WriteLine("Value in Map: " + PerfByID.get(counterID));<br/><br/>
                                            Console.WriteLine("-------- Value : " + pmCSV.value);<br/><br/>
                                            }<br/><br/>
                                        }<br/><br/>
                                    }<br/><br/>
                                }<br/><br/>
                            }<br/><br/>
                            else<br/><br/>
                            {<br/><br/>
                                Console.WriteLine("Performance statistics not available for this entity!");<br/><br/>
                            }<br/><br/>
                        }<br/><br/>
                    }<br/><br/>
                    else<br/><br/>
                    {<br/><br/>
                        Console.WriteLine("Perf Metrics not fetched");<br/><br/>
                    }</p></p>
<p><p>      

</p>

View solution in original post

0 Kudos
5 Replies
admin
Immortal
Immortal
Jump to solution

You can use available perfIntervals to pull data.

You are correct to pull the performance data, you must first call QueryAvailablePerfMetric to get metricIds and then pass them in QueryPerf call.

Also to check that if real-time data is available on the entity or not you must first call QueryPerfProviderSummary on Entity and check currentSupported property of PerfProviderSummary. If it set as true then real-time data is available and you may pass refreshRate of PerfProviderSummary as intervalID in your QueryAvailablePerfMetric call and similarly pass this refreshRate as intervalID of PerfQuerySpec for QueryPerf Call.

Please refer following code snippet to retrieve data for HostSystem Managed entity (hostMoRef), you can replace it with Managed Object Reference of any entity

<br /><br/>
<br/><br/>
     int counterID;<br/><br/>
            int key;<br/><br/>
            String group;<br/><br/>
            String name;<br/><br/>
            String rollup;</p></p>
<p><p>            ManagedObjectReference pmRef = _sic.perfManager;<br/><br/>
            PerfCounterInfo[] cInfo = (PerfCounterInfo[])getObjectProperty(pmRef, "perfCounter");</p></p>
<p><p>            Hashtable PerfByID = new Hashtable();<br/><br/>
            for (int i = 0; i &lt; cInfo.Length; i++)<br/><br/>
            {<br/><br/>
                key = cInfo[i].key;<br/><br/>
                group = cInfo[i].groupInfo.key;<br/><br/>
                name = cInfo[i].nameInfo.key;<br/><br/>
                rollup = cInfo[i].rollupType.ToString();<br/><br/>
                Console.WriteLine("ID: " + key + "    group:  " + group + "." + name + "." + rollup);<br/><br/>
                PerfByID.Add(key, group + "." + name + "." + rollup);<br/><br/>
            }<br/><br/>
<br/><br/>
<br/><br/>
      Console.WriteLine("\n---------------------------------------------");<br/><br/>
                    Console.WriteLine("Entity: " + hostMoRef.Value);<br/><br/>
                    PerfProviderSummary perfSum = _service.QueryPerfProviderSummary(pmRef, hostMoRef);<br/><br/>
                    Console.WriteLine("Refresh Rate" + perfSum.refreshRate + "\nCurrentSupported :"<br/><br/>
                                      + perfSum.currentSupported + "\nisSummarySupported :" + perfSum.summarySupported);</p></p>
<p><p>                    Console.WriteLine("Fetching Perf Metric Ids");</p></p>
<p><p>                    DateTime curTime = _service.CurrentTime(_svcRef);<br/><br/>
                    DateTime beginTime = curTime.Subtract(new TimeSpan(1, 0, 0));<br/><br/>
                    DateTime endTime = curTime;<br/><br/>
                    int intervalID;<br/><br/>
<br/><br/>
                    if (perfSum.refreshRate &lt; 0) {<br/><br/>
                        intervalID = 300;<br/><br/>
                    } else {<br/><br/>
                        intervalID = perfSum.refreshRate;<br/><br/>
                    }<br/><br/>
                    intervalID = 300;<br/><br/>
                    PerfMetricId[] Ids = _service.QueryAvailablePerfMetric(pmRef, hostMoRef, beginTime, false, endTime, false, intervalID, true);</p></p>
<p><p>                    if (Ids != null && Ids.Length &gt; 0)<br/><br/>
                    {<br/><br/>
                        Console.WriteLine("Ids fetched from QueryAvailablePerfMetric API are:");<br/><br/>
                        for (int k = 0; k &lt; Ids.Length; k++) {<br/><br/>
                            Console.WriteLine("ID is: " + Ids[k].counterId + " Instance is: " + Ids[k].instance + "Name is: " + PerfByID[Ids[http://k].counterId|http://k].counterId]);<br/><br/>
                        }</p></p>
<p><p>                        PerfQuerySpec qSpec = new PerfQuerySpec();<br/><br/>
                        qSpec.entity = hostMoRef;<br/><br/>
                        qSpec.metricId = Ids;<br/><br/>
                        qSpec.format = "csv";<br/><br/>
                        qSpec.intervalId = intervalID;<br/><br/>
                        qSpec.startTime = beginTime;<br/><br/>
                        qSpec.startTimeSpecified = true;<br/><br/>
                        qSpec.endTime = endTime;<br/><br/>
                        qSpec.endTimeSpecified = true;<br/><br/>
                        qSpec.maxSample = 1;<br/><br/>
                        qSpec.maxSampleSpecified = true;</p></p>
<p><p>                        PerfQuerySpec[] qSpecs = new PerfQuerySpec[] { qSpec };<br/><br/>
                        if (hostMoRef != null)<br/><br/>
                        {<br/><br/>
                            PerfEntityMetricBase[] perfEntity = null;<br/><br/>
                            perfEntity = _service.QueryPerf(pmRef, qSpecs);</p></p>
<p><p>                            if (perfEntity != null && perfEntity.Length &gt; 0)<br/><br/>
                            {<br/><br/>
                                for (int i = 0; i &lt; perfEntity.Length; i++)<br/><br/>
                                {<br/><br/>
                                    PerfEntityMetricCSV pms = (PerfEntityMetricCSV)perfEntity[i];<br/><br/>
                                    PerfMetricSeriesCSV[] vals = pms.value;<br/><br/>
                                    if (vals != null)<br/><br/>
                                    {<br/><br/>
                                        Console.WriteLine("Perf Counters fetched");<br/><br/>
                                        for (int vi = 0; vi &lt; vals.Length; vi++)<br/><br/>
                                        {<br/><br/>
                                            PerfMetricSeriesCSV pmCSV = vals[vi];<br/><br/>
                                            if (PerfByID[vals[http://vi].id.counterId|http://vi].id.counterId].ToString().StartsWith("mem.vmmemctl")) {<br/><br/>
                                            Console.WriteLine("CounterId: " + vals[vi].id.counterId + " Name: " + PerfByID[vals[http://vi].id.counterId|http://vi].id.counterId] + " Instance: " + vals[vi].id.instance + " ----- ");<br/><br/>
                                            counterID = vals[vi].id.counterId;<br/><br/>
                                            //Console.WriteLine("Value in Map: " + PerfByID.get(counterID));<br/><br/>
                                            Console.WriteLine("-------- Value : " + pmCSV.value);<br/><br/>
                                            }<br/><br/>
                                        }<br/><br/>
                                    }<br/><br/>
                                }<br/><br/>
                            }<br/><br/>
                            else<br/><br/>
                            {<br/><br/>
                                Console.WriteLine("Performance statistics not available for this entity!");<br/><br/>
                            }<br/><br/>
                        }<br/><br/>
                    }<br/><br/>
                    else<br/><br/>
                    {<br/><br/>
                        Console.WriteLine("Perf Metrics not fetched");<br/><br/>
                    }</p></p>
<p><p>      

</p>

0 Kudos
VirtualFisk
Contributor
Contributor
Jump to solution

Wow....great example thanks a ton.

I do have one more question regarding the following line:

PerfCounterInfo[] cInfo = (PerfCounterInfo[])getObjectProperty(pmRef, "perfCounter");

I'm rather new C# and the API and I'm having trouble pulling the dynamic properties for the PerformanceManager MOR from the API. Do you still pull dynamic properties using the RetrieveProperties method? For some reason when I do that I'm not able to assign the ObjectContents.prepset[] to the PerfCounterInfo[]. This is what I have so far.....

public void getObjectProperties( ManagedObjectReference targetObject, string propertyPath )

{

PropertyFilterSpec pfsTest = createPropFilterSpecObj( createPropSpecObj(targetObject.type, null, true) , createObjectSpecObj(targetObject, false));

ObjectContent[http://] ocTest = vimServiceSession.RetrieveProperties(propCol, new PropertyFilterSpec[|http://] ocTest = vimServiceSession.RetrieveProperties(propCol, new PropertyFilterSpec[] { pfsTest });

foreach (var content in ocTest)

{

Console.WriteLine("obj.type = " + content.obj.type);

Console.WriteLine("obj.value = " + content.obj.Value);

//Console.WriteLine("propset.length = " + content.propSet.Length);

PerfCounterInfo[] test = new PerfCounterInfo[] {new PerfCounterInfo()};

test[0] = content.propSet;

//Console.WriteLine("content.propSet[0].name = " + content.propSet[0].GetType());

//Console.WriteLine("content.propSet[0].val = " + content.propSet[0].val);

//displayObjContMORProp(content);

}

}

Thanks for dealing with my ignorance.

VirtualFisk

0 Kudos
admin
Immortal
Immortal
Jump to solution

Yes we do use RetrieveProperties to pull the dynamic properties. We fetch the Object array from Object Content where each object contains the value of the Dynamic Properties we were interested in.

 <br /><br/>
  String[] properties; // dynamic properties you wanted to retrieve and pass as pathSet in PropertySpec<br/><br/>
  ocs = _service.RetrieveProperties(_propCol, new PropertyFilterSpec[] { pfSpec });</p></p>
<p><p>            // Return value, one object for each property specified</p></p>
<p><p>            Object[] ret = new Object[http://properties.Length|http://properties.Length];</p></p>
<p><p>            if (ocs != null){</p></p>
<p><p>                for (int i = 0; i &lt; ocs.Length; ++i){</p></p>
<p><p>                    ObjectContent oc = ocs[i];<br/><br/>
                    DynamicProperty[] dps = oc.propSet;<br/><br/>
                    if (dps != null){<br/><br/>
                        for (int j = 0; j &lt; dps.Length; ++j){</p></p>
<p><p>                            DynamicProperty dp = dps[j];<br/><br/>
                            // find property path index<br/><br/>
                            for (int p = 0; p &lt; ret.Length; ++p)<br/><br/>
                            {<br/><br/>
                                if (properties[p].Equals(dp.name))<br/><br/>
                                {<br/><br/>
                                    ret[p] = dp.val;<br/><br/>
                                }<br/><br/>
                            }<br/><br/>
                        }<br/><br/>
                    }<br/><br/>
                }<br/><br/>
            }</p></p>
<p><p>            // Here ret object[] would contains all values, we would then type Cast it into the object we were interested in.<br/><br/>
     

0 Kudos
Fisk
Contributor
Contributor
Jump to solution

I'm able to pull information about the counters using the following code but I"m still not sure where the actual statistic associate with each counter is passed. Am I missing something? I'm passing in the target hostMOR I'm attempting to collect statics on.

public void findPerformanceDetails( ManagedObjectReference targetMOR )

{

Console.WriteLine("Findind Performance Information like %Ready on host " + targetMOR.Value);

int intervalID = 300;

int counterID;

int key;

String group;

String name;

String rollup;

DateTime curTime = _vimServiceSession.CurrentTime(serviceInstObjRef);

DateTime beginTime = curTime.Subtract(new TimeSpan(1,0,0,0));

DateTime endTime = curTime;

PerfMetricId[] perID = vimServiceSession.QueryAvailablePerfMetric(perforManager, targetMOR, beginTime, false, endTime, false, intervalID, true);

Console.WriteLine("QueryAvailablePerf length = " + perID.Length);

foreach (var perfMetric in perID)

{

Console.WriteLine("PerfMetric.CounterID = " + perfMetric.counterId);

}

PerfQuerySpec[] qSpec = new PerfQuerySpec[] { new PerfQuerySpec() };

qSpec[0].entity = targetMOR;

qSpec[0].metricId = perID;

qSpec[0].intervalId = intervalID;

qSpec[0].startTime = beginTime;

qSpec[0].endTime = endTime;

qSpec[0].startTimeSpecified = true;

qSpec[0].endTimeSpecified = true;

qSpec[0].maxSample = 1;

qSpec[0].maxSampleSpecified = true;

PerfEntityMetricBase[] perfMORObj = vimServiceSession.QueryPerf(perforManager, qSpec);

if(perfMORObj.Length &gt; 0)

{

Console.WriteLine("FOUND PERFORMANCE STATS");

for (int a = 0; a &lt; perfMORObj.Length; ++a)

{

PerfEntityMetric perMetVal = (PerfEntityMetric)perfMORObj[a];

PerfMetricSeries[] perfVal = perMetVal.value;

PerfSampleInfo[] sample = perMetVal.sampleInfo;

for (int c = 0; c &lt; sample.Length; ++c)

{

//sample[c].

}

Console.WriteLine("perfentitymetric value = " + perMetVal.value);

Console.WriteLine("perfentitymetric entity value = " + perMetVal.entity.Value);

for(int b= 0; b &lt; perfVal.Length; ++b)

{

PerfMetricSeries pmCSV = perfVal;

Console.WriteLine("perfval = " + pmCSV.id.counterId.ToString());

Console.WriteLine("Instance = " + pmCSV.id.instance);

int[] counterids = new int[1];

counterids[0] = pmCSV.id.counterId;

PerfCounterInfo[] perfinfo = vimServiceSession.QueryPerfCounter(perforManager, counterids);

Console.WriteLine("summary = " + perfinfo[0].nameInfo.summary);

Console.WriteLine("Percentage = " + perfinfo[0].unitInfo.key);

Console.WriteLine("");

}

}

}

0 Kudos
Fisk
Contributor
Contributor
Jump to solution

Finally got it working.

public void findPerformanceDetails( ManagedObjectReference targetMOR )

{

Console.WriteLine("Findind Performance Information like %Ready on host " + targetMOR.Value);

//DateTime start = DateTime.Now.Date;

//DateTime end = DateTime.Now.Date;

int intervalID = 300;

int counterID;

//start.Subtract(new TimeSpan(1, 0, 0));

int key;

String group;

String name;

String rollup;

DateTime curTime = _vimServiceSession.CurrentTime(serviceInstObjRef);

DateTime beginTime = curTime.Subtract(new TimeSpan(1,0,0,0));

DateTime endTime = curTime;

string[] arrProps = new string[]{ "perfCounter"};

Object[] obInfo = getObjectProperties(_perforManager, arrProps);

PerfCounterInfo[] cInfo = (PerfCounterInfo[])obInfo[0];

Hashtable PerfByID = new Hashtable();

for (int i = 0; i &lt; cInfo.Length; i++)

{

key = cInfo[i].key;

group = cInfo[i].groupInfo.key;

name = cInfo[i].nameInfo.key;

rollup = cInfo[i].rollupType.ToString();

Console.WriteLine("ID: " + key + " group: " + group + "." + name + "." + rollup);

PerfByID.Add(key, group + "." + name + "." + rollup);

}

PerfProviderSummary perfSum = vimServiceSession.QueryPerfProviderSummary(perforManager, targetMOR);

Console.WriteLine("Refresh Rate" + perfSum.refreshRate + "\nCurrentSupported :"

+ perfSum.currentSupported + "\nisSummarySupported :" + perfSum.summarySupported);

PerfMetricId[] perID = vimServiceSession.QueryAvailablePerfMetric(perforManager, targetMOR, beginTime, false, endTime, false, intervalID, true);

Console.WriteLine("QueryAvailablePerf length = " + perID.Length);

foreach (var perfMetric in perID)

{

Console.WriteLine("PerfMetric.CounterID = " + perfMetric.counterId);

Console.WriteLine("PerfByID = " + PerfByID[http://perfMetric.counterId|http://perfMetric.counterId]);

//DynamicProperty dp = perfMetric.dynamicProperty;

//Console.WriteLine("PerfMetric.Instance = " + perfMetric.nameInfo.summary);

}

PerfQuerySpec[] qSpec = new PerfQuerySpec[] { new PerfQuerySpec() };

qSpec[0].entity = targetMOR;

qSpec[0].metricId = perID;

qSpec[0].intervalId = intervalID;

qSpec[0].startTime = beginTime;

qSpec[0].endTime = endTime;

qSpec[0].startTimeSpecified = true;

qSpec[0].endTimeSpecified = true;

qSpec[0].maxSample = 1;

qSpec[0].maxSampleSpecified = true;

PerfEntityMetricBase[] perfMORObj = vimServiceSession.QueryPerf(perforManager, qSpec);

if(perfMORObj != null && perfMORObj.Length &gt; 0)

{

// PerfCounterInfo perfinfo = perfMORObj[0];

//Console.WriteLine("Here it is. " + perfinfo.nameInfo.summary);

for (int a = 0; a &lt; perfMORObj.Length; ++a)

{

PerfEntityMetric perMetVal = (PerfEntityMetric)perfMORObj[a];

PerfMetricSeries[] perfVal = perMetVal.value;

PerfSampleInfo[] sample = perMetVal.sampleInfo;

if (sample != null || sample.Length != 0)

{

for (int c = 0; c &lt; sample.Length; ++c)

{

//Console.WriteLine("Samples Found.");

//sample[c].

}

}

else

Console.WriteLine("No Samples Found.");

if(perfVal != null)

{

Console.WriteLine("Perf Counters fetched");

Console.WriteLine("perfentitymetric value = " + perMetVal.value);

Console.WriteLine("perfentitymetric entity value = " + perMetVal.entity.Value);

for(int b= 0; b &lt; perfVal.Length; ++b)

{

PerfMetricSeries pmCSV = perfVal[b];

PerfMetricIntSeries intVal = (PerfMetricIntSeries)perfVal[b];

Console.WriteLine("perfval = " + pmCSV.id.counterId.ToString());

Console.WriteLine("Rollup = " + PerfByID[perfVal[http://b].id.counterId|http://b].id.counterId]);

Console.WriteLine("Value = " + intVal.value);

long[] stat = intVal.value;

foreach (long lng in stat)

{

Console.Write(lng + " ");

}

Console.WriteLine("");

//int[] counterids = new int[1];

//counterids[0] = pmCSV.id.counterId;

//PerfCounterInfo[] perfinfo = vimServiceSession.QueryPerfCounter(perforManager, counterids);

//Console.WriteLine("summary = " + perfinfo[0].nameInfo.summary);

//Console.WriteLine("Percentage = " + perfinfo[0].unitInfo.key);

//Console.WriteLine("");

}

}

}

}

public Object[] getObjectProperties( ManagedObjectReference targetObject, string[] propertyPath )

{

Console.WriteLine("targetobject = " + targetObject.Value);

PropertyFilterSpec pfsTest = createPropFilterSpecObj( createPropSpecObj(targetObject.type, propertyPath, true) , createObjectSpecObj(targetObject, false));

ObjectContent[http://] ocTest = vimServiceSession.RetrieveProperties(propCol, new PropertyFilterSpec[|http://] ocTest = vimServiceSession.RetrieveProperties(propCol, new PropertyFilterSpec[] { pfsTest });

//DynamicProperty[]

Object[] retObjProp = new Object[http://propertyPath.Length|http://propertyPath.Length];

foreach (ObjectContent content in ocTest)

{

Console.WriteLine("obj.type = " + content.obj.type);

Console.WriteLine("obj.value = " + content.obj.Value);

DynamicProperty[] dptest = content.propSet;

if (dptest != null)

{

for (int a = 0; a &lt; dptest.Length; ++a)

{

DynamicProperty dp = dptest[a];

if (propertyPath[a].Equals(dp.name))

retObjProp[a] = dp.val;

}

}

else

Console.WriteLine("No DynamicProp Collected.");

}

foreach (Object prop in retObjProp)

{

Console.WriteLine("Dyanamic Property = " + prop.ToString());

}

return retObjProp;

}

0 Kudos