From 72c6399ec345ec26bd7f79651667ffa585474919 Mon Sep 17 00:00:00 2001 From: Roy Ben Shabat Date: Tue, 29 Jul 2025 02:29:02 +0300 Subject: Telemetry --- .../Destinations/MqttTelemetryDestination.cs | 4 ++-- .../Tango.Telemetry/Tango.Telemetry.csproj | 4 ++-- .../Tango.Telemetry/TelemetryDiagnosticsFrame.cs | 18 -------------- .../Tango.Telemetry/TelemetryJobRun.cs | 14 ----------- .../TelemetryObjects/TelemetryDiagnosticsFrame.cs | 18 ++++++++++++++ .../TelemetryObjects/TelemetryJobRun.cs | 14 +++++++++++ .../Tango.Telemetry/TelemetryPublisher.cs | 10 +++++++- .../Tango.Telemetry/TelemetryPublisherAdvanced.cs | 2 +- .../TelemetryPublisherConfiguration.cs | 28 ++++++++++++++++++++-- 9 files changed, 72 insertions(+), 40 deletions(-) delete mode 100644 Software/Visual_Studio/Tango.Telemetry/TelemetryDiagnosticsFrame.cs delete mode 100644 Software/Visual_Studio/Tango.Telemetry/TelemetryJobRun.cs create mode 100644 Software/Visual_Studio/Tango.Telemetry/TelemetryObjects/TelemetryDiagnosticsFrame.cs create mode 100644 Software/Visual_Studio/Tango.Telemetry/TelemetryObjects/TelemetryJobRun.cs (limited to 'Software/Visual_Studio/Tango.Telemetry') diff --git a/Software/Visual_Studio/Tango.Telemetry/Destinations/MqttTelemetryDestination.cs b/Software/Visual_Studio/Tango.Telemetry/Destinations/MqttTelemetryDestination.cs index 2a4d3a297..08412446c 100644 --- a/Software/Visual_Studio/Tango.Telemetry/Destinations/MqttTelemetryDestination.cs +++ b/Software/Visual_Studio/Tango.Telemetry/Destinations/MqttTelemetryDestination.cs @@ -23,14 +23,14 @@ namespace Tango.Telemetry.Destinations public bool Enable { get; set; } = true; public String Address { get; private set; } public int Port { get; private set; } - public String Topic { get; set; } + public String Topic { get; private set; } public IReadOnlyList SupportedSources { get; private set; } /// /// /// - /// example machie/telemetry/serial number + /// e.g machie/telemetry/serial number /// Default localhost /// Default 1883 public MqttTelemetryDestination(String topic, String address = "localhost", int port = 1883) diff --git a/Software/Visual_Studio/Tango.Telemetry/Tango.Telemetry.csproj b/Software/Visual_Studio/Tango.Telemetry/Tango.Telemetry.csproj index 0cd4c9106..98df17cb8 100644 --- a/Software/Visual_Studio/Tango.Telemetry/Tango.Telemetry.csproj +++ b/Software/Visual_Studio/Tango.Telemetry/Tango.Telemetry.csproj @@ -217,8 +217,8 @@ - - + + diff --git a/Software/Visual_Studio/Tango.Telemetry/TelemetryDiagnosticsFrame.cs b/Software/Visual_Studio/Tango.Telemetry/TelemetryDiagnosticsFrame.cs deleted file mode 100644 index 89fe910b6..000000000 --- a/Software/Visual_Studio/Tango.Telemetry/TelemetryDiagnosticsFrame.cs +++ /dev/null @@ -1,18 +0,0 @@ -using LiteDB; -using Newtonsoft.Json; -using Newtonsoft.Json.Linq; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using Tango.PMR.Insights; - -namespace Tango.Telemetry -{ - [TelemetryName("Diagnostics")] - public class TelemetryDiagnosticsFrame : TelemetryBase - { - public InsightsMonitors Monitors { get; set; } - } -} diff --git a/Software/Visual_Studio/Tango.Telemetry/TelemetryJobRun.cs b/Software/Visual_Studio/Tango.Telemetry/TelemetryJobRun.cs deleted file mode 100644 index 091306089..000000000 --- a/Software/Visual_Studio/Tango.Telemetry/TelemetryJobRun.cs +++ /dev/null @@ -1,14 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace Tango.Telemetry -{ - [TelemetryName("JobRuns")] - public class TelemetryJobRun : TelemetryBase - { - - } -} diff --git a/Software/Visual_Studio/Tango.Telemetry/TelemetryObjects/TelemetryDiagnosticsFrame.cs b/Software/Visual_Studio/Tango.Telemetry/TelemetryObjects/TelemetryDiagnosticsFrame.cs new file mode 100644 index 000000000..86762596e --- /dev/null +++ b/Software/Visual_Studio/Tango.Telemetry/TelemetryObjects/TelemetryDiagnosticsFrame.cs @@ -0,0 +1,18 @@ +using LiteDB; +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Tango.PMR.Insights; + +namespace Tango.Telemetry.TelemetryObjects +{ + [TelemetryName("Diagnostics")] + public class TelemetryDiagnosticsFrame : TelemetryBase + { + public InsightsMonitors Monitors { get; set; } + } +} diff --git a/Software/Visual_Studio/Tango.Telemetry/TelemetryObjects/TelemetryJobRun.cs b/Software/Visual_Studio/Tango.Telemetry/TelemetryObjects/TelemetryJobRun.cs new file mode 100644 index 000000000..828f61360 --- /dev/null +++ b/Software/Visual_Studio/Tango.Telemetry/TelemetryObjects/TelemetryJobRun.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Tango.Telemetry.TelemetryObjects +{ + [TelemetryName("JobRuns")] + public class TelemetryJobRun : TelemetryBase + { + + } +} diff --git a/Software/Visual_Studio/Tango.Telemetry/TelemetryPublisher.cs b/Software/Visual_Studio/Tango.Telemetry/TelemetryPublisher.cs index 662df9bae..8891a6cc4 100644 --- a/Software/Visual_Studio/Tango.Telemetry/TelemetryPublisher.cs +++ b/Software/Visual_Studio/Tango.Telemetry/TelemetryPublisher.cs @@ -12,6 +12,7 @@ using Tango.Insights; using Tango.Integration.Operation; using Tango.PMR.Diagnostics; using Tango.PMR.Insights; +using Tango.Telemetry.TelemetryObjects; namespace Tango.Telemetry { @@ -150,6 +151,8 @@ namespace Tango.Telemetry try { + _diagnosticsSamplingTimer.Stop(); + _writing = true; if (_diagnosticsQueue.Count > 0) @@ -186,17 +189,22 @@ namespace Tango.Telemetry finally { _writing = false; + _diagnosticsSamplingTimer.Start(); } } private void PendingStorageCheckTimer_Elapsed(object sender, ElapsedEventArgs e) { + _pendingStorageCheckTimer.Stop(); + var telemetryAll = PendingStorageManager.GetTelemetryAll(); foreach (var t in telemetryAll) { PushTelemetryPackage(t, TelemetrySource.PendingStorage); } + + _pendingStorageCheckTimer.Start(); } #endregion @@ -326,7 +334,7 @@ namespace Tango.Telemetry { try { - PublishingPackage?.Invoke(this, new TelemetryPackagePublishingEventArgs() { Package = package, Destination = destination }); + PackagePublished?.Invoke(this, new TelemetryPackagePublishedEventArgs() { Package = package, Destination = destination }); } catch { } } diff --git a/Software/Visual_Studio/Tango.Telemetry/TelemetryPublisherAdvanced.cs b/Software/Visual_Studio/Tango.Telemetry/TelemetryPublisherAdvanced.cs index 9ea817535..2d0f48126 100644 --- a/Software/Visual_Studio/Tango.Telemetry/TelemetryPublisherAdvanced.cs +++ b/Software/Visual_Studio/Tango.Telemetry/TelemetryPublisherAdvanced.cs @@ -15,7 +15,7 @@ namespace Tango.Telemetry /// public TimeSpan MaxExponentialBackoff { get; set; } = TimeSpan.FromHours(1); - public TelemetryPublisherAdvanced(IMachineOperator machineOperator, TelemetryLiteDbPendingStorageManager storageManager, TelemetryPublisherConfiguration config) : base(machineOperator, storageManager, config) + public TelemetryPublisherAdvanced(IMachineOperator machineOperator, ITelemetryPendingStorageManager storageManager, TelemetryPublisherConfiguration config) : base(machineOperator, storageManager, config) { } diff --git a/Software/Visual_Studio/Tango.Telemetry/TelemetryPublisherConfiguration.cs b/Software/Visual_Studio/Tango.Telemetry/TelemetryPublisherConfiguration.cs index 56f826591..da5856848 100644 --- a/Software/Visual_Studio/Tango.Telemetry/TelemetryPublisherConfiguration.cs +++ b/Software/Visual_Studio/Tango.Telemetry/TelemetryPublisherConfiguration.cs @@ -26,8 +26,32 @@ namespace Tango.Telemetry public void Validate() { - if (!MachineID.IsNotNullOrEmpty()) throw new ArgumentNullException($"{nameof(MachineID)} is not set."); - if (!Environment.IsNotNullOrEmpty()) throw new ArgumentNullException($"{nameof(Environment)} is not set."); + if (!MachineID.IsNotNullOrEmpty()) + throw new ArgumentNullException(nameof(MachineID), "MachineID is not set or empty."); + + if (!Environment.IsNotNullOrEmpty()) + throw new ArgumentNullException(nameof(Environment), "Environment is not set or empty."); + + if (!Enum.IsDefined(typeof(MachineTypes), MachineType)) + throw new ArgumentOutOfRangeException(nameof(MachineType), "MachineType is not a valid enum value."); + + if (DiagnosticsSamplingInterval.TotalSeconds < 1) + throw new ArgumentOutOfRangeException(nameof(DiagnosticsSamplingInterval), "DiagnosticsSamplingInterval must be at least 1 second."); + + if (PendingStorageCheckInterval.TotalSeconds < 5) + throw new ArgumentOutOfRangeException(nameof(PendingStorageCheckInterval), "PendingStorageCheckInterval must be at least 5 seconds."); + + if (TelemetryDestinations == null || TelemetryDestinations.Count == 0) + throw new InvalidOperationException("At least one telemetry destination must be provided."); + + foreach (var destination in TelemetryDestinations) + { + if (destination == null) + throw new InvalidOperationException("Telemetry destination list contains a null entry."); + + if (destination.SupportedSources == null || destination.SupportedSources.Count == 0) + throw new InvalidOperationException($"Telemetry destination '{destination.Name}' has no supported sources defined."); + } } } } -- cgit v1.3.1