diff options
| author | Roy Ben Shabat <Roy.mail.net@gmail.com> | 2025-08-21 14:36:42 +0300 |
|---|---|---|
| committer | Roy Ben Shabat <Roy.mail.net@gmail.com> | 2025-08-21 14:36:42 +0300 |
| commit | 33c5e689caa9842aa29dac915b4f8d83564cee0c (patch) | |
| tree | e8a96988ce0cb66797fae688c5e753359da41f03 /Software/Visual_Studio/Tango.Telemetry | |
| parent | 9c64ff964e98c5a27bb63cecf3042499b6b50736 (diff) | |
| download | Tango-33c5e689caa9842aa29dac915b4f8d83564cee0c.tar.gz Tango-33c5e689caa9842aa29dac915b4f8d83564cee0c.zip | |
Telemetry JobStatus
Diffstat (limited to 'Software/Visual_Studio/Tango.Telemetry')
8 files changed, 207 insertions, 16 deletions
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<TelemetryAvailableEventArgs> 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<LogCategory> Categories { get; set; } + public HashSet<LogCategory> Categories { get; set; } public TelemetryLogsStreamingSourceConfig() { - Categories = new List<LogCategory>() { LogCategory.Error, LogCategory.Critical, LogCategory.Warning }; + Categories = new HashSet<LogCategory>() { 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 @@ <Compile Include="Sources\TelemetryJobRunsHistorySourceConfig.cs" /> <Compile Include="PendingTelemetry.cs" /> <Compile Include="Sources\TelemetryJobRunsStreamingSource.cs" /> + <Compile Include="Sources\TelemetryJobStatusSource.cs" /> <Compile Include="Sources\TelemetryLogsStreamingSource.cs" /> <Compile Include="Sources\TelemetryLogsStreamingSourceConfig.cs" /> <Compile Include="Sources\TelemetryMachineStatusStreamingSource.cs" /> <Compile Include="Sources\TelemetryMachineUpdatesStreamingSource.cs" /> <Compile Include="Sources\TelemetryMachineUpdatesHistorySource.cs" /> <Compile Include="Telemetries\TelemetryEvent.cs" /> + <Compile Include="Telemetries\TelemetryJobStatus.cs" /> <Compile Include="Telemetries\TelemetryLog.cs" /> <Compile Include="Telemetries\TelemetryMachineStatus.cs" /> <Compile Include="Telemetries\TelemetryMachineUpdate.cs" /> 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<TelemetryJobRunSegment>(); } 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 /// <summary> /// Enqueues telemetry into the system based on a source and type. /// </summary> - 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 |
