From 33c5e689caa9842aa29dac915b4f8d83564cee0c Mon Sep 17 00:00:00 2001 From: Roy Ben Shabat Date: Thu, 21 Aug 2025 14:36:42 +0300 Subject: Telemetry JobStatus --- .../Sources/TelemetryJobStatusSource.cs | 133 +++++++++++++++++++++ .../Sources/TelemetryLogsStreamingSourceConfig.cs | 4 +- .../Tango.Telemetry/Tango.Telemetry.csproj | 2 + .../Tango.Telemetry/Telemetries/TelemetryJobRun.cs | 2 +- .../Telemetries/TelemetryJobStatus.cs | 50 ++++++++ .../Tango.Telemetry/TelemetryAvailableEventArgs.cs | 2 + .../Tango.Telemetry/TelemetryPublishPackage.cs | 1 + .../Tango.Telemetry/TelemetryPublisher.cs | 29 +++-- 8 files changed, 207 insertions(+), 16 deletions(-) create mode 100644 Software/Visual_Studio/Tango.Telemetry/Sources/TelemetryJobStatusSource.cs create mode 100644 Software/Visual_Studio/Tango.Telemetry/Telemetries/TelemetryJobStatus.cs (limited to 'Software/Visual_Studio/Tango.Telemetry') diff --git a/Software/Visual_Studio/Tango.Telemetry/Sources/TelemetryJobStatusSource.cs b/Software/Visual_Studio/Tango.Telemetry/Sources/TelemetryJobStatusSource.cs new file mode 100644 index 000000000..93a5cc54e --- /dev/null +++ b/Software/Visual_Studio/Tango.Telemetry/Sources/TelemetryJobStatusSource.cs @@ -0,0 +1,133 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Tango.BL.Entities; +using Tango.Integration.Operation; +using Tango.Telemetry.Telemetries; + +namespace Tango.Telemetry.Sources +{ + public class TelemetryJobStatusSource : ITelemetryStreamingSource + { + private IMachineOperator _machineOperator; + private Job _job; + private TelemetryJobStatus _lastStatus; + private String _groupID; + private DateTime _startTime; + + public bool IsStarted { get; private set; } + public string Name { get; } = "Job Status Streaming"; + public bool RequiresTelemetryDuplicationTracking { get; } + + public event EventHandler TelemetryAvailable; + + public TelemetryJobStatusSource(IMachineOperator machineOperator) + { + _machineOperator = machineOperator; + } + + public void Start() + { + if (!IsStarted) + { + IsStarted = true; + _machineOperator.PrintingStarted += MachineOperator_PrintingStarted; + } + } + + public void Stop() + { + if (IsStarted) + { + IsStarted = false; + _machineOperator.PrintingStarted -= MachineOperator_PrintingStarted; + } + } + + private void MachineOperator_PrintingStarted(object sender, PrintingEventArgs e) + { + if (e.JobHandler != null) + { + _groupID = Guid.NewGuid().ToString(); + _job = e.Job; + _startTime = DateTime.UtcNow; + e.JobHandler.StatusChanged += JobHandler_StatusChanged; + e.JobHandler.Failed += JobHandler_Failed; + } + } + + private void JobHandler_StatusChanged(object sender, RunningJobStatus status) + { + if (IsStarted) + { + TelemetryJobStatus tStatus = new TelemetryJobStatus(); + + tStatus.JobName = _job?.Name; + + if (status.ProgressMinusSettingUp > 0) + { + tStatus.Status = TelemetryJobStatus.JobStatus.InProgress; + } + + if (status.IsCompleted) + { + tStatus.Status = TelemetryJobStatus.JobStatus.Completed; + } + + if (status.IsFailed) + { + tStatus.Status = TelemetryJobStatus.JobStatus.Failed; + } + + if (status.IsCanceled) + { + tStatus.Status = TelemetryJobStatus.JobStatus.Aborted; + } + + tStatus.ID = _groupID; + tStatus.TotalTime = status.TotalTime; + tStatus.RemainingTime = status.RemainingTime; + + tStatus.Progress = status.ProgressMinusSettingUp; + tStatus.TotalProgress = status.TotalProgressMinusSettingUp; + + tStatus.CurrentUnit = status.CurrentUnit; + tStatus.RemainingUnits = status.RemainingUnits; + + tStatus.CurrentUnitProgress = status.CurrentUnitProgress; + tStatus.CurrentUnitTotalProgress = status.CurrentUnitTotalProgress; + + tStatus.Message = status.Message; + + _lastStatus = tStatus; + + TelemetryAvailable?.Invoke(this, new TelemetryAvailableEventArgs() + { + TelemetryObject = tStatus, + DisableDeliveryRetries = true + }); + } + } + + private void JobHandler_Failed(object sender, Exception e) + { + if (_lastStatus != null) + { + _lastStatus.Message = e.FlattenMessage(); + + TelemetryAvailable?.Invoke(this, new TelemetryAvailableEventArgs() + { + TelemetryObject = _lastStatus, + DisableDeliveryRetries = true + }); + } + } + + public void Dispose() + { + Stop(); + } + } +} diff --git a/Software/Visual_Studio/Tango.Telemetry/Sources/TelemetryLogsStreamingSourceConfig.cs b/Software/Visual_Studio/Tango.Telemetry/Sources/TelemetryLogsStreamingSourceConfig.cs index 1de30976a..440843003 100644 --- a/Software/Visual_Studio/Tango.Telemetry/Sources/TelemetryLogsStreamingSourceConfig.cs +++ b/Software/Visual_Studio/Tango.Telemetry/Sources/TelemetryLogsStreamingSourceConfig.cs @@ -10,11 +10,11 @@ namespace Tango.Telemetry.Sources { public class TelemetryLogsStreamingSourceConfig : SettingsBase { - public List Categories { get; set; } + public HashSet Categories { get; set; } public TelemetryLogsStreamingSourceConfig() { - Categories = new List() { LogCategory.Error, LogCategory.Critical, LogCategory.Warning }; + Categories = new HashSet() { LogCategory.Error, LogCategory.Critical, LogCategory.Warning }; } } } diff --git a/Software/Visual_Studio/Tango.Telemetry/Tango.Telemetry.csproj b/Software/Visual_Studio/Tango.Telemetry/Tango.Telemetry.csproj index e53d2e99e..80c49ccfa 100644 --- a/Software/Visual_Studio/Tango.Telemetry/Tango.Telemetry.csproj +++ b/Software/Visual_Studio/Tango.Telemetry/Tango.Telemetry.csproj @@ -272,12 +272,14 @@ + + diff --git a/Software/Visual_Studio/Tango.Telemetry/Telemetries/TelemetryJobRun.cs b/Software/Visual_Studio/Tango.Telemetry/Telemetries/TelemetryJobRun.cs index 883da2b8a..c5f4da8ea 100644 --- a/Software/Visual_Studio/Tango.Telemetry/Telemetries/TelemetryJobRun.cs +++ b/Software/Visual_Studio/Tango.Telemetry/Telemetries/TelemetryJobRun.cs @@ -135,7 +135,7 @@ namespace Tango.Telemetry.Telemetries //ProcessParamaters.DyeingSpeed = The speed in which the machine is dyeing the thread in centimeters per second. public ProcessParameters ProcessParameters { get; set; } - public TelemetryJobRun() + public TelemetryJobRun() : base() { Segments = new List(); } diff --git a/Software/Visual_Studio/Tango.Telemetry/Telemetries/TelemetryJobStatus.cs b/Software/Visual_Studio/Tango.Telemetry/Telemetries/TelemetryJobStatus.cs new file mode 100644 index 000000000..0dde56db9 --- /dev/null +++ b/Software/Visual_Studio/Tango.Telemetry/Telemetries/TelemetryJobStatus.cs @@ -0,0 +1,50 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Tango.Telemetry.Telemetries +{ + [TelemetryName("JobStatus",1)] + public class TelemetryJobStatus : TelemetryBase + { + public enum JobStatus + { + Preparing, + InProgress, + Completed, + Aborted, + Failed + } + + public DateTime StartTime { get; set; } + + public String JobName { get; set; } + + public JobStatus Status { get; set; } + + public TimeSpan TotalTime { get; set; } + + public TimeSpan RemainingTime { get; set; } + + public double Progress { get; set; } + + public double TotalProgress { get; set; } + + public int CurrentUnit { get; set; } + + public int RemainingUnits { get; set; } + + public double CurrentUnitProgress { get; set; } + + public double CurrentUnitTotalProgress { get; set; } + + public String Message { get; set; } + + public TelemetryJobStatus() : base() + { + ID = String.Empty; + } + } +} diff --git a/Software/Visual_Studio/Tango.Telemetry/TelemetryAvailableEventArgs.cs b/Software/Visual_Studio/Tango.Telemetry/TelemetryAvailableEventArgs.cs index c55ea2fab..79442ae59 100644 --- a/Software/Visual_Studio/Tango.Telemetry/TelemetryAvailableEventArgs.cs +++ b/Software/Visual_Studio/Tango.Telemetry/TelemetryAvailableEventArgs.cs @@ -9,5 +9,7 @@ namespace Tango.Telemetry public class TelemetryAvailableEventArgs : EventArgs { public ITelemetry TelemetryObject { get; set; } + + public bool DisableDeliveryRetries { get; set; } } } diff --git a/Software/Visual_Studio/Tango.Telemetry/TelemetryPublishPackage.cs b/Software/Visual_Studio/Tango.Telemetry/TelemetryPublishPackage.cs index 2e7a43361..0c2229cb0 100644 --- a/Software/Visual_Studio/Tango.Telemetry/TelemetryPublishPackage.cs +++ b/Software/Visual_Studio/Tango.Telemetry/TelemetryPublishPackage.cs @@ -23,6 +23,7 @@ namespace Tango.Telemetry public String Site { get; set; } public String TelemetryName { get; internal set; } public int TelemetryVersion { get; internal set; } + public bool DisableDeliveryRetries { get; set; } public TelemetryPublishPackage() { diff --git a/Software/Visual_Studio/Tango.Telemetry/TelemetryPublisher.cs b/Software/Visual_Studio/Tango.Telemetry/TelemetryPublisher.cs index 4f13eda9d..45da1a1ca 100644 --- a/Software/Visual_Studio/Tango.Telemetry/TelemetryPublisher.cs +++ b/Software/Visual_Studio/Tango.Telemetry/TelemetryPublisher.cs @@ -195,7 +195,7 @@ namespace Tango.Telemetry if (source != null) { LogManager.Log($"Telemetry stream received {source.Name} -> {e.TelemetryObject.ToTelemetryName()}.", LogCategory.Debug); - PushTelemetryPackage(source, e.TelemetryObject, TelemetrySourceTypes.Streaming); + PushTelemetryPackage(source, e.TelemetryObject, TelemetrySourceTypes.Streaming, e.DisableDeliveryRetries); } } @@ -519,7 +519,7 @@ namespace Tango.Telemetry /// /// Enqueues telemetry into the system based on a source and type. /// - private TelemetryPublishPackage PushTelemetryPackage(ITelemetrySource source, ITelemetry telemetry, TelemetrySourceTypes sourceType) + private TelemetryPublishPackage PushTelemetryPackage(ITelemetrySource source, ITelemetry telemetry, TelemetrySourceTypes sourceType, bool disableDeliveryRetries = false) { PendingTelemetry pendingTelemetry = new PendingTelemetry(); pendingTelemetry.Created = DateTime.UtcNow; @@ -527,7 +527,7 @@ namespace Tango.Telemetry pendingTelemetry.SourceType = sourceType; pendingTelemetry.TelemetryObject = telemetry; - var package = new TelemetryPublishPackage() { Source = source, PendingTelemetry = pendingTelemetry, SourceType = sourceType }; + var package = new TelemetryPublishPackage() { Source = source, PendingTelemetry = pendingTelemetry, SourceType = sourceType, DisableDeliveryRetries = disableDeliveryRetries }; PushTelemetryPackage(package); @@ -716,7 +716,7 @@ namespace Tango.Telemetry destinationResult.Status = TelemetryPublishResult.DestinationStatus.Passed; destinationResult.ElapsedTime = destinationWatch.Elapsed; - LogManager.Log($"Successfully published to '{destination.Name}' in {destinationResult.ElapsedTime.TotalMilliseconds} ms."); + LogManager.Log($"Successfully published to '{destination.Name}' in {destinationResult.ElapsedTime.TotalMilliseconds} ms.", LogCategory.Debug); } else { @@ -773,16 +773,19 @@ namespace Tango.Telemetry // Save retry state back into the package package.PendingTelemetry.PendingDestinations = pendingDestinations; - // Remove from storage if all destinations succeeded; otherwise persist state - if (package.PendingTelemetry.PendingDestinations.Count == 0) + if (!package.DisableDeliveryRetries) { - LogManager.Log("Deleting successfully published telemetry from storage.", LogCategory.Debug); - StorageManager.DeletePendingTelemetry(package.PendingTelemetry); - } - else - { - LogManager.Log("Saving telemetry package for future retry or tracking.", LogCategory.Debug); - StorageManager.UpsertPendingTelemetry(package.PendingTelemetry); + // Remove from storage if all destinations succeeded; otherwise persist state + if (package.PendingTelemetry.PendingDestinations.Count == 0) + { + LogManager.Log("Deleting successfully published telemetry from storage.", LogCategory.Debug); + StorageManager.DeletePendingTelemetry(package.PendingTelemetry); + } + else + { + LogManager.Log("Saving telemetry package for future retry or tracking.", LogCategory.Debug); + StorageManager.UpsertPendingTelemetry(package.PendingTelemetry); + } } // Finalize result and notify completion -- cgit v1.3.1