添加查询系统状态相关功能

This commit is contained in:
huangxianguo 2024-06-12 18:56:53 +08:00
parent c5ae08e8c5
commit e7ad6629f0
16 changed files with 356 additions and 6 deletions

View File

@ -7,8 +7,14 @@
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="Newtonsoft.Json" Version="13.0.3" /> <PackageReference Include="Newtonsoft.Json" Version="13.0.3"/>
<PackageReference Include="System.Management" Version="8.0.0" /> <PackageReference Include="System.Management" Version="8.0.0"/>
<PackageReference Include="Serilog" Version="4.0.0"/>
<PackageReference Include="Serilog.Sinks.File" Version="5.0.1-dev-00972"/>
</ItemGroup>
<ItemGroup>
<Folder Include="Model\" />
</ItemGroup> </ItemGroup>
</Project> </Project>

View File

@ -0,0 +1,39 @@
namespace MasstransferCommon.Scheduler;
/// <summary>
/// 通过定时执行某个委托方法
/// </summary>
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; }
/// <summary>
/// 移除任务进行定时任务释放
/// </summary>
public void Dispose()
{
_timer.Dispose();
}
/// <summary>
/// 定义一个虚方法, 子类可以重写该方法实现具体的轮询逻辑
/// </summary>
public void Run()
{
Action.Invoke();
}
}

View File

@ -0,0 +1,6 @@
namespace MasstransferCommon.Scheduler;
public interface ITask : IDisposable
{
public void Run();
}

View File

@ -0,0 +1,44 @@
using System.Collections.Concurrent;
using Serilog;
namespace MasstransferCommon.Scheduler;
public class JobScheduler
{
private static readonly ConcurrentDictionary<string, ExecuteTask> Tasks = new();
/// <summary>
/// 添加调度任务
/// </summary>
/// <param name="name"></param>
/// <param name="action"></param>
/// <param name="interval"></param>
/// <param name="delay"></param>
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} 任务失败");
}
}
/// <summary>
/// 移除任务
/// </summary>
/// <param name="name"></param>
public static void RemoveTask(string name)
{
if (Tasks.TryRemove(name, out var task)) task.Dispose();
}
}

View File

@ -4,5 +4,5 @@ public class Message
{ {
public string Topic { get; set; } public string Topic { get; set; }
public string Payload { get; set; } public Payload Payload { get; set; }
} }

View File

@ -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; }
}

View File

@ -7,4 +7,15 @@
<Nullable>enable</Nullable> <Nullable>enable</Nullable>
</PropertyGroup> </PropertyGroup>
<ItemGroup>
<PackageReference Include="Serilog" Version="4.0.0" />
<PackageReference Include="Serilog.Sinks.Console" Version="6.0.0" />
<PackageReference Include="System.Diagnostics.Process" Version="4.3.0" />
<PackageReference Include="System.Management" Version="8.0.0" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\MasstransferCommon\MasstransferCommon.csproj" />
</ItemGroup>
</Project> </Project>

View File

@ -1,3 +1,13 @@
// See https://aka.ms/new-console-template for more information using MasstransferCommon.Scheduler;
using MasstransferExporter.Stat;
Console.WriteLine("Hello, World!"); class Program
{
static void Main()
{
JobScheduler.AddTask("Test", SystemStatExporter.Collect, 3000);
Console.ReadLine();
}
}

View File

@ -0,0 +1,11 @@
namespace MasstransferExporter.Stat.DTO;
/// <summary>
/// CPU 负载信息
/// </summary>
public class CpuLoad
{
public int Core { get; set; }
public int Usage { get; set; }
}

View File

@ -0,0 +1,15 @@
namespace MasstransferExporter.Stat.DTO;
/// <summary>
/// 磁盘信息
/// </summary>
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; }
}

View File

@ -0,0 +1,13 @@
namespace MasstransferExporter.Stat.DTO;
/// <summary>
/// 内存状态统计信息
/// </summary>
public class MemoryStat
{
public ulong TotalMemory { get; set; }
public ulong AvailableMemory { get; set; }
public ulong UsedMemory { get; set; }
}

View File

@ -0,0 +1,11 @@
namespace MasstransferExporter.Stat.DTO;
/// <summary>
/// 网络状态统计信息
/// </summary>
public class NetworkStat
{
}

View File

@ -0,0 +1,15 @@
namespace MasstransferExporter.Stat.DTO;
/// <summary>
/// 操作系统信息
/// </summary>
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;
}

View File

@ -0,0 +1,6 @@
namespace MasstransferExporter.Stat.DTO;
public class SystemStat
{
}

View File

@ -0,0 +1,153 @@
using System.Management;
using System.Net.NetworkInformation;
using MasstransferCommon.Utils;
using MasstransferExporter.Stat.DTO;
using Serilog;
namespace MasstransferExporter.Stat;
/// <summary>
/// 系统状态统计信息
/// 定时触发30s 一次
/// </summary>
public class SystemStatExporter
{
/// <summary>
/// 收集系统状态信息
/// </summary>
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, "收集系统状态信息失败");
}
}
/// <summary>
/// 收集操作系统信息
/// </summary>
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"
};
}
/// <summary>
/// 收集CPU信息
/// </summary>
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;
}
/// <summary>
/// 收集内存信息
/// </summary>
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;
}
/// <summary>
/// 收集磁盘信息
/// </summary>
private static List<DiskStat> 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();
}
/// <summary>
/// 收集网络信息
/// </summary>
private static void CollectNetworkStat()
{
}
/// <summary>
/// 统计获取网络延时
/// </summary>
/// <param name="host"></param>
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;
}
}
}

View File

@ -1 +1 @@
17173810876283690 17181740462385706