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 void Job() { // 执行 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"); } } }