I have been following this stack overflow article : Accurate calculation of CPU usage given in percentage in Linux?
It is written in different language so I decided to follow the logic and convert it to C#.
   public class HardwareInfoManager : IHardwareInfoManager
    {
        private IConfiguration Configuration;
        private List<long> oldCpuStatistics;
        private List<long> newCpuStatistics;
        public HardwareInfoManager(IConfiguration Configuration)
        {
            this.Configuration = Configuration;
            oldCpuStatistics = new List<long>();
            newCpuStatistics = new List<long>();
        } 
        private decimal GetCPUUsage()
        {
            string cpuUsagePath = "//proc//stat";
            StringBuilder sb = new StringBuilder();
            if (File.Exists(cpuUsagePath) && oldCpuStatistics.IsNullOrEmpty())
            {
                SaveIntsFromFilePath(cpuUsagePath, oldCpuStatistics);
                Task.Delay(200);
                GetCPUUsage();
            }
            if (File.Exists(cpuUsagePath) && !oldCpuStatistics.IsNullOrEmpty())
            {
                SaveIntsFromFilePath(cpuUsagePath, newCpuStatistics);
                var prevIdle = oldCpuStatistics[3] + oldCpuStatistics[4];
                decimal idle = newCpuStatistics[3] + newCpuStatistics[4];
                var prevNonIdle = oldCpuStatistics[0] + oldCpuStatistics[1] + oldCpuStatistics[2] + oldCpuStatistics[5] + oldCpuStatistics[6] + oldCpuStatistics[7];
                decimal nonIdle = newCpuStatistics[0] + newCpuStatistics[1] + newCpuStatistics[2] + newCpuStatistics[5] + newCpuStatistics[6] + newCpuStatistics[7];
                var prevTotal = prevIdle + prevNonIdle;
                decimal total = idle + nonIdle;
                var totalDifference = total - prevTotal;
                var idleDifference = idle - prevIdle;
                decimal cpuPercentage = (totalDifference - idleDifference / totalDifference) * 100;
                cpuPercentage = Math.Round(cpuPercentage, 2);
                return cpuPercentage;
            }
            else
            {
                return 0;
            }
        }
        private List<long> SaveIntsFromFilePath(string path, List<long> longList)
        {
            var firstLineOfCPUFile = File.ReadAllLines(path).First();
            StringBuilder sb = new StringBuilder();
            for (int i = 0; i < firstLineOfCPUFile.Length; i++)
            {
                //take first index of a number until it reaches a whitespace, add to an int array
                if (Char.IsNumber(firstLineOfCPUFile[i]))
                {
                    sb.Append(firstLineOfCPUFile[i]);
                    //start with this index until it reaches whitespace
                }
                if (Char.IsWhiteSpace(firstLineOfCPUFile[i]) && i > 5)
                {
                    longList.Add(long.Parse(sb.ToString()));
                    sb.Clear();
                    //start with this index until it reaches whitespace
                }
            }
            sb.Clear();
            return longList;
        }
}
Unable to debug this as it runs on a remote raspberry machine , it throws this error:
Job HardwareInfo.HardwareInfo threw an exception.
Quartz.SchedulerException: Job threw an unhandled exception. --->
System.DivideByZeroException: Attempted to divide by zero.
95% of the time it throws the exception because of the totaldifference being 0. In the other cases it works and throws the whole info such as this:
"TenantId":null,"Hostname":"DEV1\n","Temperature":66.218,"MemoryStats":{"MemoryTotal":"1985984 kB","MemoryFree":"1072468 kB","MemoryAvailable":"1438552 kB"},"CPUUsage":0.0
Please advise, I am stuck for 2 days on this now.
