use opcua_types::{DataValue, ServerDiagnosticsSummaryDataType, VariableId};
use super::LocalValue;
#[derive(Default)]
pub struct ServerDiagnostics {
pub summary: ServerDiagnosticsSummary,
pub enabled: bool,
}
impl ServerDiagnostics {
pub fn is_mapped(&self, variable_id: VariableId) -> bool {
self.enabled && self.summary.is_mapped(variable_id)
}
pub fn get(&self, variable_id: VariableId) -> Option<DataValue> {
self.summary.get(variable_id)
}
pub fn set_current_session_count(&self, count: u32) {
if self.enabled {
self.summary.current_session_count.set(count);
}
}
pub fn set_current_subscription_count(&self, count: u32) {
if self.enabled {
self.summary.current_subscription_count.set(count);
}
}
pub fn inc_session_count(&self) {
if self.enabled {
self.summary.cumulated_session_count.increment();
}
}
pub fn inc_subscription_count(&self) {
if self.enabled {
self.summary.cumulated_subscription_count.increment();
}
}
pub fn inc_rejected_requests(&self) {
if self.enabled {
self.summary.rejected_requests_count.increment();
}
}
pub fn inc_security_rejected_requests(&self) {
if self.enabled {
self.summary.security_rejected_requests_count.increment();
}
}
pub fn inc_security_rejected_session_count(&self) {
if self.enabled {
self.summary.security_rejected_session_count.increment();
}
}
pub fn set_server_view_count(&self, count: u32) {
if self.enabled {
self.summary.server_view_count.set(count);
}
}
pub fn inc_session_abort_count(&self) {
if self.enabled {
self.summary.session_abort_count.increment();
}
}
pub fn inc_session_timeout_count(&self) {
if self.enabled {
self.summary.session_timeout_count.increment();
}
}
pub fn set_publishing_interval_count(&self, count: u32) {
if self.enabled {
self.summary.publishing_interval_count.set(count);
}
}
}
#[derive(Default)]
pub struct ServerDiagnosticsSummary {
cumulated_session_count: LocalValue<u32>,
cumulated_subscription_count: LocalValue<u32>,
current_session_count: LocalValue<u32>,
current_subscription_count: LocalValue<u32>,
publishing_interval_count: LocalValue<u32>,
rejected_requests_count: LocalValue<u32>,
rejected_session_count: LocalValue<u32>,
security_rejected_requests_count: LocalValue<u32>,
security_rejected_session_count: LocalValue<u32>,
server_view_count: LocalValue<u32>,
session_abort_count: LocalValue<u32>,
session_timeout_count: LocalValue<u32>,
}
impl ServerDiagnosticsSummary {
pub fn is_mapped(&self, variable_id: VariableId) -> bool {
matches!(variable_id,
VariableId::Server_ServerDiagnostics_ServerDiagnosticsSummary_ServerViewCount
| VariableId::Server_ServerDiagnostics_ServerDiagnosticsSummary_CurrentSessionCount
| VariableId::Server_ServerDiagnostics_ServerDiagnosticsSummary_CumulatedSessionCount
| VariableId::Server_ServerDiagnostics_ServerDiagnosticsSummary_SecurityRejectedSessionCount
| VariableId::Server_ServerDiagnostics_ServerDiagnosticsSummary_RejectedSessionCount
| VariableId::Server_ServerDiagnostics_ServerDiagnosticsSummary_SessionTimeoutCount
| VariableId::Server_ServerDiagnostics_ServerDiagnosticsSummary_SessionAbortCount
| VariableId::Server_ServerDiagnostics_ServerDiagnosticsSummary_CurrentSubscriptionCount
| VariableId::Server_ServerDiagnostics_ServerDiagnosticsSummary_CumulatedSubscriptionCount
| VariableId::Server_ServerDiagnostics_ServerDiagnosticsSummary_PublishingIntervalCount
| VariableId::Server_ServerDiagnostics_ServerDiagnosticsSummary_SecurityRejectedRequestsCount
| VariableId::Server_ServerDiagnostics_ServerDiagnosticsSummary_RejectedRequestsCount
| VariableId::Server_ServerDiagnostics_ServerDiagnosticsSummary
)
}
pub fn get(&self, variable_id: VariableId) -> Option<DataValue> {
match variable_id {
VariableId::Server_ServerDiagnostics_ServerDiagnosticsSummary_ServerViewCount => Some(self.server_view_count.sample()),
VariableId::Server_ServerDiagnostics_ServerDiagnosticsSummary_CurrentSessionCount => Some(self.current_session_count.sample()),
VariableId::Server_ServerDiagnostics_ServerDiagnosticsSummary_CumulatedSessionCount => Some(self.cumulated_session_count.sample()),
VariableId::Server_ServerDiagnostics_ServerDiagnosticsSummary_SecurityRejectedSessionCount => Some(self.security_rejected_session_count.sample()),
VariableId::Server_ServerDiagnostics_ServerDiagnosticsSummary_RejectedSessionCount => Some(self.rejected_session_count.sample()),
VariableId::Server_ServerDiagnostics_ServerDiagnosticsSummary_SessionTimeoutCount => Some(self.session_timeout_count.sample()),
VariableId::Server_ServerDiagnostics_ServerDiagnosticsSummary_SessionAbortCount => Some(self.session_abort_count.sample()),
VariableId::Server_ServerDiagnostics_ServerDiagnosticsSummary_CurrentSubscriptionCount => Some(self.current_subscription_count.sample()),
VariableId::Server_ServerDiagnostics_ServerDiagnosticsSummary_CumulatedSubscriptionCount => Some(self.cumulated_subscription_count.sample()),
VariableId::Server_ServerDiagnostics_ServerDiagnosticsSummary_PublishingIntervalCount => Some(self.publishing_interval_count.sample()),
VariableId::Server_ServerDiagnostics_ServerDiagnosticsSummary_SecurityRejectedRequestsCount => Some(self.security_rejected_requests_count.sample()),
VariableId::Server_ServerDiagnostics_ServerDiagnosticsSummary_RejectedRequestsCount => Some(self.rejected_requests_count.sample()),
VariableId::Server_ServerDiagnostics_ServerDiagnosticsSummary => Some(self.sample()),
_ => None,
}
}
pub fn sample(&self) -> DataValue {
let values = [
self.server_view_count.get_with_time(),
self.current_session_count.get_with_time(),
self.cumulated_session_count.get_with_time(),
self.security_rejected_session_count.get_with_time(),
self.rejected_session_count.get_with_time(),
self.session_timeout_count.get_with_time(),
self.session_abort_count.get_with_time(),
self.current_subscription_count.get_with_time(),
self.cumulated_subscription_count.get_with_time(),
self.publishing_interval_count.get_with_time(),
self.security_rejected_requests_count.get_with_time(),
self.rejected_requests_count.get_with_time(),
];
let ts = values.iter().map(|v| v.1).max().unwrap();
DataValue::new_at(
ServerDiagnosticsSummaryDataType {
server_view_count: values[0].0,
current_session_count: values[1].0,
cumulated_session_count: values[2].0,
security_rejected_session_count: values[3].0,
rejected_session_count: values[4].0,
session_timeout_count: values[5].0,
session_abort_count: values[6].0,
current_subscription_count: values[7].0,
cumulated_subscription_count: values[8].0,
publishing_interval_count: values[9].0,
security_rejected_requests_count: values[10].0,
rejected_requests_count: values[11].0,
},
ts,
)
}
}