in src/Microsoft.IIS.Administration.WebServer.Monitoring/Core/CounterMonitor.cs [121:189]
public async Task DoRefresh()
{
if (!NeedsRefresh) {
return;
}
PDH_FMT_COUNTERVALUE value = default(PDH_FMT_COUNTERVALUE);
uint result = Pdh.PdhCollectQueryData(_query);
if (result == Pdh.PDH_NO_DATA) {
throw new MissingCountersException(_counters.Keys);
}
if (result != 0) {
throw new Win32Exception((int)result);
}
bool multiSample = false;
List<IPerfCounter> missingCounters = new List<IPerfCounter>();
foreach (KeyValuePair<IPerfCounter, PdhCounterHandle> counterInstance in _counters) {
IPerfCounter counter = counterInstance.Key;
PdhCounterHandle handle = counterInstance.Value;
result = Pdh.PdhGetFormattedCounterValue(handle, PdhFormat.PDH_FMT_LARGE, IntPtr.Zero, out value);
if (result == Pdh.PDH_INVALID_DATA && value.CStatus == Pdh.PDH_CSTATUS_INVALID_DATA && !multiSample) {
multiSample = true;
result = Pdh.PdhCollectQueryData(_query);
if (result != 0) {
throw new Win32Exception((int)result);
}
result = Pdh.PdhGetFormattedCounterValue(handle, PdhFormat.PDH_FMT_LARGE, IntPtr.Zero, out value);
}
if ((result != 0 && value.CStatus == Pdh.PDH_CSTATUS_NO_INSTANCE) ||
result == Pdh.PDH_INVALID_HANDLE ||
result == Pdh.PDH_CALC_NEGATIVE_VALUE ||
result == Pdh.PDH_CALC_NEGATIVE_DENOMINATOR ||
(result == Pdh.PDH_INVALID_DATA && value.CStatus == Pdh.PDH_INVALID_DATA)) {
missingCounters.Add(counter);
continue;
}
else if (result != 0) {
if (!_counterFinder.CounterExists(counter)) {
missingCounters.Add(counter);
continue;
}
throw new Win32Exception((int)result);
}
else if (value.CStatus != 0) {
throw new Win32Exception((int)value.CStatus);
}
counter.Value = value.longLongValue;
}
if (missingCounters.Count > 0) {
throw new MissingCountersException(missingCounters);
}
TimeSpan calculationDelta = DateTime.UtcNow - _lastCalculatedTime;
_lastCalculatedTime = DateTime.UtcNow;
}