diff --git a/MasstransferCommon/MasstransferCommon.csproj b/MasstransferCommon/MasstransferCommon.csproj index 4dccdb8..59a383e 100644 --- a/MasstransferCommon/MasstransferCommon.csproj +++ b/MasstransferCommon/MasstransferCommon.csproj @@ -7,8 +7,14 @@ - - + + + + + + + + diff --git a/MasstransferCommon/Scheduler/ExecuteTask.cs b/MasstransferCommon/Scheduler/ExecuteTask.cs new file mode 100644 index 0000000..22c286e --- /dev/null +++ b/MasstransferCommon/Scheduler/ExecuteTask.cs @@ -0,0 +1,39 @@ +namespace MasstransferCommon.Scheduler; + +/// +/// 通过定时执行某个委托方法 +/// +public class ExecuteTask : ITask +{ + private readonly Timer _timer; + + public ExecuteTask(string name, Action action, int interval = 100) + { + Name = name; + Interval = interval; + Action = action; + _timer = new Timer(_ => { Run(); }, null, TimeSpan.Zero, TimeSpan.FromMilliseconds(Interval)); + } + + public int Interval { get; set; } + + public string Name { get; set; } + + public Action Action { get; set; } + + /// + /// 移除任务进行定时任务释放 + /// + public void Dispose() + { + _timer.Dispose(); + } + + /// + /// 定义一个虚方法, 子类可以重写该方法实现具体的轮询逻辑 + /// + public void Run() + { + Action.Invoke(); + } +} \ No newline at end of file diff --git a/MasstransferCommon/Scheduler/ITask.cs b/MasstransferCommon/Scheduler/ITask.cs new file mode 100644 index 0000000..baedaac --- /dev/null +++ b/MasstransferCommon/Scheduler/ITask.cs @@ -0,0 +1,6 @@ +namespace MasstransferCommon.Scheduler; + +public interface ITask : IDisposable +{ + public void Run(); +} \ No newline at end of file diff --git a/MasstransferCommon/Scheduler/JobScheduler.cs b/MasstransferCommon/Scheduler/JobScheduler.cs new file mode 100644 index 0000000..986eff8 --- /dev/null +++ b/MasstransferCommon/Scheduler/JobScheduler.cs @@ -0,0 +1,44 @@ +using System.Collections.Concurrent; +using Serilog; + +namespace MasstransferCommon.Scheduler; + +public class JobScheduler +{ + private static readonly ConcurrentDictionary Tasks = new(); + + /// + /// 添加调度任务 + /// + /// + /// + /// + /// + public static void AddTask(string name, Action action, int interval = 100, int delay = 0) + { + try + { + if (Tasks.ContainsKey(name)) return; + + if (delay > 0) + { + Thread.Sleep(delay); + } + + Tasks[name] = new ExecuteTask(name, action, interval); + } + catch (Exception e) + { + Log.Error(e, $"添加 {name} 任务失败"); + } + } + + /// + /// 移除任务 + /// + /// + public static void RemoveTask(string name) + { + if (Tasks.TryRemove(name, out var task)) task.Dispose(); + } +} \ No newline at end of file diff --git a/MasstransferCommunicate/Mqtt/Model/Message.cs b/MasstransferCommunicate/Mqtt/Model/Message.cs index 93ecb04..873f474 100644 --- a/MasstransferCommunicate/Mqtt/Model/Message.cs +++ b/MasstransferCommunicate/Mqtt/Model/Message.cs @@ -4,5 +4,5 @@ public class Message { public string Topic { get; set; } - public string Payload { get; set; } + public Payload Payload { get; set; } } \ No newline at end of file diff --git a/MasstransferCommunicate/Mqtt/Model/Payload.cs b/MasstransferCommunicate/Mqtt/Model/Payload.cs new file mode 100644 index 0000000..a2e3c2c --- /dev/null +++ b/MasstransferCommunicate/Mqtt/Model/Payload.cs @@ -0,0 +1,10 @@ +namespace MasstransferInfrastructure.Mqtt.Model; + +public class Payload +{ + public string MsgId { get; set; } + + public DateTime ConsumeTime { get; set; } + + public object Data { get; set; } +} \ No newline at end of file diff --git a/MasstransferExporter/MasstransferExporter.csproj b/MasstransferExporter/MasstransferExporter.csproj index 2b14c81..25c03ab 100644 --- a/MasstransferExporter/MasstransferExporter.csproj +++ b/MasstransferExporter/MasstransferExporter.csproj @@ -7,4 +7,15 @@ enable + + + + + + + + + + + diff --git a/MasstransferExporter/Program.cs b/MasstransferExporter/Program.cs index e5dff12..4506e9c 100644 --- a/MasstransferExporter/Program.cs +++ b/MasstransferExporter/Program.cs @@ -1,3 +1,13 @@ -// See https://aka.ms/new-console-template for more information +using MasstransferCommon.Scheduler; +using MasstransferExporter.Stat; -Console.WriteLine("Hello, World!"); \ No newline at end of file +class Program +{ + static void Main() + { + JobScheduler.AddTask("Test", SystemStatExporter.Collect, 3000); + + + Console.ReadLine(); + } +} \ No newline at end of file diff --git a/MasstransferExporter/Stat/Model/CpuLoad.cs b/MasstransferExporter/Stat/Model/CpuLoad.cs new file mode 100644 index 0000000..1ba7244 --- /dev/null +++ b/MasstransferExporter/Stat/Model/CpuLoad.cs @@ -0,0 +1,11 @@ +namespace MasstransferExporter.Stat.DTO; + +/// +/// CPU 负载信息 +/// +public class CpuLoad +{ + public int Core { get; set; } + + public int Usage { get; set; } +} \ No newline at end of file diff --git a/MasstransferExporter/Stat/Model/DiskStat.cs b/MasstransferExporter/Stat/Model/DiskStat.cs new file mode 100644 index 0000000..2b469ae --- /dev/null +++ b/MasstransferExporter/Stat/Model/DiskStat.cs @@ -0,0 +1,15 @@ +namespace MasstransferExporter.Stat.DTO; + +/// +/// 磁盘信息 +/// +public class DiskStat +{ + public string Name { get; set; } = string.Empty; + + public long Total { get; set; } + + public long Used { get; set; } + + public long Free { get; set; } +} \ No newline at end of file diff --git a/MasstransferExporter/Stat/Model/MemoryStat.cs b/MasstransferExporter/Stat/Model/MemoryStat.cs new file mode 100644 index 0000000..1cdc2be --- /dev/null +++ b/MasstransferExporter/Stat/Model/MemoryStat.cs @@ -0,0 +1,13 @@ +namespace MasstransferExporter.Stat.DTO; + +/// +/// 内存状态统计信息 +/// +public class MemoryStat +{ + public ulong TotalMemory { get; set; } + + public ulong AvailableMemory { get; set; } + + public ulong UsedMemory { get; set; } +} \ No newline at end of file diff --git a/MasstransferExporter/Stat/Model/NetworkStat.cs b/MasstransferExporter/Stat/Model/NetworkStat.cs new file mode 100644 index 0000000..dd75067 --- /dev/null +++ b/MasstransferExporter/Stat/Model/NetworkStat.cs @@ -0,0 +1,11 @@ +namespace MasstransferExporter.Stat.DTO; + +/// +/// 网络状态统计信息 +/// +public class NetworkStat +{ + + + +} \ No newline at end of file diff --git a/MasstransferExporter/Stat/Model/OSInfo.cs b/MasstransferExporter/Stat/Model/OSInfo.cs new file mode 100644 index 0000000..896d001 --- /dev/null +++ b/MasstransferExporter/Stat/Model/OSInfo.cs @@ -0,0 +1,15 @@ +namespace MasstransferExporter.Stat.DTO; + +/// +/// 操作系统信息 +/// +public class OSInfo +{ + public string Platform { get; set; } = string.Empty; + + public string Version { get; set; } = string.Empty; + + public string ServicePack { get; set; } = string.Empty; + + public string Architecture { get; set; } = string.Empty; +} \ No newline at end of file diff --git a/MasstransferExporter/Stat/Model/SystemStat.cs b/MasstransferExporter/Stat/Model/SystemStat.cs new file mode 100644 index 0000000..841275a --- /dev/null +++ b/MasstransferExporter/Stat/Model/SystemStat.cs @@ -0,0 +1,6 @@ +namespace MasstransferExporter.Stat.DTO; + +public class SystemStat +{ + +} \ No newline at end of file diff --git a/MasstransferExporter/Stat/SystemStatExporter.cs b/MasstransferExporter/Stat/SystemStatExporter.cs new file mode 100644 index 0000000..b184129 --- /dev/null +++ b/MasstransferExporter/Stat/SystemStatExporter.cs @@ -0,0 +1,153 @@ +using System.Management; +using System.Net.NetworkInformation; +using MasstransferCommon.Utils; +using MasstransferExporter.Stat.DTO; +using Serilog; + +namespace MasstransferExporter.Stat; + +/// +/// 系统状态统计信息 +/// 定时触发,30s 一次 +/// +public class SystemStatExporter +{ + /// + /// 收集系统状态信息 + /// + public static void Collect() + { + try + { + var osInfo = CollectOsInformation(); + var cpuLoad = CollectCpuStat(); + var memoryStat = CollectMemoryStat(); + var diskStat = CollectDiskStat(); + + Console.WriteLine(JsonUtil.ToJson(osInfo)); + Console.WriteLine(JsonUtil.ToJson(cpuLoad)); + Console.WriteLine(JsonUtil.ToJson(memoryStat)); + Console.WriteLine(JsonUtil.ToJson(diskStat)); + } + catch (Exception e) + { + Log.Error(e, "收集系统状态信息失败"); + } + } + + /// + /// 收集操作系统信息 + /// + private static OSInfo CollectOsInformation() + { + // 获取操作系统版本 + var os = Environment.OSVersion; + // 获取平台 + var platform = os.Platform; + // 获取版本号 + var version = os.Version; + + // 是否为 64 位 + var is64Bit = Environment.Is64BitOperatingSystem; + + return new OSInfo + { + Platform = platform.ToString(), + Version = version.ToString(), + ServicePack = os.ServicePack, + Architecture = is64Bit ? "x64" : "x86" + }; + } + + /// + /// 收集CPU信息 + /// + private static CpuLoad CollectCpuStat() + { + // 获取CPU总数 + var cpuLoad = new CpuLoad + { + 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; + } + } + + return cpuLoad; + } + + /// + /// 收集内存信息 + /// + private static MemoryStat CollectMemoryStat() + { + var wql = new ObjectQuery("SELECT * FROM Win32_OperatingSystem"); + var searcher = new ManagementObjectSearcher(wql); + foreach (ManagementObject result in searcher.Get()) + { + var totalVisibleMemorySize = (ulong)result["TotalVisibleMemorySize"]; + var freePhysicalMemory = (ulong)result["FreePhysicalMemory"]; + + var usedMemory = totalVisibleMemorySize - freePhysicalMemory; + + return new MemoryStat + { + TotalMemory = totalVisibleMemorySize, + UsedMemory = usedMemory, + AvailableMemory = freePhysicalMemory + }; + } + + return default; + } + + /// + /// 收集磁盘信息 + /// + private static List CollectDiskStat() + { + // 获取所有的驱动器信息 + var drives = DriveInfo.GetDrives(); + + return (from drive in drives + where drive.IsReady + select new DiskStat + { + Name = drive.Name, Total = drive.TotalSize / (1024 * 1024 * 1024), + Used = (drive.TotalSize - drive.AvailableFreeSpace) / (1024 * 1024 * 1024), + Free = drive.AvailableFreeSpace / (1024 * 1024 * 1024) + }).ToList(); + } + + /// + /// 收集网络信息 + /// + private static void CollectNetworkStat() + { + } + + /// + /// 统计获取网络延时 + /// + /// + private static long GetNetworkLatency(string host) + { + try + { + var ping = new Ping(); + var reply = ping.Send(host); + return reply.Status == IPStatus.Success ? reply.RoundtripTime : 999; + } + catch (Exception _) + { + return 999; + } + } +} \ No newline at end of file diff --git a/MasstransferExporter/obj/rider.project.model.nuget.info b/MasstransferExporter/obj/rider.project.model.nuget.info index 99674da..bf4ae2c 100644 --- a/MasstransferExporter/obj/rider.project.model.nuget.info +++ b/MasstransferExporter/obj/rider.project.model.nuget.info @@ -1 +1 @@ -17173810876283690 \ No newline at end of file +17181740462385706 \ No newline at end of file