Exemple #1
0
        private void FillInfo(DiskUsageInfo toFill, DiskStats previousDiskStats, DiskStats diskStats, double deltaSeconds)
        {
            var readsDelta          = diskStats.ReadsCount - previousDiskStats.ReadsCount;
            var writesDelta         = diskStats.WritesCount - previousDiskStats.WritesCount;
            var sectorsReadDelta    = diskStats.SectorsReadCount - previousDiskStats.SectorsReadCount;
            var sectorsWrittenDelta = diskStats.SectorsWrittenCount - previousDiskStats.SectorsWrittenCount;
            var msReadDelta         = diskStats.MsSpentReading - previousDiskStats.MsSpentReading;
            var msWriteDelta        = diskStats.MsSpentWriting - previousDiskStats.MsSpentWriting;
            var msSpentDoingIoDelta = diskStats.MsSpentDoingIo - previousDiskStats.MsSpentDoingIo;

            if (readsDelta > 0)
            {
                toFill.ReadAverageMsLatency = (long)((double)msReadDelta / readsDelta);
            }
            if (writesDelta > 0)
            {
                toFill.WriteAverageMsLatency = (long)((double)msWriteDelta / writesDelta);
            }

            toFill.CurrentQueueLength = diskStats.CurrentQueueLength;

            if (deltaSeconds > 0d)
            {
                toFill.ReadsPerSecond  = (long)(readsDelta / deltaSeconds);
                toFill.WritesPerSecond = (long)(writesDelta / deltaSeconds);

                // NOTE: Every sector equals 512B, so it's easy to convert these values.
                // NOTE: See https://www.man7.org/linux/man-pages/man1/iostat.1.html for details about sector size.
                toFill.BytesReadPerSecond    = (long)(sectorsReadDelta * 512d / deltaSeconds);
                toFill.BytesWrittenPerSecond = (long)(sectorsWrittenDelta * 512d / deltaSeconds);

                toFill.UtilizedPercent = (100d * msSpentDoingIoDelta / (deltaSeconds * 1000)).Clamp(0, 100);
            }
        }
Exemple #2
0
        public void Collect(HostMetrics metrics)
        {
            var deltaSeconds = stopwatch.Elapsed.TotalSeconds;

            var newDisksStatsInfo = new Dictionary <string, DiskStats>();
            var disksUsageInfo    = new Dictionary <string, DiskUsageInfo>();

            foreach (var diskStats in ParseDiskstats(diskStatsReader.ReadLines()))
            {
                var result = new DiskUsageInfo {
                    DiskName = diskStats.DiskName
                };

                if (previousDisksStatsInfo.TryGetValue(diskStats.DiskName, out var previousDiskStats))
                {
                    FillInfo(result, previousDiskStats, diskStats, deltaSeconds);
                }

                disksUsageInfo[result.DiskName] = result;

                newDisksStatsInfo[diskStats.DiskName] = diskStats;
            }

            metrics.DisksUsageInfo = disksUsageInfo;

            previousDisksStatsInfo = newDisksStatsInfo;

            stopwatch.Restart();
        }