2025-03-07 12:05:39 +08:00
|
|
|
|
using System.Diagnostics;
|
2025-03-07 12:10:53 +08:00
|
|
|
|
using System.Text;
|
2025-03-07 12:05:39 +08:00
|
|
|
|
using FluentScheduler;
|
2025-03-10 15:59:13 +08:00
|
|
|
|
using InfluxDB.Client;
|
|
|
|
|
|
using InfluxDB.Client.Api.Domain;
|
|
|
|
|
|
using InfluxDB.Client.Writes;
|
2025-03-07 12:05:39 +08:00
|
|
|
|
using Interface.Jobs;
|
|
|
|
|
|
|
|
|
|
|
|
namespace Service.Jobs;
|
|
|
|
|
|
|
|
|
|
|
|
public class DiskMonitorRegistry : Registry, IDiskMonitorRegistry
|
|
|
|
|
|
{
|
|
|
|
|
|
public void Job()
|
|
|
|
|
|
{
|
|
|
|
|
|
// 执行 cmd 命令 获取执行结果
|
|
|
|
|
|
var command = "df -h";
|
|
|
|
|
|
var process = new Process
|
|
|
|
|
|
{
|
2025-03-07 12:10:53 +08:00
|
|
|
|
StartInfo = new()
|
2025-03-07 12:05:39 +08:00
|
|
|
|
{
|
|
|
|
|
|
FileName = "/bin/bash",
|
|
|
|
|
|
Arguments = $"-c \"{command}\"",
|
|
|
|
|
|
RedirectStandardOutput = true,
|
|
|
|
|
|
UseShellExecute = false,
|
|
|
|
|
|
CreateNoWindow = true
|
|
|
|
|
|
}
|
|
|
|
|
|
};
|
2025-03-10 16:09:05 +08:00
|
|
|
|
|
2025-03-07 12:05:39 +08:00
|
|
|
|
process.Start();
|
|
|
|
|
|
var result = process.StandardOutput.ReadToEnd();
|
|
|
|
|
|
process.WaitForExit();
|
2025-03-10 16:09:05 +08:00
|
|
|
|
|
2025-03-10 16:04:25 +08:00
|
|
|
|
var format = FormatResult(result);
|
|
|
|
|
|
|
|
|
|
|
|
WriteToInfluxDB(format);
|
2025-03-07 12:10:53 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
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/"))
|
|
|
|
|
|
{
|
2025-03-10 15:59:13 +08:00
|
|
|
|
sb.AppendLine($"{cols[5].Substring("/host".Length)},{cols[1]},{cols[4].TrimEnd('%')},{cols[3]}");
|
2025-03-07 12:10:53 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return sb.ToString();
|
2025-03-07 12:05:39 +08:00
|
|
|
|
}
|
2025-03-10 15:59:13 +08:00
|
|
|
|
|
|
|
|
|
|
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)
|
|
|
|
|
|
{
|
2025-03-10 16:02:02 +08:00
|
|
|
|
Console.WriteLine(line);
|
|
|
|
|
|
|
2025-03-10 15:59:13 +08:00
|
|
|
|
var cols = line.Split(",", StringSplitOptions.RemoveEmptyEntries);
|
|
|
|
|
|
|
2025-03-10 16:09:05 +08:00
|
|
|
|
if(cols.Length != 4) continue;
|
|
|
|
|
|
|
2025-03-10 15:59:13 +08:00
|
|
|
|
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");
|
2025-03-10 16:11:14 +08:00
|
|
|
|
Console.WriteLine($"[DiskMonitor] Write point: {point.ToLineProtocol()}");
|
2025-03-10 15:59:13 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|
2025-03-07 12:05:39 +08:00
|
|
|
|
}
|