VMware Cloud Community
vmcts
Contributor
Contributor

How do i get the latest , minimum and maximum value in real-time performance statistics using VI SDK

Hi ,

I am working on real time performance statistics using vmware VI SDK. What I am getting using the vmware vi sdk is only the average value .Could any one of u let me know how do i get the latest, minimum and maximum value for CPU, Disk ,Memory etc using vmware vi sdk service. Please find below my code which i am using to get the real time data:

private void printEntityCounters(String entityType)

{

if (_ServiceContent == null)

{

_bConnection = false;

Connect();

}

Debug.Assert(_ServiceContent != null);

// Get Performance Manager

ManagedObjectReference pmRef = _ServiceContent.perfManager;

// Get supported perf counters in the system

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

// PerfInterval[] cInfo = (PerfInterval[])getObjectProperty(pmRef, "historicalInterval");

ArrayList vmCpuCounters = new ArrayList();

int index = 0;

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

{

if ("disk".Equals(cInfo[i].groupInfo.key))

{

vmCpuCounters.Add(cInfo[i]);

index++;

}

}

Hashtable usageCounter = new Hashtable();

while (index > 0)

{

//int index = 0;

for (IEnumerator it = vmCpuCounters.GetEnumerator(); it.MoveNext(); )

{

PerfCounterInfo pcInfo = (PerfCounterInfo)it.Current;

Console.WriteLine(index + " - " + pcInfo.nameInfo.label);

PerfCounterInfo pcInfo1 = (PerfCounterInfo)vmCpuCounters[--index];

usageCounter.Add((pcInfo1.key), pcInfo1);

//index--;

}

}

ManagedObjectReference vmmor = null;

_svcRef = new ManagedObjectReference();

_svcRef.type = "ServiceInstance";

_svcRef.Value = "ServiceInstance";

ArrayList morlist = GetDecendentMoRefs(null, entityType);

Boolean continueDataCol = true;

while (continueDataCol)

{

DateTime curTime = VS.CurrentTime(_svcRef);

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

DateTime endTime = curTime;//.Subtract(new TimeSpan(1, 0, 0));//.Add(new TimeSpan(0, 5, 0));

if (morlist != null && morlist.Count > 0)

{

for (int j = 0; j < morlist.Count; j++)

{

vmmor = (ManagedObjectReference)((object[])morlist[j])[0];

ObjectContent[] vmname = GetObjectProperties(vmmor, new string[] { "name" });

PerfMetricId[] aMetrics = VS.QueryAvailablePerfMetric(pmRef, vmmor, beginTime, true, endTime, true, 20, true);

ArrayList mMetrics = new ArrayList();

if (aMetrics != null && aMetrics.Length != 0)

{

for (int index1 = 0; index1 < aMetrics.Length; index1++)

{

if (usageCounter.ContainsKey(aMetrics[index1].counterId))

{

mMetrics.Add(aMetrics[index1]);

}

}

}

else

{

Console.WriteLine("Virtual Machine " + vmname[0].propSet[0].val + " is not running");

}

FileStream filestream1 = new FileStream(PerformanceFile, FileMode.Append, FileAccess.Write, FileShare.Read);

StreamWriter SWW1 = new StreamWriter(filestream1);

SWW1.Write(SWW1.NewLine);

SWW1.Write("TimeStamp\t\tObject\tMeasurements\t\t\tUnits\t\tAverage\n");

SWW1.Write(SWW1.NewLine);

SWW1.Close();

filestream1.Close();

Console.WriteLine();

Console.WriteLine("Time\tObject\tMeasurements\t\tUnits\t\tAverage\n");

for (int count = 0; count < mMetrics.Count; count++)

{

PerfMetricId[] metricIds = (new PerfMetricId[] { (PerfMetricId)mMetrics[count] });

PerfQuerySpec qSpec = new PerfQuerySpec();

qSpec.entity = vmmor;

qSpec.maxSample = 3;

qSpec.maxSampleSpecified = true;

qSpec.metricId = metricIds;

qSpec.intervalId = 20;

qSpec.intervalIdSpecified = true;

qSpec.startTime = beginTime;

qSpec.startTimeSpecified = true;

qSpec.endTime = endTime;

qSpec.endTimeSpecified = true;

PerfQuerySpec[] qSpecs = new PerfQuerySpec[] ;

//Boolean continueDataCol = true;

//while (continueDataCol)

//{

PerfEntityMetricBase[] pValues = VS.QueryPerf(pmRef, qSpecs);

if (pValues.Length == 0)

{

Console.WriteLine("Virtual Machine " + vmname[0].propSet[0].val + " is not running");

}

else

{

//PerfSampleInfo[] infos = ((PerfEntityMetric)pValues[0]).sampleInfo;

//Console.WriteLine("Sample time range: " + infos[0].timestamp.TimeOfDay.ToString() + " read every" + infos[0].interval + " seconds");

for (int i = 0; i < pValues.Length; ++i)

{

PerfMetricSeries[] vals = ((PerfEntityMetric)pValues[i]).value;

PerfSampleInfo[] infos = ((PerfEntityMetric)pValues[i]).sampleInfo;

Console.WriteLine("Sample time range: " + infos[i].timestamp.TimeOfDay.ToString() + " read every" + infos[i].interval + " seconds");

for (int vi = 0; vi < vals.Length; vi++)

{

PerfCounterInfo pci = (PerfCounterInfo)usageCounter[vals[http://vi].id.counterId|http://vi].id.counterId];

//if (pci != null)

//Console.WriteLine(pci.nameInfo.label + "-" + pci.unitInfo.summary);

if (vals[vi].GetType().Name.Equals("PerfMetricIntSeries"))

{

PerfMetricIntSeries val = (PerfMetricIntSeries)vals[vi];

long[] longs = val.value;

for (int k = 0; k < longs.Length; ++k)

{

Console.WriteLine(infos[i].timestamp.TimeOfDay.ToString()+ "\t"+ val.id.instance + "\t" + pci.nameInfo.label + "\t\t" + pci.unitInfo.summary + "\t\t" + longs[k] + " ");

FileStream filestream2 = new FileStream(PerformanceFile, FileMode.Append, FileAccess.Write, FileShare.Read);

StreamWriter SWW2 = new StreamWriter(filestream2);

//SWW2.Write(infos[i].timestamp.TimeOfDay.ToString());

SWW2.Write(infos[i].timestamp.TimeOfDay.ToString() + "\t\t"+ val.id.instance + "\t" + pci.nameInfo.label + "\t\t\t" + pci.unitInfo.summary + "\t\t" + longs[k] + " ");

SWW2.Write(SWW2.NewLine);

SWW2.Close();

filestream2.Close(); ;

}

0 Kudos
0 Replies