Refactor publishing path, add diagnostics, update documentation.
This commit is contained in:
Родитель
6b8853e3e8
Коммит
958f3ea2aa
|
@ -0,0 +1,112 @@
|
|||
|
||||
using System.Diagnostics;
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace OpcPublisher
|
||||
{
|
||||
using static OpcPublisher.Workarounds.TraceWorkaround;
|
||||
using static IotHubMessaging;
|
||||
using static PublisherNodeConfiguration;
|
||||
|
||||
/// <summary>
|
||||
/// Class to enable output to the console.
|
||||
/// </summary>
|
||||
public static class Diagnostics
|
||||
{
|
||||
|
||||
public static uint DiagnosticsInterval
|
||||
{
|
||||
get => _diagnosticsInterval;
|
||||
set => _diagnosticsInterval = value;
|
||||
}
|
||||
private static uint _diagnosticsInterval = 0;
|
||||
|
||||
public static int IotHubMessagingMessagesSentCount
|
||||
{
|
||||
get => _messagesSentCount;
|
||||
}
|
||||
private static int _messagesSentCount = 0;
|
||||
|
||||
private static CancellationTokenSource _shutdownTokenSource;
|
||||
private static Task _showDiagnosticsInfoTask;
|
||||
|
||||
public static void Init()
|
||||
{
|
||||
// init data
|
||||
_showDiagnosticsInfoTask = null;
|
||||
_shutdownTokenSource = new CancellationTokenSource();
|
||||
|
||||
// kick off the task to show diagnostic info
|
||||
if (_diagnosticsInterval > 0)
|
||||
{
|
||||
_showDiagnosticsInfoTask = Task.Run(async () => await ShowDiagnosticsInfoAsync(_shutdownTokenSource.Token));
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
public async static Task Shutdown()
|
||||
{
|
||||
// wait for diagnostic task completion if it is enabled
|
||||
if (_showDiagnosticsInfoTask != null)
|
||||
{
|
||||
_shutdownTokenSource.Cancel();
|
||||
await _showDiagnosticsInfoTask;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Kicks of the task to show diagnostic information each 30 seconds.
|
||||
/// </summary>
|
||||
public static async Task ShowDiagnosticsInfoAsync(CancellationToken cancellationtoken)
|
||||
{
|
||||
while (true)
|
||||
{
|
||||
try
|
||||
{
|
||||
|
||||
if (cancellationtoken.IsCancellationRequested)
|
||||
{
|
||||
return;
|
||||
}
|
||||
await Task.Delay((int)_diagnosticsInterval * 1000);
|
||||
|
||||
Trace("======================================================================");
|
||||
Trace($"OpcPublisher status @ {System.DateTime.UtcNow}");
|
||||
Trace("---------------------------------");
|
||||
Trace($"OPC sessions: {NumberOfOpcSessions}");
|
||||
Trace($"connected OPC sessions: {NumberOfConnectedOpcSessions}");
|
||||
Trace($"connected OPC subscriptions: {NumberOfConnectedOpcSubscriptions}");
|
||||
Trace($"OPC monitored items: {NumberOfMonitoredItems}");
|
||||
Trace("---------------------------------");
|
||||
Trace($"monitored items queue bounded capacity: {MonitoredItemsQueueCapacity}");
|
||||
Trace($"monitored items queue current items: {MonitoredItemsQueueCount}");
|
||||
Trace($"monitored item notifications enqueued: {EnqueueCount}");
|
||||
Trace($"monitored item notifications enqueue failure: {EnqueueFailureCount}");
|
||||
Trace($"monitored item notifications dequeued: {DequeueCount}");
|
||||
Trace("---------------------------------");
|
||||
Trace($"messages sent to IoTHub: {SentMessages}");
|
||||
Trace($"bytes sent to IoTHub: {SentBytes}");
|
||||
Trace($"avg msg size: {SentBytes / (SentMessages == 0 ? 1 : SentMessages)}");
|
||||
Trace($"time in ms for sent msgs: {SentTime}");
|
||||
Trace($"min time in ms for msg: {MinSentTime}");
|
||||
Trace($"max time in ms for msg: {MaxSentTime}");
|
||||
Trace($"avg time in ms for msg: {SentTime / (SentMessages == 0 ? 1 : SentMessages)}");
|
||||
Trace($"msg send failures: {FailedMessages}");
|
||||
Trace($"time in ms for failed msgs: {FailedTime}");
|
||||
Trace($"avg time in ms for failed msg: {FailedTime / (FailedMessages == 0 ? 1 : FailedMessages)}");
|
||||
Trace($"messages too large to sent to IoTHub: {TooLargeCount}");
|
||||
Trace($"times we missed send interval: {MissedSendIntervalCount}");
|
||||
Trace("---------------------------------");
|
||||
Trace($"current working set in MB: {Process.GetCurrentProcess().WorkingSet64 / (1024 * 1024)}");
|
||||
Trace("======================================================================");
|
||||
}
|
||||
catch
|
||||
{
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
Загрузка…
Ссылка в новой задаче