diff options
| author | Roy Ben Shabat <Roy.mail.net@gmail.com> | 2025-07-29 19:53:35 +0300 |
|---|---|---|
| committer | Roy Ben Shabat <Roy.mail.net@gmail.com> | 2025-07-29 19:53:35 +0300 |
| commit | a802fe75f9538371004f1833e69a69b798892d0c (patch) | |
| tree | 9d4612cf4dd6c543650b9ee10599db4b30782391 /Software/Visual_Studio/Tango.Telemetry/Modules/TelemetryDiagnosticsModule.cs | |
| parent | 72c6399ec345ec26bd7f79651667ffa585474919 (diff) | |
| download | Tango-a802fe75f9538371004f1833e69a69b798892d0c.tar.gz Tango-a802fe75f9538371004f1833e69a69b798892d0c.zip | |
Telemetry
Diffstat (limited to 'Software/Visual_Studio/Tango.Telemetry/Modules/TelemetryDiagnosticsModule.cs')
| -rw-r--r-- | Software/Visual_Studio/Tango.Telemetry/Modules/TelemetryDiagnosticsModule.cs | 134 |
1 files changed, 134 insertions, 0 deletions
diff --git a/Software/Visual_Studio/Tango.Telemetry/Modules/TelemetryDiagnosticsModule.cs b/Software/Visual_Studio/Tango.Telemetry/Modules/TelemetryDiagnosticsModule.cs new file mode 100644 index 000000000..a35e08328 --- /dev/null +++ b/Software/Visual_Studio/Tango.Telemetry/Modules/TelemetryDiagnosticsModule.cs @@ -0,0 +1,134 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Timers; +using Tango.Core; +using Tango.Insights; +using Tango.Integration.Operation; +using Tango.Logging; +using Tango.PMR.Diagnostics; +using Tango.PMR.Insights; +using Tango.Telemetry.TelemetryObjects; + +namespace Tango.Telemetry.Modules +{ + public class TelemetryDiagnosticsModule : TelemetryConfigurableModule<TelemetryDiagnosticsModuleConfig>, ITelemetryModule + { + public const int MIN_SAMPLING_INTERVAL_SECONDS = 1; + + private IMachineOperator _machineOperator; + private bool _isStarted; + + private Timer _diagnosticsSamplingTimer; + private List<StartDiagnosticsResponse> _diagnosticsQueue; + private bool _writing; + private bool _emptyWritten; + + public event EventHandler<TelemetryAvailableEventArgs> TelemetryAvailable; + + public string Name { get; private set; } = "Diagnostics"; + + private TelemetryDiagnosticsModule() : base() + { + _diagnosticsQueue = new List<StartDiagnosticsResponse>(); + } + + public TelemetryDiagnosticsModule(IMachineOperator machineOperator) : base() + { + _machineOperator = machineOperator; + _machineOperator.DiagnosticsDataAvailable += DiagnosticsDataAvailable; + } + + private void DiagnosticsDataAvailable(object sender, StartDiagnosticsResponse diagnostics) + { + if (_isStarted && diagnostics.Monitors != null) + { + _diagnosticsQueue.Add(diagnostics); + } + } + + public void Start() + { + _isStarted = true; + + if (Config.DiagnosticsSamplingInterval.TotalSeconds < MIN_SAMPLING_INTERVAL_SECONDS) + { + Config.DiagnosticsSamplingInterval = TimeSpan.FromSeconds(MIN_SAMPLING_INTERVAL_SECONDS); + } + + if (_diagnosticsSamplingTimer == null) + { + _diagnosticsSamplingTimer = new Timer(); + _diagnosticsSamplingTimer.Interval = Config.DiagnosticsSamplingInterval.TotalMilliseconds; + _diagnosticsSamplingTimer.Elapsed += DiagnosticsSamplingTimer_Elapsed; + } + + + _diagnosticsQueue.Clear(); + + _writing = false; + _diagnosticsSamplingTimer.Start(); + } + + public void Stop() + { + _isStarted = false; + } + + private void DiagnosticsSamplingTimer_Elapsed(object sender, ElapsedEventArgs e) + { + if (!_isStarted || _writing) return; + + try + { + _diagnosticsSamplingTimer.Stop(); + + _writing = true; + + if (_diagnosticsQueue.Count > 0) + { + var queue = _diagnosticsQueue.ToList(); + _diagnosticsQueue.Clear(); + _emptyWritten = false; + + var monitorsAvg = InsightsHelper.AverageMonitors(queue.Select(x => x.Monitors).ToList()); + queue.Clear(); + + TelemetryDiagnosticsFrame frame = new TelemetryDiagnosticsFrame(); + frame.Monitors = monitorsAvg; + frame.Time = DateTime.UtcNow.Subtract(Config.DiagnosticsSamplingInterval); + + + TelemetryAvailable?.Invoke(this, new TelemetryAvailableEventArgs(frame, TelemetrySource.Streaming)); + } + else + { + if (!_emptyWritten) + { + TelemetryDiagnosticsFrame frame = new TelemetryDiagnosticsFrame(); + frame.Monitors = new InsightsMonitors(); + frame.Time = DateTime.UtcNow.Subtract(Config.DiagnosticsSamplingInterval); + TelemetryAvailable?.Invoke(this, new TelemetryAvailableEventArgs(frame, TelemetrySource.Streaming)); + _emptyWritten = true; + } + } + } + catch (Exception ex) + { + LogManager.Log(ex, "Error occurred on insights frame insertion."); + } + finally + { + _writing = false; + _diagnosticsSamplingTimer.Start(); + } + } + + public void Dispose() + { + _machineOperator.DiagnosticsDataAvailable -= DiagnosticsDataAvailable; + } + } +} |
