public bool RaiseAlert() { bool raiseAlert = false; if (IsFolder || !Enabled || //don't bother raising events for folders, disabled, N/A or collectors CurrentState == MonitorStates.Good || //No alerts for Good state CurrentState == MonitorStates.NotAvailable || CurrentState == MonitorStates.Disabled) { raiseAlert = false; LastStateChange = DateTime.Now; waitAlertTimeErrWarnInMinFlagged = false; } else { bool stateChanged = (LastMonitorState != CurrentState); if (stateChanged) { if (DelayErrWarnAlertForXSec > 0) // alert should be delayed { delayErrWarnAlertTime = DateTime.Now.AddSeconds(DelayErrWarnAlertForXSec); waitAlertTimeErrWarnInMinFlagged = true; } else { raiseAlert = true; } } else { if (waitAlertTimeErrWarnInMinFlagged) //waiting for delayed alert { if (DateTime.Now > delayErrWarnAlertTime) { raiseAlert = true; waitAlertTimeErrWarnInMinFlagged = false; //handle further alerts as if it changed now again LastStateChange = DateTime.Now; } else { raiseAlert = false; } } else { if (RepeatAlertInXMin > 0) { if (LastStateChange.AddMinutes(RepeatAlertInXMin) < DateTime.Now) { raiseAlert = true; //handle further alerts as if it changed now again LastStateChange = DateTime.Now; } else { raiseAlert = false; } } else { raiseAlert = false; } } } if (raiseAlert) { //only allow repeat alert after specified minutes if (AlertOnceInXMin > 0 && LastAlertTime.AddMinutes(AlertOnceInXMin) > DateTime.Now) { raiseAlert = false; //cancel alert } } if (raiseAlert) { LastAlertTime = DateTime.Now; //reset alert time } } return(raiseAlert); }
public void SetCurrentState(MonitorState newState) { bool raiseAlertNow = false; if (!PollingOverrideActive) { if (currentState != null) { LastStateUpdate = DateTime.Now; if (FirstStateUpdate < (new DateTime(2000, 1, 1))) { FirstStateUpdate = DateTime.Now; } bool stateChanged = currentState.State != newState.State; #region Polling overide stuff if (stateChanged) { LastStateChange = DateTime.Now; StagnantStateFirstRepeat = false; StagnantStateSecondRepeat = false; StagnantStateThirdRepeat = false; if (EnabledPollingOverride && EnablePollFrequencySliding && CurrentState.State != CollectorState.NotAvailable) { RaiseLoggingPollingOverridesTriggeredEvent("Frequency sliding cancelled due to collector state value changed"); } } else if (EnabledPollingOverride && EnablePollFrequencySliding && CurrentState.State != CollectorState.NotAvailable) { if (!StagnantStateFirstRepeat) { newState.RepeatCount = 1; StagnantStateFirstRepeat = true; StagnantStateSecondRepeat = false; StagnantStateThirdRepeat = false; RaiseLoggingPollingOverridesTriggeredEvent("Frequency sliding reached 1st stagnant stage"); } else if (!StagnantStateSecondRepeat) { newState.RepeatCount = 2; StagnantStateSecondRepeat = true; StagnantStateThirdRepeat = false; RaiseLoggingPollingOverridesTriggeredEvent("Frequency sliding reached 2nd stagnant stage"); } else if (!StagnantStateThirdRepeat) { newState.RepeatCount = 3; StagnantStateThirdRepeat = true; RaiseLoggingPollingOverridesTriggeredEvent("Frequency sliding reached 3rd stagnant stage"); } } #endregion #region Check if alert should be raised now if (stateChanged) { if (newState.State == CollectorState.Good) { numberOfPollingsInErrWarn = 0; } if (DelayErrWarnAlertForXSec > 0 || DelayErrWarnAlertForXPolls > 0) // alert should be delayed { delayErrWarnAlertTime = DateTime.Now.AddSeconds(DelayErrWarnAlertForXSec); numberOfPollingsInErrWarn = 0; waitAlertTimeErrWarnInMinFlagged = true; } else { raiseAlertNow = true; } } else { if (waitAlertTimeErrWarnInMinFlagged) //waiting for delayed alert { if (DelayErrWarnAlertForXSec > 0 && DateTime.Now > delayErrWarnAlertTime) { raiseAlertNow = true; waitAlertTimeErrWarnInMinFlagged = false; numberOfPollingsInErrWarn = 0; //handle further alerts as if it changed now again LastStateChange = DateTime.Now; } else if (DelayErrWarnAlertForXPolls > 0 && DelayErrWarnAlertForXPolls <= numberOfPollingsInErrWarn) { raiseAlertNow = true; waitAlertTimeErrWarnInMinFlagged = false; numberOfPollingsInErrWarn = 0; //handle further alerts as if it changed now again LastStateChange = DateTime.Now; } else { raiseAlertNow = false; } } else { if ( (RepeatAlertInXMin > 0 && (LastStateChange.AddMinutes(RepeatAlertInXMin) < DateTime.Now)) || (RepeatAlertInXPolls > 0 && RepeatAlertInXPolls <= numberOfPollingsInErrWarn) ) { raiseAlertNow = true; numberOfPollingsInErrWarn = 0; //handle further alerts as if it changed now again LastStateChange = DateTime.Now; } else { raiseAlertNow = false; } } } if (raiseAlertNow) { //only allow repeat alert after specified minutes if (AlertOnceInXMin > 0 && LastAlertTime.AddMinutes(AlertOnceInXMin) > DateTime.Now) { raiseAlertNow = false; //cancel alert } } else { if (newState.State == CollectorState.Warning || newState.State == CollectorState.Error) { numberOfPollingsInErrWarn++; } else { numberOfPollingsInErrWarn = 0; } } #endregion AddStateToHistory(currentState); #region Corrective scripts try { if (!CorrectiveScriptDisabled && (ParentMonitorPack == null || ParentMonitorPack.CorrectiveScriptsEnabled)) { if (newState.State == CollectorState.Good && (currentState.State == CollectorState.Error || currentState.State == CollectorState.Warning)) { foreach (string scriptName in RunRestorationScripts(stateChanged)) { newState.ScriptsRan.Add("Restoration script: " + scriptName); } } else // if (stateChanged || !CorrectiveScriptsOnlyOnStateChange) { if (newState.State == CollectorState.Error) { foreach (string scriptName in RunErrorCorrectiveScripts(stateChanged)) { newState.ScriptsRan.Add("Error corrective script: " + scriptName); } } else if (newState.State == CollectorState.Warning) { foreach (string scriptName in RunWarningCorrectiveScripts(stateChanged)) { newState.ScriptsRan.Add("Warning corrective script: " + scriptName); } } } } } catch (Exception corrEx) { CorrectiveScriptExecutionFailed?.Invoke(this, "Error executing corrective scripts", corrEx.Message); } #endregion } currentState = newState; #region Set Alert texts if (AlertHeaderText != null && AlertHeaderText.Trim().Length > 0) { currentState.AlertHeader = AlertHeaderText; } if (AlertFooterText != null && AlertFooterText.Trim().Length > 0) { currentState.AlertFooter = AlertFooterText; } if (currentState.State == CollectorState.Good && GoodAlertText != null && GoodAlertText.Trim().Length > 0) { currentState.AdditionalAlertText = GoodAlertText; } else if (currentState.State == CollectorState.Warning && WarningAlertText != null && WarningAlertText.Trim().Length > 0) { currentState.AdditionalAlertText = WarningAlertText; } else if (currentState.State == CollectorState.Error && ErrorAlertText != null && ErrorAlertText.Trim().Length > 0) { currentState.AdditionalAlertText = ErrorAlertText; } #endregion } RaiseStateUpdated(); #region Raise event for Alert to be handled by Monitorpack if (raiseAlertNow) { LastAlertTime = DateTime.Now; //reset alert time switch (newState.State) { case CollectorState.Good: LastGoodState = newState; GoodStateCount++; RaiseAlertGoodState(); break; case CollectorState.Warning: LastWarningState = newState; WarningStateCount++; RaiseAlertWarningState(); break; case CollectorState.Error: case CollectorState.ConfigurationError: LastErrorState = newState; ErrorStateCount++; RaiseAlertErrorState(); break; default: RaiseNoStateChanged(); break; } } else { RaiseNoStateChanged(); } #endregion }
/// <summary> /// Check if an Alert must be raised or not. /// </summary> /// <returns>True or False, you decide</returns> public bool RaiseAlert() { bool raiseAlert = false; if (IsFolder || !Enabled || //don't bother raising events for folders, disabled, N/A or collectors //CurrentState.State == CollectorState.Good || //No alerts for Good state CurrentState.State == CollectorState.NotAvailable || CurrentState.State == CollectorState.Disabled) { raiseAlert = false; LastStateChange = DateTime.Now; waitAlertTimeErrWarnInMinFlagged = false; } else { if (CurrentPollAborted) { raiseAlert = false; } else { bool stateChanged = (LastMonitorState.State != CurrentState.State); if (stateChanged) { if (LastMonitorState.State == CollectorState.Good) { numberOfPollingsInErrWarn = 0; } if (DelayErrWarnAlertForXSec > 0 || DelayErrWarnAlertForXPolls > 0) // alert should be delayed { delayErrWarnAlertTime = DateTime.Now.AddSeconds(DelayErrWarnAlertForXSec); numberOfPollingsInErrWarn = 0; waitAlertTimeErrWarnInMinFlagged = true; } else { raiseAlert = true; } } else { if (waitAlertTimeErrWarnInMinFlagged) //waiting for delayed alert { if (DelayErrWarnAlertForXSec > 0 && DateTime.Now > delayErrWarnAlertTime) { raiseAlert = true; waitAlertTimeErrWarnInMinFlagged = false; numberOfPollingsInErrWarn = 0; //handle further alerts as if it changed now again LastStateChange = DateTime.Now; } else if (DelayErrWarnAlertForXPolls > 0 && DelayErrWarnAlertForXPolls <= numberOfPollingsInErrWarn) { raiseAlert = true; waitAlertTimeErrWarnInMinFlagged = false; numberOfPollingsInErrWarn = 0; //handle further alerts as if it changed now again LastStateChange = DateTime.Now; } else { raiseAlert = false; } } else { if ( (RepeatAlertInXMin > 0 && (LastStateChange.AddMinutes(RepeatAlertInXMin) < DateTime.Now)) || (RepeatAlertInXPolls > 0 && RepeatAlertInXPolls <= numberOfPollingsInErrWarn) ) { raiseAlert = true; numberOfPollingsInErrWarn = 0; //handle further alerts as if it changed now again LastStateChange = DateTime.Now; } else { raiseAlert = false; } } } } if (raiseAlert) { //only allow repeat alert after specified minutes if (AlertOnceInXMin > 0 && LastAlertTime.AddMinutes(AlertOnceInXMin) > DateTime.Now) { raiseAlert = false; //cancel alert } } else { if ( //(LastMonitorState.State == CollectorState.Warning || LastMonitorState.State == CollectorState.Error) && (CurrentState.State == CollectorState.Warning || CurrentState.State == CollectorState.Error)) { numberOfPollingsInErrWarn++; } else { numberOfPollingsInErrWarn = 0; } } if (raiseAlert) { LastAlertTime = DateTime.Now; //reset alert time if (CurrentState.State == CollectorState.Warning) { LastWarningAlertTime = DateTime.Now; } if (CurrentState.State == CollectorState.Error) { LastErrorAlertTime = DateTime.Now; } } } return(raiseAlert); }