From d199ff7f7f13d6a7d36bd7120b87d28d496b6727 Mon Sep 17 00:00:00 2001 From: huangxianguo Date: Tue, 10 Sep 2024 11:59:34 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E5=96=84=E4=B8=8A=E4=BC=A0=E7=B3=BB?= =?UTF-8?q?=E7=BB=9F=E7=8A=B6=E6=80=81=E4=BF=A1=E6=81=AF=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- MasstransferExporter/Program.cs | 8 +- .../StatExporter/Model/CpuLoad.cs | 4 +- .../StatExporter/Model/SystemStat.cs | 26 +++- .../StatExporter/SystemStatExporter.cs | 128 ++++++++++++------ 4 files changed, 118 insertions(+), 48 deletions(-) diff --git a/MasstransferExporter/Program.cs b/MasstransferExporter/Program.cs index a16dd09..c908617 100644 --- a/MasstransferExporter/Program.cs +++ b/MasstransferExporter/Program.cs @@ -2,9 +2,8 @@ using MasstransferCommon.Events; using MasstransferCommon.Scheduler; using MasstransferCommunicate.Mqtt.Client; -using MasstransferExporter.DataExporter; -using MasstransferExporter.DataExporter.Model; using MasstransferExporter.Init; +using MasstransferExporter.StatExporter; using MasstransferInfrastructure.Database.Sqlite; using MasstransferInfrastructure.Mqtt.Model; using Serilog; @@ -39,8 +38,9 @@ class Program // 启动完成后,广播启动通知 EventBus.Publish(EventType.StartUp, true); - DelayScheduler.Delay(async () => await StrikeRecordService.ReportStrikeRecord(), - TimeSpan.FromSeconds(5)); + DelayScheduler.Delay(async () => await SystemStatExporter.ExportSystemStat(), + TimeSpan.FromSeconds(3)); + // 启动与主程序的通信 // ProcessHelper.Init(); diff --git a/MasstransferExporter/StatExporter/Model/CpuLoad.cs b/MasstransferExporter/StatExporter/Model/CpuLoad.cs index 1ba7244..ed2b6d2 100644 --- a/MasstransferExporter/StatExporter/Model/CpuLoad.cs +++ b/MasstransferExporter/StatExporter/Model/CpuLoad.cs @@ -1,4 +1,4 @@ -namespace MasstransferExporter.Stat.DTO; +namespace MasstransferExporter.StatExporter.Model; /// /// CPU 负载信息 @@ -7,5 +7,5 @@ public class CpuLoad { public int Core { get; set; } - public int Usage { get; set; } + public float Usage { get; set; } } \ No newline at end of file diff --git a/MasstransferExporter/StatExporter/Model/SystemStat.cs b/MasstransferExporter/StatExporter/Model/SystemStat.cs index 841275a..2336fcb 100644 --- a/MasstransferExporter/StatExporter/Model/SystemStat.cs +++ b/MasstransferExporter/StatExporter/Model/SystemStat.cs @@ -1,6 +1,28 @@ -namespace MasstransferExporter.Stat.DTO; +using Newtonsoft.Json; + +namespace MasstransferExporter.StatExporter.Model; public class SystemStat { - + [JsonProperty("timestamp")] public DateTime Timestamp { get; set; } + + [JsonProperty("cpuUsage")] public double CpuUsage { get; set; } + + [JsonProperty("memoryUsage")] public double MemoryUsage { get; set; } + + [JsonProperty("memoryTotal")] public double MemoryTotal { get; set; } + + [JsonProperty("memoryFree")] public double MemoryFree { get; set; } + + [JsonProperty("diskTotal")] public double DiskTotal { get; set; } + + [JsonProperty("diskUsage")] public double DiskUsage { get; set; } + + [JsonProperty("diskFree")] public double DiskFree { get; set; } + + [JsonProperty("uploadRate")] public double UploadRate { get; set; } + + [JsonProperty("downloadRate")] public double DownloadRate { get; set; } + + [JsonProperty("networkLatency")] public double NetworkLatency { get; set; } } \ No newline at end of file diff --git a/MasstransferExporter/StatExporter/SystemStatExporter.cs b/MasstransferExporter/StatExporter/SystemStatExporter.cs index 29056bf..b1faf36 100644 --- a/MasstransferExporter/StatExporter/SystemStatExporter.cs +++ b/MasstransferExporter/StatExporter/SystemStatExporter.cs @@ -1,8 +1,10 @@ -using System.Management; +using System.Diagnostics; +using System.Management; using System.Net.NetworkInformation; -using MasstransferCommon.Utils; +using MasstransferCommon.Model.Constant; +using MasstransferCommunicate.Mqtt.Client; using MasstransferExporter.Stat.DTO; -using Serilog; +using MasstransferExporter.StatExporter.Model; namespace MasstransferExporter.StatExporter; @@ -15,24 +17,33 @@ public class SystemStatExporter /// /// 收集系统状态信息 /// - public static void Collect() + public static async Task ExportSystemStat() { - try - { - var osInfo = CollectOsInformation(); - var cpuLoad = CollectCpuStat(); - var memoryStat = CollectMemoryStat(); - var diskStat = CollectDiskStat(); + var cpuLoad = CollectCpuStat(); + var memoryStat = CollectMemoryStat(); + var diskStats = CollectDiskStat(); - Console.WriteLine(JsonUtil.ToJson(osInfo)); - Console.WriteLine(JsonUtil.ToJson(cpuLoad)); - Console.WriteLine(JsonUtil.ToJson(memoryStat)); - Console.WriteLine(JsonUtil.ToJson(diskStat)); - } - catch (Exception e) + var speed = MeasureNetworkSpeed(); + + var latency = GetNetworkLatency(); + + var stat = new SystemStat { - Log.Error(e, "收集系统状态信息失败"); - } + Timestamp = DateTime.Now, + CpuUsage = cpuLoad.Usage, + MemoryUsage = memoryStat.UsedMemory, + MemoryTotal = memoryStat.TotalMemory, + MemoryFree = memoryStat.AvailableMemory, + DiskTotal = diskStats.Sum(disk => disk.Total), + DiskUsage = diskStats.Sum(disk => disk.Used), + DiskFree = diskStats.Sum(disk => disk.Free), + UploadRate = speed.Item1, + DownloadRate = speed.Item2, + NetworkLatency = latency + }; + + // 将结果上传到云端 + await MessageQueueHelper.Publish(Topics.ReportSystemStat, stat); } /// @@ -59,6 +70,7 @@ public class SystemStatExporter }; } + /// /// 收集CPU信息 /// @@ -69,16 +81,16 @@ public class SystemStatExporter { Core = Environment.ProcessorCount }; - // 获取每个处理器的使用率 - var searcher = new ManagementObjectSearcher("select * from Win32_Processor"); - foreach (var item in searcher.Get()) - { - var loadPercentage = item["LoadPercentage"]; - if (loadPercentage != null) - { - cpuLoad.Usage = (ushort)loadPercentage; - } - } + using var totalCpuCounter = new PerformanceCounter("Processor", "% Processor Time", "_Total"); + // 初始化计数器 + totalCpuCounter.NextValue(); + + // 等待一秒以获取准确的读取值 + Thread.Sleep(1000); + + // 获取总 CPU 使用率 + var totalCpuUsage = totalCpuCounter.NextValue(); + cpuLoad.Usage = totalCpuUsage; return cpuLoad; } @@ -126,28 +138,64 @@ public class SystemStatExporter }).ToList(); } - /// - /// 收集网络信息 - /// - private static void CollectNetworkStat() - { - } /// /// 统计获取网络延时 /// - /// - private static long GetNetworkLatency(string host) + private static long GetNetworkLatency() { try { - var ping = new Ping(); - var reply = ping.Send(host); - return reply.Status == IPStatus.Success ? reply.RoundtripTime : 999; + var interfaces = NetworkInterface.GetAllNetworkInterfaces(); + foreach (var adapter in interfaces) + { + if (adapter.OperationalStatus != OperationalStatus.Up) continue; + + var properties = adapter.GetIPProperties(); + + var dns = properties.DnsAddresses; + if (dns.Count <= 0) continue; + foreach (var host in dns) + { + var ping = new Ping(); + var reply = ping.Send(host.MapToIPv4()); + return reply.Status == IPStatus.Success ? reply.RoundtripTime : 999; + } + } } catch (Exception _) { - return 999; + // ignored } + + return 999; + } + + private static (double, double) MeasureNetworkSpeed() + { + var interfaces = NetworkInterface.GetAllNetworkInterfaces(); + foreach (var adapter in interfaces) + { + if (adapter.OperationalStatus != OperationalStatus.Up) continue; + + var startReceivedBytes = adapter.GetIPv4Statistics().BytesReceived; + var startSentBytes = adapter.GetIPv4Statistics().BytesSent; + long totalReceivedBytes = 0; + long totalSentBytes = 0; + var times = 0; + while (times < 5) + { + var statistics = adapter.GetIPv4Statistics(); + totalReceivedBytes = totalReceivedBytes + statistics.BytesReceived - startReceivedBytes; + totalSentBytes = totalSentBytes + statistics.BytesSent - startSentBytes; + Thread.Sleep(1000); + times++; + } + + return (totalReceivedBytes / 5.0 / 1024.0 / 1024.0, + totalSentBytes / 5.0 / 1024.0 / 1024.0); + } + + return (0, 0); } } \ No newline at end of file