diff options
| author | Roy Ben Shabat <Roy.mail.net@gmail.com> | 2025-07-30 12:36:30 +0300 |
|---|---|---|
| committer | Roy Ben Shabat <Roy.mail.net@gmail.com> | 2025-07-30 12:36:30 +0300 |
| commit | 4222eddece906d6f0877022c06b853deb5068472 (patch) | |
| tree | a29b706b3a5aedb28a42b209d5bb72b0ef94d40e /Software/Visual_Studio/Tango.Telemetry/Sources | |
| parent | a802fe75f9538371004f1833e69a69b798892d0c (diff) | |
| download | Tango-4222eddece906d6f0877022c06b853deb5068472.tar.gz Tango-4222eddece906d6f0877022c06b853deb5068472.zip | |
Telemetry source.
Diffstat (limited to 'Software/Visual_Studio/Tango.Telemetry/Sources')
4 files changed, 233 insertions, 0 deletions
diff --git a/Software/Visual_Studio/Tango.Telemetry/Sources/TelemetryDiagnosticsSource.cs b/Software/Visual_Studio/Tango.Telemetry/Sources/TelemetryDiagnosticsSource.cs new file mode 100644 index 000000000..22fac087b --- /dev/null +++ b/Software/Visual_Studio/Tango.Telemetry/Sources/TelemetryDiagnosticsSource.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.Telemetries; + +namespace Tango.Telemetry.Sources +{ + public class TelemetryDiagnosticsSource : TelemetryConfigurableSource<TelemetryDiagnosticsSourceConfig>, ITelemetrySource + { + 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 TelemetryDiagnosticsSource() : base() + { + _diagnosticsQueue = new List<StartDiagnosticsResponse>(); + } + + public TelemetryDiagnosticsSource(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, TelemetrySourceTypes.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, TelemetrySourceTypes.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; + } + } +} diff --git a/Software/Visual_Studio/Tango.Telemetry/Sources/TelemetryDiagnosticsSourceConfig.cs b/Software/Visual_Studio/Tango.Telemetry/Sources/TelemetryDiagnosticsSourceConfig.cs new file mode 100644 index 000000000..806277d5b --- /dev/null +++ b/Software/Visual_Studio/Tango.Telemetry/Sources/TelemetryDiagnosticsSourceConfig.cs @@ -0,0 +1,19 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Tango.Settings; + +namespace Tango.Telemetry.Sources +{ + public class TelemetryDiagnosticsSourceConfig : SettingsBase + { + public TimeSpan DiagnosticsSamplingInterval { get; set; } + + public TelemetryDiagnosticsSourceConfig() + { + DiagnosticsSamplingInterval = TimeSpan.FromSeconds(10); + } + } +} diff --git a/Software/Visual_Studio/Tango.Telemetry/Sources/TelemetryJobRunsHistoryModule.cs b/Software/Visual_Studio/Tango.Telemetry/Sources/TelemetryJobRunsHistoryModule.cs new file mode 100644 index 000000000..6cb597e4b --- /dev/null +++ b/Software/Visual_Studio/Tango.Telemetry/Sources/TelemetryJobRunsHistoryModule.cs @@ -0,0 +1,61 @@ +using System; +using System.Collections.Generic; +using System.Data.Entity; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Tango.BL; +using Tango.Telemetry.Telemetries; + +namespace Tango.Telemetry.Sources +{ + public class TelemetryJobRunsHistorySource : TelemetryConfigurableSource<TelemetryJobRunsHistorySourceConfig>, ITelemetryHistorySource + { + private bool _isBusy; + + public string Name { get; private set; } = "JobRuns History"; + + public Task<bool> CanRequestHistory(DateTime from) + { + return Task.FromResult(!_isBusy); + } + + public async Task<IEnumerable<ITelemetry>> RequestHistory(DateTime from) + { + try + { + _isBusy = true; + + using (ObservablesContext db = ObservablesContext.CreateDefault()) + { + var runs = await db.JobRuns + .Where(x => x.LastUpdated > from) + .OrderBy(x => x.LastUpdated) + .Take(Config.MaxJobRunsPerRequest) + .ToListAsync(); + + List<TelemetryJobRun> tRuns = new List<TelemetryJobRun>(); + + foreach (var run in runs) + { + TelemetryJobRun tRun = new TelemetryJobRun(); + tRun.Time = run.LastUpdated; + //Fill the object.. + tRuns.Add(tRun); + } + + return tRuns; + } + } + finally + { + _isBusy = false; + } + } + + public void Dispose() + { + + } + } +} diff --git a/Software/Visual_Studio/Tango.Telemetry/Sources/TelemetryJobRunsHistorySourceConfig.cs b/Software/Visual_Studio/Tango.Telemetry/Sources/TelemetryJobRunsHistorySourceConfig.cs new file mode 100644 index 000000000..da2043941 --- /dev/null +++ b/Software/Visual_Studio/Tango.Telemetry/Sources/TelemetryJobRunsHistorySourceConfig.cs @@ -0,0 +1,19 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Tango.Settings; + +namespace Tango.Telemetry.Sources +{ + public class TelemetryJobRunsHistorySourceConfig : SettingsBase + { + public int MaxJobRunsPerRequest { get; set; } + + public TelemetryJobRunsHistorySourceConfig() + { + MaxJobRunsPerRequest = 100; + } + } +} |
