public void RuleTriggeredByTimeout(TimeBetweenOperations rule) { var msg = new AlarmMessage(rule.AlarmLevel, rule.ProgramName, $"Rule {rule.RuleName} triggered. Message: {rule.AlarmMessage}"); AlarmMessageManager.RaiseAlarm(msg); #if DEBUG Debug.WriteLine($"ALARM! {rule.AlarmLevel} level. From {rule.ProgramName}. Message: {rule.AlarmMessage}"); #endif }
private void MainLoop() { if (EventQueue.TryDequeue(out SystemEvent fromQ)) { Parallel.ForEach(Rules.Where(r => string.IsNullOrEmpty(r.Value.OperationName) || r.Value.OperationName.Equals(fromQ.OperationName)), rule => { if (rule.Value.AddAndCheckIfTriggered(fromQ)) { var msg = new AlarmMessage(rule.Value.AlarmLevel, fromQ.AppInfo.ApplicationName, $"Rule {rule.Value.RuleName} triggered. Message: {rule.Value.AlarmMessage}", fromQ.CaughtException.Message, fromQ.ID); AlarmMessageManager.RaiseAlarm(msg); #if DEBUG Debug.WriteLine($"ALARM! {rule.Value.AlarmLevel} level. From {fromQ.AppInfo.ApplicationName}. Message: {rule.Value.AlarmMessage}"); #endif } }); } else { AnalyzerChangeState(State.Stopped); } }
public void StartAnalyzer() { var analyzerThread = new Thread(() => { try { AnalyzerChangeState(State.Running); while (State == State.Running) { MainLoop(); } while (EventQueue.Count > 0) { MainLoop(); } AnalyzerChangeState(State.Stopped); } catch (Exception ex) { try { AnalyzerChangeState(State.Stopped); var message = $"Exception in {nameof(ProgramAnalyzer)}.{nameof(StartAnalyzer)} for {ProgramName}."; OnReportException?.Invoke(message, ex); var alarmMessage = new AlarmMessage(AlarmLevel.Medium, AppDomain.CurrentDomain.FriendlyName, message, ex.InnerException?.Message ?? ex.Message); AlarmMessageManager.RaiseAlarm(alarmMessage); } catch (Exception ex2) { OnReportException?.Invoke("Exception in Exception handling", ex2); } } } ); analyzerThread.Priority = ThreadPriority.Highest; analyzerThread.Name = nameof(analyzerThread) + "_" + ProgramName; analyzerThread.Start(); }
/// <summary> /// Starts the engine task. /// </summary> /// <returns></returns> private void StartEngine() { var engineThread = new Thread(() => { try { ChangeState(State.Running); AddMessage("Main engine thread started."); while (State == State.Running) { MainLoop(); } AddMessage($"Shutting down. Running main loop until main queue is empty. {MainEventQueue.Count} events in queue."); while (MainEventQueue.Count > 0) { MainLoop(); } AddMessage("Main queue emptied. Shutting down analyzers"); foreach (var analyzer in Analyzers) { AddMessage($"Stopping analyzer for {analyzer.Key}"); analyzer.Value.StopAnalyzer(); } } catch (Exception ex) { ChangeState(State.Stopped); var message = $"Exception in {nameof(AnalyzerEngine)}.{nameof(StartEngine)}. Engine is down. Engine will try to restart."; OnReportException?.Invoke(message, ex); var alarmMessage = new AlarmMessage(AlarmLevel.Medium, AppDomain.CurrentDomain.FriendlyName, message, ex.Message); AlarmMessageManager.RaiseAlarm(alarmMessage); } }); engineThread.Priority = ThreadPriority.Highest; engineThread.Name = nameof(engineThread); engineThread.Start(); }