Sic.Framework-Nanjing-Baishi/MECF.Framework.Common/MECF/Framework/Common/DataCenter/DiskManager.cs

146 lines
5.7 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using System;
using System.IO;
using System.Threading.Tasks;
using Aitex.Common.Util;
using Aitex.Core.RT.DataCenter;
using Aitex.Core.RT.Event;
using Aitex.Core.RT.Log;
using Aitex.Core.RT.SCCore;
using Aitex.Core.Util;
using MECF.Framework.Common.Equipment;
using MECF.Framework.Common.Utilities;
namespace MECF.Framework.Common.DataCenter
{
public class DiskManager
{
const long GB_TO_BYTES = 2 ^ 30;
private PeriodicJob _threadMonitorDiskSpace;
private bool _isDbFreeDiskSpaceLow = false;
private long _dbFreeDiskSpaceAmount = 0;
private readonly string _drvApp;
private readonly string _drvDB;
private readonly R_TRIG _rTrigAppFreeDiskSpaceLowWarn = new();
private readonly R_TRIG _rTrigAppFreeDiskSpaceLowAlarm = new();
private readonly R_TRIG _rTrigDBFreeDiskSpaceLowWarn = new();
private readonly R_TRIG _rTrigDBFreeDiskSpaceLowAlarm = new();
public bool IsEnableMonitorDiskSpaceFunc { get; set; }
public DiskManager()
{
if (SC.ContainsItem("System.IsEnableMonitorDiskSpaceFunc"))
{
IsEnableMonitorDiskSpaceFunc = SC.GetValue<bool>("System.IsEnableMonitorDiskSpaceFunc");
}
var f = new FileInfo(PathManager.GetAppDir());
_drvApp = Path.GetPathRoot(f.FullName);
f = new FileInfo(PathManager.GetDBDictionary());
_drvDB = Path.GetPathRoot(f.FullName);
DATA.Subscribe($"{ModuleName.System}.{ModuleName.Diagnosis}.DiskMon.IsDBFreeDiskSpaceLow", () => _isDbFreeDiskSpaceLow);
DATA.Subscribe($"{ModuleName.System}.{ModuleName.Diagnosis}.DiskMon.DBFreeDiskSpaceAmount", () => _dbFreeDiskSpaceAmount);
}
public void Run()
{
_threadMonitorDiskSpace = new PeriodicJob((int)TimeSpan.FromSeconds(30).TotalMilliseconds, MonitorDiskSpace, "MonitorDiskSpace Thread");
Task.Delay(10000).ContinueWith(delegate
{
_threadMonitorDiskSpace.Start();
});
}
private readonly R_TRIG _rTrigMonitorTimeOver = new();
private bool MonitorDiskSpace()
{
try
{
PerformanceMonitor.MonitorRun(() =>
{
var freeDiskSpaceApp = 0L;
var totalDiskSpaceApp = 0L;
var freeDiskSpaceDB = 0L;
var totalDiskSpaceDB = 0L;
var drives = DriveInfo.GetDrives();
foreach (var driveInfo in drives)
{
// check disk space where application located
if (driveInfo.Name == _drvApp)
{
freeDiskSpaceApp = driveInfo.TotalFreeSpace;
totalDiskSpaceApp = driveInfo.TotalSize;
}
// check disk space where database located
if (driveInfo.Name == _drvDB)
{
freeDiskSpaceDB = driveInfo.TotalFreeSpace;
totalDiskSpaceDB = driveInfo.TotalSize;
}
_dbFreeDiskSpaceAmount = freeDiskSpaceDB;
}
// check APP free disk space low alarm
_rTrigAppFreeDiskSpaceLowAlarm.CLK = freeDiskSpaceApp < totalDiskSpaceApp * 0.05;
_rTrigAppFreeDiskSpaceLowWarn.CLK = freeDiskSpaceApp < totalDiskSpaceApp * 0.1;
if (_rTrigAppFreeDiskSpaceLowAlarm.Q) // Alarm detected
EV.PostAlarmLog(ModuleName.System.ToString(),
_drvApp + " Hard disk Free Space of Sic application is less than 5% need release");
else if (_rTrigAppFreeDiskSpaceLowWarn.Q) // Warning detected
EV.PostWarningLog(ModuleName.System.ToString(),
_drvApp + " Hard disk Free Space of Sic application is less than 10%need release");
// check DB free disk space low alarm
_rTrigDBFreeDiskSpaceLowAlarm.CLK = freeDiskSpaceDB < 5 * GB_TO_BYTES;
_rTrigDBFreeDiskSpaceLowWarn.CLK = freeDiskSpaceDB < 20 * GB_TO_BYTES;
if (_rTrigDBFreeDiskSpaceLowAlarm.Q)
{
// Alarm detected
EV.PostAlarmLog(ModuleName.System.ToString(),
_drvDB + " Hard disk Free Space of Database is less than 5GBneed release");
_isDbFreeDiskSpaceLow = true;
}
else if (_rTrigDBFreeDiskSpaceLowWarn.Q)
{
// Warning detected
EV.PostWarningLog(ModuleName.System.ToString(),
_drvDB + " Hard disk Free Space of Database is less than 20GBneed release");
_isDbFreeDiskSpaceLow = true;
}
// No DB free disk space low warn and alarm
if (!_rTrigDBFreeDiskSpaceLowAlarm.M && !_rTrigDBFreeDiskSpaceLowWarn.M)
{
_isDbFreeDiskSpaceLow = false;
}
return true;
}, 1000, _rTrigMonitorTimeOver, out var duration, $"{nameof(DiskManager)}.{nameof(MonitorDiskSpace)}()");
}
catch (Exception ex)
{
LOG.Write(ex);
}
return true;
}
public void Stop()
{
_threadMonitorDiskSpace.Stop();
}
~DiskManager()
{
Stop();
}
}
}