完善上传系统状态信息接口

This commit is contained in:
huangxianguo 2024-09-10 11:59:34 +08:00
parent 5dfbdfee5e
commit d199ff7f7f
4 changed files with 118 additions and 48 deletions

View File

@ -2,9 +2,8 @@
using MasstransferCommon.Events; using MasstransferCommon.Events;
using MasstransferCommon.Scheduler; using MasstransferCommon.Scheduler;
using MasstransferCommunicate.Mqtt.Client; using MasstransferCommunicate.Mqtt.Client;
using MasstransferExporter.DataExporter;
using MasstransferExporter.DataExporter.Model;
using MasstransferExporter.Init; using MasstransferExporter.Init;
using MasstransferExporter.StatExporter;
using MasstransferInfrastructure.Database.Sqlite; using MasstransferInfrastructure.Database.Sqlite;
using MasstransferInfrastructure.Mqtt.Model; using MasstransferInfrastructure.Mqtt.Model;
using Serilog; using Serilog;
@ -39,8 +38,9 @@ class Program
// 启动完成后,广播启动通知 // 启动完成后,广播启动通知
EventBus<bool>.Publish(EventType.StartUp, true); EventBus<bool>.Publish(EventType.StartUp, true);
DelayScheduler.Delay(async () => await StrikeRecordService.ReportStrikeRecord(), DelayScheduler.Delay(async () => await SystemStatExporter.ExportSystemStat(),
TimeSpan.FromSeconds(5)); TimeSpan.FromSeconds(3));
// 启动与主程序的通信 // 启动与主程序的通信
// ProcessHelper.Init(); // ProcessHelper.Init();

View File

@ -1,4 +1,4 @@
namespace MasstransferExporter.Stat.DTO; namespace MasstransferExporter.StatExporter.Model;
/// <summary> /// <summary>
/// CPU 负载信息 /// CPU 负载信息
@ -7,5 +7,5 @@ public class CpuLoad
{ {
public int Core { get; set; } public int Core { get; set; }
public int Usage { get; set; } public float Usage { get; set; }
} }

View File

@ -1,6 +1,28 @@
namespace MasstransferExporter.Stat.DTO; using Newtonsoft.Json;
namespace MasstransferExporter.StatExporter.Model;
public class SystemStat 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; }
} }

View File

@ -1,8 +1,10 @@
using System.Management; using System.Diagnostics;
using System.Management;
using System.Net.NetworkInformation; using System.Net.NetworkInformation;
using MasstransferCommon.Utils; using MasstransferCommon.Model.Constant;
using MasstransferCommunicate.Mqtt.Client;
using MasstransferExporter.Stat.DTO; using MasstransferExporter.Stat.DTO;
using Serilog; using MasstransferExporter.StatExporter.Model;
namespace MasstransferExporter.StatExporter; namespace MasstransferExporter.StatExporter;
@ -15,24 +17,33 @@ public class SystemStatExporter
/// <summary> /// <summary>
/// 收集系统状态信息 /// 收集系统状态信息
/// </summary> /// </summary>
public static void Collect() public static async Task ExportSystemStat()
{ {
try
{
var osInfo = CollectOsInformation();
var cpuLoad = CollectCpuStat(); var cpuLoad = CollectCpuStat();
var memoryStat = CollectMemoryStat(); var memoryStat = CollectMemoryStat();
var diskStat = CollectDiskStat(); var diskStats = CollectDiskStat();
Console.WriteLine(JsonUtil.ToJson(osInfo)); var speed = MeasureNetworkSpeed();
Console.WriteLine(JsonUtil.ToJson(cpuLoad));
Console.WriteLine(JsonUtil.ToJson(memoryStat)); var latency = GetNetworkLatency();
Console.WriteLine(JsonUtil.ToJson(diskStat));
} var stat = new SystemStat
catch (Exception e)
{ {
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);
} }
/// <summary> /// <summary>
@ -59,6 +70,7 @@ public class SystemStatExporter
}; };
} }
/// <summary> /// <summary>
/// 收集CPU信息 /// 收集CPU信息
/// </summary> /// </summary>
@ -69,16 +81,16 @@ public class SystemStatExporter
{ {
Core = Environment.ProcessorCount Core = Environment.ProcessorCount
}; };
// 获取每个处理器的使用率 using var totalCpuCounter = new PerformanceCounter("Processor", "% Processor Time", "_Total");
var searcher = new ManagementObjectSearcher("select * from Win32_Processor"); // 初始化计数器
foreach (var item in searcher.Get()) totalCpuCounter.NextValue();
{
var loadPercentage = item["LoadPercentage"]; // 等待一秒以获取准确的读取值
if (loadPercentage != null) Thread.Sleep(1000);
{
cpuLoad.Usage = (ushort)loadPercentage; // 获取总 CPU 使用率
} var totalCpuUsage = totalCpuCounter.NextValue();
} cpuLoad.Usage = totalCpuUsage;
return cpuLoad; return cpuLoad;
} }
@ -126,28 +138,64 @@ public class SystemStatExporter
}).ToList(); }).ToList();
} }
/// <summary>
/// 收集网络信息
/// </summary>
private static void CollectNetworkStat()
{
}
/// <summary> /// <summary>
/// 统计获取网络延时 /// 统计获取网络延时
/// </summary> /// </summary>
/// <param name="host"></param> private static long GetNetworkLatency()
private static long GetNetworkLatency(string host)
{ {
try try
{
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 ping = new Ping();
var reply = ping.Send(host); var reply = ping.Send(host.MapToIPv4());
return reply.Status == IPStatus.Success ? reply.RoundtripTime : 999; return reply.Status == IPStatus.Success ? reply.RoundtripTime : 999;
} }
}
}
catch (Exception _) catch (Exception _)
{ {
// ignored
}
return 999; 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);
} }
} }