private static void updateUsedMemoryCounter(PdhCounterPathElement pathElement)
        {
            MEMORYSTATUSEX memStatus = new MEMORYSTATUSEX();

            if (Interop.Interop.GlobalMemoryStatusEx(memStatus))
            {
                ulong installedMemory             = memStatus.ullTotalPhys / 1024 / 1024;
                PerformanceCounter usedMemCounter = pathElement.InstanceName == null ?
                                                    new PerformanceCounter(pathElement.ObjectName, pathElement.CounterName, true) :
                                                    new PerformanceCounter(pathElement.ObjectName, pathElement.CounterName, pathElement.InstanceName, true);

                var itr = _handler.GetPathElements(new List <string>()
                {
                    "\\Memory\\Available MBytes"
                });
                var pe = itr.ElementAt(0);
                PerformanceCounter availMem = pathElement.InstanceName == null ?
                                              new PerformanceCounter(pe.ObjectName, pe.CounterName, true) :
                                              new PerformanceCounter(pe.ObjectName, pe.CounterName, pe.InstanceName, true);

                usedMemCounter.ReadOnly = false;
                usedMemCounter.RawValue = (long)(installedMemory - Convert.ToUInt64(availMem.NextValue()));
                usedMemCounter.Close();
            }
        }
        private MetricInfo RegisterMetric(PdhCounterPathElement pathElement, IDictionary <String, MetricInfo> existingMetrics)
        {
            string contextName  = CleanName(pathElement.ObjectName);
            string metricName   = CleanName(pathElement.CounterName);
            string instanceName = CleanName(pathElement.InstanceName);

            MetricTags tags = default(MetricTags);

            if (instanceName != null)
            {
                tags = "instance=" + instanceName;
            }
            string     keyName = MetricInfo.TagName(contextName + metricName, tags);
            MetricInfo mInfo;

            if (existingMetrics.TryGetValue(keyName, out mInfo))
            {
                existingMetrics.Remove(keyName);
                return(mInfo);
            }

            PerfCounterGauge       pcGauge = new PerfCounterGauge(pathElement.ObjectName, pathElement.CounterName, pathElement.InstanceName);
            TimerMetric            timer   = null;
            PerformanceCounterType type    = pcGauge.performanceCounter.CounterType;

            switch (type)
            {
            //these types of counters are not usable
            case PerformanceCounterType.AverageBase:
            case PerformanceCounterType.CounterMultiBase:
            case PerformanceCounterType.RawBase:
            case PerformanceCounterType.SampleBase:
                _log.Error(String.Format("Don't know how to handle metric of type {0} for {1}", type.ToString(), metricName));
                return(null);

            //timers
            case PerformanceCounterType.AverageTimer32:
            case PerformanceCounterType.ElapsedTime:
                timer = new TimerMetric(SamplingType.FavourRecent);
                break;
            }
            mInfo = new MetricInfo(contextName, metricName, tags, timer, pcGauge);
            if (mInfo.Timer != null)
            {
                _timers[keyName] = mInfo;
            }
            return(mInfo);
        }