From bbe3d128efa21ba039901f6ba2d167ea80f53e98 Mon Sep 17 00:00:00 2001 From: Marc Schier Date: Fri, 2 Feb 2024 19:16:51 +0100 Subject: [PATCH] =?UTF-8?q?Update=20metrics=20to=20remove=20the=20unit=20s?= =?UTF-8?q?tring=20and=20make=20compliant=20/=20superse=E2=80=A6=20(#2173)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Update metrics to remove the unit string and make compliant / superset of 2.8 metrics * Only updates legacy counters when connected to iot hub --- .../src/Services/NetworkMessageEncoder.cs | 32 ++--- .../src/Services/NetworkMessageSink.cs | 62 +++++++--- .../Services/PublisherDiagnosticCollector.cs | 6 +- .../src/Services/RuntimeStateReporter.cs | 6 +- .../src/Services/WriterGroupDataSource.cs | 116 +++++++++--------- .../src/Stack/Services/OpcUaClient.cs | 32 ++--- .../src/Stack/Services/OpcUaClientManager.cs | 2 +- .../src/Stack/Services/OpcUaSubscription.cs | 31 ++--- 8 files changed, 156 insertions(+), 131 deletions(-) diff --git a/src/Azure.IIoT.OpcUa.Publisher/src/Services/NetworkMessageEncoder.cs b/src/Azure.IIoT.OpcUa.Publisher/src/Services/NetworkMessageEncoder.cs index 0c433e6308..0eab582ebc 100644 --- a/src/Azure.IIoT.OpcUa.Publisher/src/Services/NetworkMessageEncoder.cs +++ b/src/Azure.IIoT.OpcUa.Publisher/src/Services/NetworkMessageEncoder.cs @@ -547,29 +547,29 @@ private void Drop(IEnumerable messages) private void InitializeMetrics(IMetricsContext metrics) { _meter.CreateObservableCounter("iiot_edge_publisher_encoded_notifications", - () => new Measurement(NotificationsProcessedCount, metrics.TagList), "Notifications", - "Number of successfully processed subscription notifications received from OPC client."); + () => new Measurement(NotificationsProcessedCount, metrics.TagList), + description: "Number of successfully processed subscription notifications received from OPC client."); _meter.CreateObservableCounter("iiot_edge_publisher_dropped_notifications", - () => new Measurement(NotificationsDroppedCount, metrics.TagList), "Notifications", - "Number of incoming subscription notifications that are too big to be processed based " + + () => new Measurement(NotificationsDroppedCount, metrics.TagList), + description: "Number of incoming subscription notifications that are too big to be processed based " + "on the message size limits or other issues with the notification."); _meter.CreateObservableCounter("iiot_edge_publisher_processed_messages", - () => new Measurement(MessagesProcessedCount, metrics.TagList), "Messages", - "Number of successfully generated messages that are to be sent using the message sender"); + () => new Measurement(MessagesProcessedCount, metrics.TagList), + description: "Number of successfully generated messages that are to be sent using the message sender"); _meter.CreateObservableGauge("iiot_edge_publisher_notifications_per_message_average", - () => new Measurement(AvgNotificationsPerMessage, metrics.TagList), "Notifications/Message", - "Average subscription notifications packed into a message"); + () => new Measurement(AvgNotificationsPerMessage, metrics.TagList), + description: "Average subscription notifications packed into a message"); _meter.CreateObservableGauge("iiot_edge_publisher_encoded_message_size_average", - () => new Measurement(AvgMessageSize, metrics.TagList), "Bytes", - "Average size of a message through the lifetime of the encoder."); + () => new Measurement(AvgMessageSize, metrics.TagList), + description: "Average size of a message through the lifetime of the encoder."); _meter.CreateObservableGauge("iiot_edge_publisher_chunk_size_average", - () => new Measurement(AvgMessageSize / (4 * 1024), metrics.TagList), "4kb Chunks", - "IoT Hub chunk size average"); + () => new Measurement(AvgMessageSize / (4 * 1024), metrics.TagList), + description: "IoT Hub chunk size average"); _meter.CreateObservableGauge("iiot_edge_publisher_message_split_ratio_max", - () => new Measurement(MaxMessageSplitRatio, metrics.TagList), "Splits", - "The message split ration specifies into how many messages a subscription notification had to be split. " + - "Less is better for performance. If the number is large user should attempt to limit the number of " + - "notifications in a message using configuration."); + () => new Measurement(MaxMessageSplitRatio, metrics.TagList), + description: "The message split ration specifies into how many messages a subscription notification had " + + "to be split. Less is better for performance. If the number is large user should attempt to limit the " + + "number of notifications in a message using configuration."); } private static readonly ConfigurationVersionDataType kEmptyConfiguration = new() { MajorVersion = 1u }; diff --git a/src/Azure.IIoT.OpcUa.Publisher/src/Services/NetworkMessageSink.cs b/src/Azure.IIoT.OpcUa.Publisher/src/Services/NetworkMessageSink.cs index 4b354f0e01..eab365ea48 100644 --- a/src/Azure.IIoT.OpcUa.Publisher/src/Services/NetworkMessageSink.cs +++ b/src/Azure.IIoT.OpcUa.Publisher/src/Services/NetworkMessageSink.cs @@ -74,6 +74,9 @@ public NetworkMessageSink(WriterGroupModel writerGroup, options.Value.DefaultTransport?.ToString(), StringComparison.OrdinalIgnoreCase)) ?? registered[0]; + + _isIoTEdge = _eventClient.Name.Equals(nameof(WriterGroupTransport.IoTHub), + StringComparison.OrdinalIgnoreCase); _messageEncoder = encoder; _logger = logger; _diagnostics = diagnostics; @@ -249,7 +252,7 @@ private async Task SendAsync((IEvent Event, Action Complete) message) catch (OperationCanceledException) { } catch (Exception e) when (e is not ObjectDisposedException) { - kMessagesErrors.Add(1, _metrics.TagList); + _errorCount++; // Fail fast for authentication exceptions var aux = e as AuthenticationException; @@ -447,33 +450,50 @@ static string Stringify(IList notifications) /// private void InitializeMetrics() { - _meter.CreateObservableCounter("iiot_edge_publisher_iothub_queue_dropped_count", - () => new Measurement(_sinkBlockInputDroppedCount, _metrics.TagList), "Messages", - "Telemetry messages dropped due to overflow."); - _meter.CreateObservableUpDownCounter("iiot_edge_publisher_iothub_queue_size", - () => new Measurement(_sinkBlock.InputCount, _metrics.TagList), "Messages", - "Telemetry messages queued for sending upstream."); + _meter.CreateObservableCounter("iiot_edge_publisher_send_queue_dropped_count", + () => new Measurement(_sinkBlockInputDroppedCount, _metrics.TagList), + description: "Telemetry messages dropped due to overflow."); + _meter.CreateObservableUpDownCounter("iiot_edge_publisher_send_queue_size", + () => new Measurement(_sinkBlock.InputCount, _metrics.TagList), + description: "Telemetry messages queued for sending upstream."); _meter.CreateObservableUpDownCounter("iiot_edge_publisher_batch_input_queue_size", - () => new Measurement(_notificationBufferInputCount, _metrics.TagList), "Notifications", - "Telemetry messages queued for sending upstream."); + () => new Measurement(_notificationBufferInputCount, _metrics.TagList), + description: "Telemetry messages queued for sending upstream."); _meter.CreateObservableUpDownCounter("iiot_edge_publisher_encoding_input_queue_size", - () => new Measurement(_encodingBlock.InputCount, _metrics.TagList), "Notifications", - "Telemetry messages queued for sending upstream."); + () => new Measurement(_encodingBlock.InputCount, _metrics.TagList), + description: "Telemetry messages queued for sending upstream."); _meter.CreateObservableUpDownCounter("iiot_edge_publisher_encoding_output_queue_size", - () => new Measurement(_encodingBlock.OutputCount, _metrics.TagList), "Messages", - "Telemetry messages queued for sending upstream."); + () => new Measurement(_encodingBlock.OutputCount, _metrics.TagList), + description: "Telemetry messages queued for sending upstream."); _meter.CreateObservableCounter("iiot_edge_publisher_messages", - () => new Measurement(_messagesSentCount, _metrics.TagList), "Messages", - "Number of IoT messages successfully sent via transport."); + () => new Measurement(_messagesSentCount, _metrics.TagList), + description: "Number of IoT messages successfully sent via transport."); _meter.CreateObservableGauge("iiot_edge_publisher_messages_per_second", - () => new Measurement(_messagesSentCount / UpTime, _metrics.TagList), "Messages/second", - "Messages/second sent via transport."); + () => new Measurement(_messagesSentCount / UpTime, _metrics.TagList), + description: "Messages/second sent via transport."); + _meter.CreateObservableCounter("iiot_edge_publisher_message_send_failures", + () => new Measurement(_errorCount, _metrics.TagList), + description: "Number of failures sending a network message."); + + _meter.CreateObservableCounter("iiot_edge_publisher_sent_iot_messages", + () => new Measurement(_isIoTEdge ? _messagesSentCount : 0, _metrics.TagList), + description: "Number of IoT messages successfully sent via transport."); + _meter.CreateObservableGauge("iiot_edge_publisher_sent_iot_messages_per_second", + () => new Measurement(_isIoTEdge ? _messagesSentCount / UpTime : 0d, _metrics.TagList), + description: "Messages/second sent via transport."); + _meter.CreateObservableCounter("iiot_edge_publisher_iothub_queue_dropped_count", + () => new Measurement(_isIoTEdge ? _sinkBlockInputDroppedCount : 0, _metrics.TagList), + description: "Telemetry messages dropped due to overflow."); + _meter.CreateObservableUpDownCounter("iiot_edge_publisher_iothub_queue_size", + () => new Measurement(_isIoTEdge ? _sinkBlock.InputCount : 0, _metrics.TagList), + description: "Telemetry messages queued for sending upstream."); + _meter.CreateObservableCounter("iiot_edge_publisher_failed_iot_messages", + () => new Measurement(_isIoTEdge ? _errorCount : 0, _metrics.TagList), + description: "Number of failures sending a network message."); } - static readonly Counter kMessagesErrors = Diagnostics.Meter.CreateCounter( - "iiot_edge_publisher_failed_iot_messages", "messages", "Number of failures sending a network message."); static readonly Histogram kSendingDuration = Diagnostics.Meter.CreateHistogram( - "iiot_edge_publisher_messages_duration", "milliseconds", "Histogram of message sending durations."); + "iiot_edge_publisher_messages_duration", description: "Histogram of message sending durations."); /// /// With 256k limit this is 1 GB. @@ -483,6 +503,7 @@ private void InitializeMetrics() private double UpTime => (DateTime.UtcNow - _startTime).TotalSeconds; private long _messagesSentCount; + private long _errorCount; private long _sinkBlockInputDroppedCount; private long _notificationBufferInputCount; private DateTime _dataFlowStartTime = DateTime.MinValue; @@ -504,6 +525,7 @@ private void InitializeMetrics() private readonly CancellationTokenSource _cts; private readonly IMetricsContext _metrics; private readonly IEventClient _eventClient; + private readonly bool _isIoTEdge; private readonly Meter _meter = Diagnostics.NewMeter(); } } diff --git a/src/Azure.IIoT.OpcUa.Publisher/src/Services/PublisherDiagnosticCollector.cs b/src/Azure.IIoT.OpcUa.Publisher/src/Services/PublisherDiagnosticCollector.cs index 464870665f..f25caae259 100644 --- a/src/Azure.IIoT.OpcUa.Publisher/src/Services/PublisherDiagnosticCollector.cs +++ b/src/Azure.IIoT.OpcUa.Publisher/src/Services/PublisherDiagnosticCollector.cs @@ -291,9 +291,9 @@ internal WriterGroupDiagnosticModel AggregateModel ["iiot_edge_publisher_batch_input_queue_size"] = (d, i) => d.IngressBatchBlockBufferSize = (long)i, - ["iiot_edge_publisher_iothub_queue_size"] = + ["iiot_edge_publisher_send_queue_size"] = (d, i) => d.OutgressInputBufferCount = (long)i, - ["iiot_edge_publisher_iothub_queue_dropped_count"] = + ["iiot_edge_publisher_send_queue_dropped_count"] = (d, i) => d.OutgressInputBufferDropped = (long)i, ["iiot_edge_publisher_encoding_input_queue_size"] = @@ -322,7 +322,7 @@ internal WriterGroupDiagnosticModel AggregateModel (d, i) => d.SentMessagesPerSec = (double)i, ["iiot_edge_publisher_messages"] = (d, i) => d.OutgressIoTMessageCount = (long)i, - ["iiot_edge_publisher_failed_iot_messages"] = + ["iiot_edge_publisher_message_send_failures"] = (d, i) => d.OutgressIoTMessageFailedCount = (long)i // ... Add here more items if needed diff --git a/src/Azure.IIoT.OpcUa.Publisher/src/Services/RuntimeStateReporter.cs b/src/Azure.IIoT.OpcUa.Publisher/src/Services/RuntimeStateReporter.cs index 3d1047b721..c3c5133ad3 100644 --- a/src/Azure.IIoT.OpcUa.Publisher/src/Services/RuntimeStateReporter.cs +++ b/src/Azure.IIoT.OpcUa.Publisher/src/Services/RuntimeStateReporter.cs @@ -626,13 +626,13 @@ private void InitializeMetrics() { _meter.CreateObservableGauge("iiot_edge_publisher_module_start", () => new Measurement(_runtimeState == RuntimeStateEventType.RestartAnnouncement ? 0 : 1, - _metrics.TagList), "Count", "Publisher module started."); + _metrics.TagList), description: "Publisher module started."); _meter.CreateObservableGauge("iiot_edge_publisher_module_state", () => new Measurement((int)_runtimeState, - _metrics.TagList), "State", "Publisher module runtime state."); + _metrics.TagList), description: "Publisher module runtime state."); _meter.CreateObservableCounter("iiot_edge_publisher_certificate_renewal_count", () => new Measurement(_certificateRenewals, - _metrics.TagList), "Count", "Publisher certificate renewals."); + _metrics.TagList), description: "Publisher certificate renewals."); } private const int kCertificateLifetimeDays = 30; diff --git a/src/Azure.IIoT.OpcUa.Publisher/src/Services/WriterGroupDataSource.cs b/src/Azure.IIoT.OpcUa.Publisher/src/Services/WriterGroupDataSource.cs index 5ea1cc6b30..3b0c78c89e 100644 --- a/src/Azure.IIoT.OpcUa.Publisher/src/Services/WriterGroupDataSource.cs +++ b/src/Azure.IIoT.OpcUa.Publisher/src/Services/WriterGroupDataSource.cs @@ -793,101 +793,101 @@ public void Dispose() private void InitializeMetrics() { _meter.CreateObservableCounter("iiot_edge_publisher_heartbeats", - () => new Measurement(_heartbeats.Count, _metrics.TagList), "Heartbeats", - "Total Heartbeats delivered for processing."); + () => new Measurement(_heartbeats.Count, _metrics.TagList), + description: "Total Heartbeats delivered for processing."); _meter.CreateObservableGauge("iiot_edge_publisher_heartbeats_per_second", - () => new Measurement(_heartbeats.Count / UpTime, _metrics.TagList), "Heartbeats/sec", - "Opc Cyclic reads/second delivered for processing."); + () => new Measurement(_heartbeats.Count / UpTime, _metrics.TagList), + description: "Opc Cyclic reads/second delivered for processing."); _meter.CreateObservableGauge("iiot_edge_publisher_heartbeats_per_second_last_min", - () => new Measurement(_heartbeats.LastMinute, _metrics.TagList), "Heartbeats", - "Opc Cyclic reads/second delivered for processing in last 60s."); + () => new Measurement(_heartbeats.LastMinute, _metrics.TagList), + description: "Opc Cyclic reads/second delivered for processing in last 60s."); _meter.CreateObservableCounter("iiot_edge_publisher_cyclicreads", - () => new Measurement(_cyclicReads.Count, _metrics.TagList), "Reads", - "Total Cyclic reads delivered for processing."); + () => new Measurement(_cyclicReads.Count, _metrics.TagList), + description: "Total Cyclic reads delivered for processing."); _meter.CreateObservableGauge("iiot_edge_publisher_cyclicreads_per_second", - () => new Measurement(_cyclicReads.Count / UpTime, _metrics.TagList), "Reads/sec", - "Opc Cyclic reads/second delivered for processing."); + () => new Measurement(_cyclicReads.Count / UpTime, _metrics.TagList), + description: "Opc Cyclic reads/second delivered for processing."); _meter.CreateObservableGauge("iiot_edge_publisher_cyclicreads_per_second_last_min", - () => new Measurement(_cyclicReads.LastMinute, _metrics.TagList), "Reads", - "Opc Cyclic reads/second delivered for processing in last 60s."); + () => new Measurement(_cyclicReads.LastMinute, _metrics.TagList), + description: "Opc Cyclic reads/second delivered for processing in last 60s."); _meter.CreateObservableCounter("iiot_edge_publisher_modelchanges", - () => new Measurement(_modelChanges.Count, _metrics.TagList), "Changes", - "Total Number of changes found in the address spaces of the connected servers."); + () => new Measurement(_modelChanges.Count, _metrics.TagList), + description: "Total Number of changes found in the address spaces of the connected servers."); _meter.CreateObservableGauge("iiot_edge_publisher_modelchanges_per_second", - () => new Measurement(_modelChanges.Count / UpTime, _metrics.TagList), "Changes/sec", - "Address space Model changes/second delivered for processing."); + () => new Measurement(_modelChanges.Count / UpTime, _metrics.TagList), + description: "Address space Model changes/second delivered for processing."); _meter.CreateObservableGauge("iiot_edge_publisher_modelchanges_per_second_last_min", - () => new Measurement(_modelChanges.LastMinute, _metrics.TagList), "Changes", - "Address space Model changes/second delivered for processing in last 60s."); + () => new Measurement(_modelChanges.LastMinute, _metrics.TagList), + description: "Address space Model changes/second delivered for processing in last 60s."); _meter.CreateObservableCounter("iiot_edge_publisher_value_changes", - () => new Measurement(_valueChanges.Count, _metrics.TagList), "Values", - "Total Opc Value changes delivered for processing."); + () => new Measurement(_valueChanges.Count, _metrics.TagList), + description: "Total Opc Value changes delivered for processing."); _meter.CreateObservableGauge("iiot_edge_publisher_value_changes_per_second", - () => new Measurement(_valueChanges.Count / UpTime, _metrics.TagList), "Values/sec", - "Opc Value changes/second delivered for processing."); + () => new Measurement(_valueChanges.Count / UpTime, _metrics.TagList), + description: "Opc Value changes/second delivered for processing."); _meter.CreateObservableGauge("iiot_edge_publisher_value_changes_per_second_last_min", - () => new Measurement(_valueChanges.LastMinute, _metrics.TagList), "Values", - "Opc Value changes/second delivered for processing in last 60s."); + () => new Measurement(_valueChanges.LastMinute, _metrics.TagList), + description: "Opc Value changes/second delivered for processing in last 60s."); _meter.CreateObservableCounter("iiot_edge_publisher_events", - () => new Measurement(_events.Count, _metrics.TagList), "Events", - "Total Opc Events delivered for processing."); + () => new Measurement(_events.Count, _metrics.TagList), + description: "Total Opc Events delivered for processing."); _meter.CreateObservableGauge("iiot_edge_publisher_events_per_second", - () => new Measurement(_events.Count / UpTime, _metrics.TagList), "Events/sec", - "Opc Events/second delivered for processing."); + () => new Measurement(_events.Count / UpTime, _metrics.TagList), + description: "Opc Events/second delivered for processing."); _meter.CreateObservableGauge("iiot_edge_publisher_events_per_second_last_min", - () => new Measurement(_events.LastMinute, _metrics.TagList), "Events", - "Opc Events/second delivered for processing in last 60s."); + () => new Measurement(_events.LastMinute, _metrics.TagList), + description: "Opc Events/second delivered for processing in last 60s."); _meter.CreateObservableCounter("iiot_edge_publisher_event_notifications", - () => new Measurement(_eventNotification.Count, _metrics.TagList), "Notifications", - "Total Opc Event notifications delivered for processing."); + () => new Measurement(_eventNotification.Count, _metrics.TagList), + description: "Total Opc Event notifications delivered for processing."); _meter.CreateObservableGauge("iiot_edge_publisher_event_notifications_per_second", - () => new Measurement(_eventNotification.Count / UpTime, _metrics.TagList), "Notifications/sec", - "Opc Event notifications/second delivered for processing."); + () => new Measurement(_eventNotification.Count / UpTime, _metrics.TagList), + description: "Opc Event notifications/second delivered for processing."); _meter.CreateObservableGauge("iiot_edge_publisher_event_notifications_per_second_last_min", - () => new Measurement(_eventNotification.LastMinute, _metrics.TagList), "Notifications", - "Opc Event notifications/second delivered for processing in last 60s."); + () => new Measurement(_eventNotification.LastMinute, _metrics.TagList), + description: "Opc Event notifications/second delivered for processing in last 60s."); _meter.CreateObservableCounter("iiot_edge_publisher_data_changes", - () => new Measurement(_dataChanges.Count, _metrics.TagList), "Notifications", - "Total Opc Data change notifications delivered for processing."); + () => new Measurement(_dataChanges.Count, _metrics.TagList), + description: "Total Opc Data change notifications delivered for processing."); _meter.CreateObservableGauge("iiot_edge_publisher_data_changes_per_second", - () => new Measurement(_dataChanges.Count / UpTime, _metrics.TagList), "Notifications/sec", - "Opc Data change notifications/second delivered for processing."); + () => new Measurement(_dataChanges.Count / UpTime, _metrics.TagList), + description: "Opc Data change notifications/second delivered for processing."); _meter.CreateObservableGauge("iiot_edge_publisher_data_changes_per_second_last_min", - () => new Measurement(_dataChanges.LastMinute, _metrics.TagList), "Notifications", - "Opc Data change notifications/second delivered for processing in last 60s."); + () => new Measurement(_dataChanges.LastMinute, _metrics.TagList), + description: "Opc Data change notifications/second delivered for processing in last 60s."); _meter.CreateObservableCounter("iiot_edge_publisher_queue_overflows", - () => new Measurement(_overflows.Count, _metrics.TagList), "Values", - "Total values received with a queue overflow indicator."); + () => new Measurement(_overflows.Count, _metrics.TagList), + description: "Total values received with a queue overflow indicator."); _meter.CreateObservableGauge("iiot_edge_publisher_queue_overflows_per_second", - () => new Measurement(_overflows.Count / UpTime, _metrics.TagList), "Values/sec", - "Values with overflow indicator/second received."); + () => new Measurement(_overflows.Count / UpTime, _metrics.TagList), + description: "Values with overflow indicator/second received."); _meter.CreateObservableGauge("iiot_edge_publisher_queue_overflows_per_second_last_min", - () => new Measurement(_overflows.LastMinute, _metrics.TagList), "Values", - "Values with overflow indicator/second received in last 60s."); + () => new Measurement(_overflows.LastMinute, _metrics.TagList), + description: "Values with overflow indicator/second received in last 60s."); _meter.CreateObservableCounter("iiot_edge_publisher_keep_alive_notifications", - () => new Measurement(_keepAliveCount, _metrics.TagList), "Notifications", - "Total Opc keep alive notifications delivered for processing."); + () => new Measurement(_keepAliveCount, _metrics.TagList), + description: "Total Opc keep alive notifications delivered for processing."); _meter.CreateObservableUpDownCounter("iiot_edge_publisher_subscriptions", - () => new Measurement(_subscriptions.Count, _metrics.TagList), "Subscriptions", - "Number of Writers/Subscriptions in the writer group."); + () => new Measurement(_subscriptions.Count, _metrics.TagList), + description: "Number of Writers/Subscriptions in the writer group."); _meter.CreateObservableUpDownCounter("iiot_edge_publisher_connection_retries", - () => new Measurement(ReconnectCount, _metrics.TagList), "Attempts", - "OPC UA connect retries."); + () => new Measurement(ReconnectCount, _metrics.TagList), + description: "OPC UA connect retries."); _meter.CreateObservableGauge("iiot_edge_publisher_is_connection_ok", - () => new Measurement(ConnectedClients, _metrics.TagList), "Endpoints", - "OPC UA endpoints that are successfully connected."); + () => new Measurement(ConnectedClients, _metrics.TagList), + description: "OPC UA endpoints that are successfully connected."); _meter.CreateObservableGauge("iiot_edge_publisher_is_disconnected", - () => new Measurement(DisconnectedClients, _metrics.TagList), "Endpoints", - "OPC UA endpoints that are disconnected."); + () => new Measurement(DisconnectedClients, _metrics.TagList), + description: "OPC UA endpoints that are disconnected."); } private const long kNumberOfInvokedMessagesResetThreshold = long.MaxValue - 10000; diff --git a/src/Azure.IIoT.OpcUa.Publisher/src/Stack/Services/OpcUaClient.cs b/src/Azure.IIoT.OpcUa.Publisher/src/Stack/Services/OpcUaClient.cs index 38bded5af3..2ce5cbd0a5 100644 --- a/src/Azure.IIoT.OpcUa.Publisher/src/Stack/Services/OpcUaClient.cs +++ b/src/Azure.IIoT.OpcUa.Publisher/src/Stack/Services/OpcUaClient.cs @@ -2468,35 +2468,35 @@ private void InitializeMetrics() { _meter.CreateObservableGauge("iiot_edge_publisher_client_connectivity_state", () => new Measurement((int)_lastState, _metrics.TagList), - "EndpointConnectivityState", "Client connectivity state."); + description: "Client connectivity state."); _meter.CreateObservableUpDownCounter("iiot_edge_publisher_client_subscription_count", () => new Measurement(SubscriptionCount, _metrics.TagList), - "Subscriptions", "Number of client managed subscriptions."); + description: "Number of client managed subscriptions."); _meter.CreateObservableUpDownCounter("iiot_edge_publisher_client_connectivity_retry_count", () => new Measurement(_numberOfConnectRetries, _metrics.TagList), - "Retries", "Number of connectivity retries on this connection."); + description: "Number of connectivity retries on this connection."); _meter.CreateObservableUpDownCounter("iiot_edge_publisher_client_ref_count", - () => new Measurement(_refCount, _metrics.TagList), "References", - "Number of references to this client."); + () => new Measurement(_refCount, _metrics.TagList), + description: "Number of references to this client."); _meter.CreateObservableUpDownCounter("iiot_edge_publisher_client_good_publish_requests_count", - () => new Measurement(GoodPublishRequestCount, - _metrics.TagList), "Requests", "Number of good publish requests."); + () => new Measurement(GoodPublishRequestCount, _metrics.TagList), + description: "Number of good publish requests."); _meter.CreateObservableUpDownCounter("iiot_edge_publisher_client_bad_publish_requests_count", - () => new Measurement(BadPublishRequestCount, - _metrics.TagList), "Requests", "Number of bad publish requests."); + () => new Measurement(BadPublishRequestCount, _metrics.TagList), + description: "Number of bad publish requests."); _meter.CreateObservableUpDownCounter("iiot_edge_publisher_client_min_publish_requests_count", - () => new Measurement(MinPublishRequestCount, - _metrics.TagList), "Requests", "Number of min publish requests that should be queued."); + () => new Measurement(MinPublishRequestCount, _metrics.TagList), + description: "Number of min publish requests that should be queued."); _meter.CreateObservableUpDownCounter("iiot_edge_publisher_client_outstanding_requests_count", - () => new Measurement(OutstandingRequestCount, - _metrics.TagList), "Requests", "Number of outstanding requests."); + () => new Measurement(OutstandingRequestCount, _metrics.TagList), + description: "Number of outstanding requests."); _meter.CreateObservableUpDownCounter("iiot_edge_publisher_client_publish_timeout_count", - () => new Measurement(_publishTimeoutCounter, - _metrics.TagList), "Requests", "Number of timed out requests."); + () => new Measurement(_publishTimeoutCounter, _metrics.TagList), + description: "Number of timed out requests."); } private static readonly UpDownCounter kSessions = Diagnostics.Meter.CreateUpDownCounter( - "iiot_edge_publisher_session_count", "Number of active sessions."); + "iiot_edge_publisher_session_count", description: "Number of active sessions."); private OpcUaSession? _reconnectingSession; private int _reconnectRequired; diff --git a/src/Azure.IIoT.OpcUa.Publisher/src/Stack/Services/OpcUaClientManager.cs b/src/Azure.IIoT.OpcUa.Publisher/src/Stack/Services/OpcUaClientManager.cs index 825ac1e12f..7898aed13a 100644 --- a/src/Azure.IIoT.OpcUa.Publisher/src/Stack/Services/OpcUaClientManager.cs +++ b/src/Azure.IIoT.OpcUa.Publisher/src/Stack/Services/OpcUaClientManager.cs @@ -608,7 +608,7 @@ private void InitializeMetrics() { _meter.CreateObservableUpDownCounter("iiot_edge_publisher_client_count", () => new Measurement(_clients.Count, _metrics.TagList), - "Clients", "Number of clients."); + description: "Number of clients."); } private const int kMaxDiscoveryAttempts = 3; diff --git a/src/Azure.IIoT.OpcUa.Publisher/src/Stack/Services/OpcUaSubscription.cs b/src/Azure.IIoT.OpcUa.Publisher/src/Stack/Services/OpcUaSubscription.cs index 824e3f1d7d..e7d6f31d2f 100644 --- a/src/Azure.IIoT.OpcUa.Publisher/src/Stack/Services/OpcUaSubscription.cs +++ b/src/Azure.IIoT.OpcUa.Publisher/src/Stack/Services/OpcUaSubscription.cs @@ -2216,38 +2216,41 @@ internal record MetaDataLoaderArguments(TaskCompletionSource? tcs, private readonly OpcUaSubscription _subscription; } + private long TotalMonitoredItems => _additionallyMonitored.Count + MonitoredItemCount; + /// /// Create observable metrics /// public void InitializeMetrics() { _meter.CreateObservableCounter("iiot_edge_publisher_missing_keep_alives", - () => new Measurement(_missingKeepAlives, - _metrics.TagList), "Keep Alives", "Number of missing keep alives in subscription."); + () => new Measurement(_missingKeepAlives, _metrics.TagList), + description: "Number of missing keep alives in subscription."); _meter.CreateObservableCounter("iiot_edge_publisher_unassigned_notification_count", - () => new Measurement(_unassignedNotifications, - _metrics.TagList), "Notifications", "Number of notifications that could not be assigned."); + () => new Measurement(_unassignedNotifications, _metrics.TagList), + description: "Number of notifications that could not be assigned."); _meter.CreateObservableUpDownCounter("iiot_edge_publisher_good_nodes", - () => new Measurement(_goodMonitoredItems, - _metrics.TagList), "Monitored items", "Monitored items successfully created."); + () => new Measurement(_goodMonitoredItems, _metrics.TagList), + description: "Monitored items successfully created."); _meter.CreateObservableUpDownCounter("iiot_edge_publisher_bad_nodes", - () => new Measurement(_badMonitoredItems, - _metrics.TagList), "Monitored items", "Monitored items with errors."); + () => new Measurement(_badMonitoredItems, _metrics.TagList), + description: "Monitored items with errors."); _meter.CreateObservableUpDownCounter("iiot_edge_publisher_monitored_items", - () => new Measurement(_additionallyMonitored.Count + MonitoredItemCount, - _metrics.TagList), "Monitored items", "Monitored item count."); + () => new Measurement(TotalMonitoredItems, _metrics.TagList), + description: "Total monitored item count."); + _meter.CreateObservableUpDownCounter("iiot_edge_publisher_publish_requests_per_subscription", () => new Measurement(Ratio(State.OutstandingRequestCount, State.SubscriptionCount), - _metrics.TagList), "Requests per Subscription", "Good publish requests per subsciption."); + _metrics.TagList), description: "Good publish requests per subsciption."); _meter.CreateObservableUpDownCounter("iiot_edge_publisher_good_publish_requests_per_subscription", () => new Measurement(Ratio(State.GoodPublishRequestCount, State.SubscriptionCount), - _metrics.TagList), "Requests per Subscription", "Good publish requests per subsciption."); + _metrics.TagList), description: "Good publish requests per subsciption."); _meter.CreateObservableUpDownCounter("iiot_edge_publisher_bad_publish_requests_per_subscription", () => new Measurement(Ratio(State.BadPublishRequestCount, State.SubscriptionCount), - _metrics.TagList), "Requests per Subscription", "Bad publish requests per subsciption."); + _metrics.TagList), description: "Bad publish requests per subsciption."); _meter.CreateObservableUpDownCounter("iiot_edge_publisher_min_publish_requests_per_subscription", () => new Measurement(Ratio(State.MinPublishRequestCount, State.SubscriptionCount), - _metrics.TagList), "Requests per Subscription", "Min publish requests queued per subsciption."); + _metrics.TagList), description: "Min publish requests queued per subsciption."); static double Ratio(int value, int count) => count == 0 ? 0.0 : (double)value / count; }