예제 #1
0
        public SystemStatsHelper(ILogger log, ICheckpoint writerCheckpoint)
        {
            Ensure.NotNull(log, "log");
            Ensure.NotNull(writerCheckpoint, "writerCheckpoint");

            _log = log;
            _writerCheckpoint = writerCheckpoint;
            _perfCounter = new PerfCounterHelper(_log);
        }
        private void GetPerfCounterInformation(Dictionary<string, object> stats, int count)
        {
            if (_giveup)
                return;
            var process = Process.GetCurrentProcess();
            try
            {
                stats["proc-startTime"] = process.StartTime.ToUniversalTime().ToString("O");
                stats["proc-id"] = process.Id;
                stats["proc-mem"] = new StatMetadata(process.WorkingSet64, "Process", "Process Virtual Memory");
                stats["proc-cpu"] = new StatMetadata(_perfCounter.GetProcCpuUsage(), "Process", "Process Cpu Usage");
                stats["proc-threadsCount"] = _perfCounter.GetProcThreadsCount();
                stats["proc-contentionsRate"] = _perfCounter.GetContentionsRateCount();
                stats["proc-thrownExceptionsRate"] = _perfCounter.GetThrownExceptionsRate();

                stats["sys-cpu"] = _perfCounter.GetTotalCpuUsage();
                stats["sys-freeMem"] = GetFreeMem();
            }
            catch (InvalidOperationException)
            {
                _log.Info("Received error reading counters. Attempting to rebuild.");
                _perfCounter = new PerfCounterHelper(_log);
                _giveup = count > 10;
                if (_giveup)
                    _log.Error("Maximum rebuild attempts reached. Giving up on rebuilds.");
                else
                    GetPerfCounterInformation(stats, count + 1);
            }
        }