Files
NasRobot/src/Service/Jobs/DiskMonitorRegistry.cs
孙诚 b4611c979c
Some checks failed
Docker Build & Deploy / Build Docker Image (push) Successful in 14s
Docker Build & Deploy / Deploy to Production (push) Failing after 4s
1
2025-03-11 13:36:06 +08:00

104 lines
2.9 KiB
C#

using System.Diagnostics;
using System.Text;
using FluentScheduler;
using InfluxDB.Client;
using InfluxDB.Client.Api.Domain;
using InfluxDB.Client.Writes;
using Interface.Jobs;
namespace Service.Jobs;
public class DiskMonitorRegistry : Registry, IDiskMonitorRegistry
{
public DiskMonitorRegistry()
{
Schedule(Job).ToRunNow().AndEvery(1).Hours();
}
public void Job()
{
try
{
JobExecute();
}
catch (Exception e)
{
Console.WriteLine(e);
}
}
private void JobExecute()
{
// 执行 cmd 命令 获取执行结果
var command = "df -h";
var process = new Process
{
StartInfo = new()
{
FileName = "/bin/bash",
Arguments = $"-c \"{command}\"",
RedirectStandardOutput = true,
UseShellExecute = false,
CreateNoWindow = true
}
};
process.Start();
var result = process.StandardOutput.ReadToEnd();
process.WaitForExit();
var format = FormatResult(result);
WriteToInfluxDB(format);
}
private string FormatResult(string result)
{
var lines = result.Split("\n");
var sb = new StringBuilder();
foreach (var line in lines)
{
var cols = line.Split(" ", StringSplitOptions.RemoveEmptyEntries);
if (line.Contains("/host/wd/"))
{
sb.AppendLine($"{cols[5].Substring("/host".Length)},{cols[1]},{cols[4].TrimEnd('%')},{cols[3]}");
}
}
return sb.ToString();
}
private void WriteToInfluxDB(string result)
{
var lines = result.Split("\n");
using var client = new InfluxDBClient("http://influxdb:8086", "BD4A71llb9_XbCA5mmKDbc_yTYwadPPLwyk4nAQ0l_yR_WJmw_-dMOWIs0KlS7-pZtHot_HrejY5GcOohKElmA==");
using var writeApi = client.GetWriteApi();
foreach (var line in lines)
{
Console.WriteLine(line);
var cols = line.Split(",", StringSplitOptions.RemoveEmptyEntries);
if(cols.Length != 4) continue;
var path = cols[0];
var totalSize = cols[1];
var usedPercent = cols[2];
var available = cols[3];
var point = PointData
.Measurement("disk_usage")
.Tag("path", path)
.Field("total_size", totalSize)
.Field("used_percent", double.Parse(usedPercent))
.Field("available", available)
.Timestamp(DateTime.UtcNow, WritePrecision.Ns);
writeApi.WritePoint(point, "def-bucket", "def-org");
Console.WriteLine($"[DiskMonitor] Write point: {point.ToLineProtocol()}");
}
}
}