aboutsummaryrefslogtreecommitdiffstats
path: root/Software/Visual_Studio/Tango.Telemetry
diff options
context:
space:
mode:
authorRoy Ben Shabat <Roy.mail.net@gmail.com>2025-08-21 14:36:42 +0300
committerRoy Ben Shabat <Roy.mail.net@gmail.com>2025-08-21 14:36:42 +0300
commit33c5e689caa9842aa29dac915b4f8d83564cee0c (patch)
treee8a96988ce0cb66797fae688c5e753359da41f03 /Software/Visual_Studio/Tango.Telemetry
parent9c64ff964e98c5a27bb63cecf3042499b6b50736 (diff)
downloadTango-33c5e689caa9842aa29dac915b4f8d83564cee0c.tar.gz
Tango-33c5e689caa9842aa29dac915b4f8d83564cee0c.zip
Telemetry JobStatus
Diffstat (limited to 'Software/Visual_Studio/Tango.Telemetry')
-rw-r--r--Software/Visual_Studio/Tango.Telemetry/Sources/TelemetryJobStatusSource.cs133
-rw-r--r--Software/Visual_Studio/Tango.Telemetry/Sources/TelemetryLogsStreamingSourceConfig.cs4
-rw-r--r--Software/Visual_Studio/Tango.Telemetry/Tango.Telemetry.csproj2
-rw-r--r--Software/Visual_Studio/Tango.Telemetry/Telemetries/TelemetryJobRun.cs2
-rw-r--r--Software/Visual_Studio/Tango.Telemetry/Telemetries/TelemetryJobStatus.cs50
-rw-r--r--Software/Visual_Studio/Tango.Telemetry/TelemetryAvailableEventArgs.cs2
-rw-r--r--Software/Visual_Studio/Tango.Telemetry/TelemetryPublishPackage.cs1
-rw-r--r--Software/Visual_Studio/Tango.Telemetry/TelemetryPublisher.cs29
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