in src/Azure.IIoT.OpcUa.Publisher/src/Stack/Services/OpcUaSession.cs [711:923]
private async Task<SessionDiagnosticsModel?> FetchServerDiagnosticAsync(RequestHeader header,
CancellationToken ct)
{
if (_diagnosticsEnabled == false)
{
return null;
}
if (!_diagnosticsEnabled.HasValue)
{
// Check whether enabled and if not enabled enable it
var diagnosticsEnabled = await ReadValueAsync(
VariableIds.Server_ServerDiagnostics_EnabledFlag, ct).ConfigureAwait(false);
_diagnosticsEnabled = diagnosticsEnabled.Value as bool?;
if (_diagnosticsEnabled == false)
{
var enableResponse = await WriteAsync(header, new[]
{
new WriteValue
{
AttributeId = Attributes.Value,
NodeId = VariableIds.Server_ServerDiagnostics_EnabledFlag,
Value = new DataValue(true)
}
}, ct).ConfigureAwait(false);
if (ServiceResult.IsBad(enableResponse.Results[0]))
{
_logger.LogError("Session diagnostics disabled and failed to enable ({Error}).",
enableResponse.Results[0]);
return null;
}
_diagnosticsEnabled = true;
}
}
var response = await ReadAsync(header, 0.0, Opc.Ua.TimestampsToReturn.Neither, new[]
{
new ReadValueId
{
AttributeId = Attributes.Value,
NodeId =
VariableIds.Server_ServerDiagnostics_SessionsDiagnosticsSummary_SessionDiagnosticsArray
},
new ReadValueId
{
AttributeId = Attributes.Value,
NodeId = VariableIds.Server_ServerDiagnostics_SubscriptionDiagnosticsArray
}
}, ct).ConfigureAwait(false);
if (ServiceResult.IsBad(response.Results[0].StatusCode))
{
_logger.LogInformation("Session diagnostics not retrievable ({Error1}/{Error2}).",
response.Results[0].StatusCode, response.Results[1].StatusCode);
return null;
}
var sessionDiagnosticsArray = response.Results[0].Value as ExtensionObject[];
var sessionDiagnostics = sessionDiagnosticsArray?
.Select(o => o.Body)
.OfType<SessionDiagnosticsDataType>()
.FirstOrDefault(d => d.SessionId == SessionId);
if (sessionDiagnostics == null)
{
_logger.LogError("Failed to find diagnostics for this session ({Error}).",
response.Results[0].StatusCode);
return null;
}
List<SubscriptionDiagnosticsModel>? subscriptions = null;
if (!ServiceResult.IsBad(response.Results[1].StatusCode) &&
response.Results[1].Value is ExtensionObject[] subscriptionDiagnosticsArray)
{
subscriptions = subscriptionDiagnosticsArray
.Select(o => o.Body)
.OfType<SubscriptionDiagnosticsDataType>()
.Where(d => d.SessionId == SessionId)
.Select(diag => new SubscriptionDiagnosticsModel
{
SubscriptionId = diag.SubscriptionId,
Priority = diag.Priority,
PublishingInterval = diag.PublishingInterval,
MaxKeepAliveCount = diag.MaxKeepAliveCount,
MaxLifetimeCount = diag.MaxLifetimeCount,
MaxNotificationsPerPublish = diag.MaxNotificationsPerPublish,
PublishingEnabled = diag.PublishingEnabled,
ModifyCount = diag.ModifyCount,
EnableCount = diag.EnableCount,
DisableCount = diag.DisableCount,
RepublishRequestCount = diag.RepublishRequestCount,
RepublishMessageRequestCount = diag.RepublishMessageRequestCount,
RepublishMessageCount = diag.RepublishMessageCount,
TransferRequestCount = diag.TransferRequestCount,
TransferredToAltClientCount = diag.TransferredToAltClientCount,
TransferredToSameClientCount = diag.TransferredToSameClientCount,
PublishRequestCount = diag.PublishRequestCount,
DataChangeNotificationsCount = diag.DataChangeNotificationsCount,
EventNotificationsCount = diag.EventNotificationsCount,
NotificationsCount = diag.NotificationsCount,
LatePublishRequestCount = diag.LatePublishRequestCount,
CurrentKeepAliveCount = diag.CurrentKeepAliveCount,
CurrentLifetimeCount = diag.CurrentLifetimeCount,
UnacknowledgedMessageCount = diag.UnacknowledgedMessageCount,
DiscardedMessageCount = diag.DiscardedMessageCount,
MonitoredItemCount = diag.MonitoredItemCount,
DisabledMonitoredItemCount = diag.DisabledMonitoredItemCount,
MonitoringQueueOverflowCount = diag.MonitoringQueueOverflowCount,
NextSequenceNumber = diag.NextSequenceNumber,
EventQueueOverFlowCount = diag.EventQueueOverFlowCount
})
.ToList();
}
else
{
_logger.LogInformation("Subscription diagnostics not retrievable ({Error}).",
response.Results[1].StatusCode);
}
return new SessionDiagnosticsModel
{
SessionId =
sessionDiagnostics.SessionId.AsString(MessageContext, NamespaceFormat.Expanded),
TranslateBrowsePathsToNodeIdsCount =
ToCounter(sessionDiagnostics.TranslateBrowsePathsToNodeIdsCount),
AddNodesCount =
ToCounter(sessionDiagnostics.AddNodesCount),
AddReferencesCount =
ToCounter(sessionDiagnostics.AddReferencesCount),
BrowseCount =
ToCounter(sessionDiagnostics.BrowseCount),
BrowseNextCount =
ToCounter(sessionDiagnostics.BrowseNextCount),
CreateMonitoredItemsCount =
ToCounter(sessionDiagnostics.CreateMonitoredItemsCount),
CreateSubscriptionCount =
ToCounter(sessionDiagnostics.CreateSubscriptionCount),
DeleteMonitoredItemsCount =
ToCounter(sessionDiagnostics.DeleteMonitoredItemsCount),
DeleteNodesCount =
ToCounter(sessionDiagnostics.DeleteNodesCount),
DeleteReferencesCount =
ToCounter(sessionDiagnostics.DeleteReferencesCount),
DeleteSubscriptionsCount =
ToCounter(sessionDiagnostics.DeleteSubscriptionsCount),
CallCount =
ToCounter(sessionDiagnostics.CallCount),
HistoryReadCount =
ToCounter(sessionDiagnostics.HistoryReadCount),
HistoryUpdateCount =
ToCounter(sessionDiagnostics.HistoryUpdateCount),
ModifyMonitoredItemsCount =
ToCounter(sessionDiagnostics.ModifyMonitoredItemsCount),
ModifySubscriptionCount =
ToCounter(sessionDiagnostics.ModifySubscriptionCount),
PublishCount =
ToCounter(sessionDiagnostics.PublishCount),
RegisterNodesCount =
ToCounter(sessionDiagnostics.RegisterNodesCount),
RepublishCount =
ToCounter(sessionDiagnostics.RepublishCount),
SetMonitoringModeCount =
ToCounter(sessionDiagnostics.SetMonitoringModeCount),
SetPublishingModeCount =
ToCounter(sessionDiagnostics.SetPublishingModeCount),
UnregisterNodesCount =
ToCounter(sessionDiagnostics.UnregisterNodesCount),
QueryFirstCount =
ToCounter(sessionDiagnostics.QueryFirstCount),
QueryNextCount =
ToCounter(sessionDiagnostics.QueryNextCount),
ReadCount =
ToCounter(sessionDiagnostics.ReadCount),
WriteCount =
ToCounter(sessionDiagnostics.WriteCount),
SetTriggeringCount =
ToCounter(sessionDiagnostics.SetTriggeringCount),
TotalRequestCount =
ToCounter(sessionDiagnostics.TotalRequestCount),
TransferSubscriptionsCount =
ToCounter(sessionDiagnostics.TransferSubscriptionsCount),
ServerUri =
sessionDiagnostics.ServerUri,
SessionName =
sessionDiagnostics.SessionName,
ActualSessionTimeout =
sessionDiagnostics.ActualSessionTimeout,
MaxResponseMessageSize =
sessionDiagnostics.MaxResponseMessageSize,
UnauthorizedRequestCount =
sessionDiagnostics.UnauthorizedRequestCount,
ConnectTime =
sessionDiagnostics.ClientConnectionTime,
LastContactTime =
sessionDiagnostics.ClientLastContactTime,
CurrentSubscriptionsCount =
sessionDiagnostics.CurrentSubscriptionsCount,
CurrentMonitoredItemsCount =
sessionDiagnostics.CurrentMonitoredItemsCount,
CurrentPublishRequestsInQueue =
sessionDiagnostics.CurrentPublishRequestsInQueue,
Subscriptions =
subscriptions
};
static ServiceCounterModel? ToCounter(ServiceCounterDataType counter)
{
if (counter.TotalCount == 0 && counter.ErrorCount == 0)
{
return null;
}
return new ServiceCounterModel
{
TotalCount = counter.TotalCount,
ErrorCount = counter.ErrorCount
};
}
}