添加查询系统状态相关功能
This commit is contained in:
parent
c5ae08e8c5
commit
e7ad6629f0
|
@ -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>
|
||||||
|
|
|
@ -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();
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,6 @@
|
||||||
|
namespace MasstransferCommon.Scheduler;
|
||||||
|
|
||||||
|
public interface ITask : IDisposable
|
||||||
|
{
|
||||||
|
public void Run();
|
||||||
|
}
|
|
@ -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();
|
||||||
|
}
|
||||||
|
}
|
|
@ -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; }
|
||||||
}
|
}
|
|
@ -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; }
|
||||||
|
}
|
|
@ -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>
|
||||||
|
|
|
@ -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();
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,11 @@
|
||||||
|
namespace MasstransferExporter.Stat.DTO;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// CPU 负载信息
|
||||||
|
/// </summary>
|
||||||
|
public class CpuLoad
|
||||||
|
{
|
||||||
|
public int Core { get; set; }
|
||||||
|
|
||||||
|
public int Usage { get; set; }
|
||||||
|
}
|
|
@ -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; }
|
||||||
|
}
|
|
@ -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; }
|
||||||
|
}
|
|
@ -0,0 +1,11 @@
|
||||||
|
namespace MasstransferExporter.Stat.DTO;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 网络状态统计信息
|
||||||
|
/// </summary>
|
||||||
|
public class NetworkStat
|
||||||
|
{
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
|
@ -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;
|
||||||
|
}
|
|
@ -0,0 +1,6 @@
|
||||||
|
namespace MasstransferExporter.Stat.DTO;
|
||||||
|
|
||||||
|
public class SystemStat
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
|
@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -1 +1 @@
|
||||||
17173810876283690
|
17181740462385706
|
Loading…
Reference in New Issue