# -*- coding: utf-8 -*-
#
# This file is part of the SKA PST project.
#
# Distributed under the terms of the BSD 3-clause new license.
# See LICENSE for more info.
"""Module for providing common model classes within the RECV.MGMT component."""
from __future__ import annotations
from dataclasses import dataclass
from ska_pst.lmc.component.monitor_data_handler import MonitorDataStore
[docs]@dataclass
class ReceiveData:
"""
A data class to represent RECV monitoring across all subbands.
This class is used to model the combined subband data RECV subcomponent.
"""
data_received: int = 0
"""The amount of data received during current scan, in bytes."""
data_receive_rate: float = 0.0
"""The rate of data received during current scan, in Gb/s."""
data_dropped: int = 0
"""The amount of data dropped during current scan, in bytes."""
data_drop_rate: float = 0.0
"""The rate of data dropped during current scan, in bytes/s."""
misordered_packets: int = 0
"""The number of misordered packets received during current scan."""
misordered_packet_rate: float = 0.0
"""The current rate of misordered packets, in packets/s."""
malformed_packets: int = 0
"""The total number of malformed packets received during current scan."""
malformed_packet_rate: float = 0.0
"""The current rate of malformed packets, in packets/s."""
misdirected_packets: int = 0
"""
The total of misdirected packets for current scan.
These are valid packets but not for the current beam, subband, and/or scan.
"""
misdirected_packet_rate: float = 0.0
"""The current rate of misdirected packets, in packets/s."""
checksum_failure_packets: int = 0
"""The total number of network interface with either a UDP, IP header or CRC checksum failure."""
checksum_failure_packet_rate: float = 0.0
"""The current rate of packets with a checksum failure, in packets/s."""
timestamp_sync_error_packets: int = 0
"""The total number of packets received where the timestamp has become desynchronised
with the packet sequence number * sampling interval."""
timestamp_sync_error_packet_rate: float = 0.0
"""The current rate of packets with timestamp sync error, in packets/s."""
seq_number_sync_error_packets: int = 0
"""The total number of packets received where the packet sequence number has become
desynchronised with the data rate and elapsed time."""
seq_number_sync_error_packet_rate: float = 0.0
"""The current rate of packets with a sequence number sync error, in packets/s."""
invalid_polarisation_correction_packets: int = 0
"""The number of packets received where no valid Jones polarisation corrections have been applied."""
invalid_polarisation_correction_packet_rate: float = 0.0
"""The current rate of packets with a sequence number sync error, in packets/s."""
invalid_station_beam_packets: int = 0
"""The number of packets received where no valid station beam delay polynomials have been applied."""
invalid_station_beam_packet_rate: float = 0.0
"""The number of packets received per second where no valid Jones polarisation corrections have been
applied, in packets/s."""
invalid_pst_beam_packets: int = 0
"""The number of packets received where no valid PST beam delay polynomials have been applied."""
invalid_pst_beam_packet_rate: float = 0.0
"""The number of packets received per second where no valid PST beam delay polynomials have been
applied, in packets/s."""
percentage_data_received: float = 0.0
"""The current amount of CBF data received as a percentage of the total CBF data expected."""
percentage_valid_station_beam: float = 0.0
"""The percentage of CBF data received that has validity flag set for station beam delay polynomials."""
percentage_valid_pst_beam: float = 0.0
"""The percentage of CBF data received that has validity flag set for pst beam delay polynomials."""
percentage_valid_polarisation_correction: float = 0.0
"""The percentage of CBF data received that has validity flag set for Jones polarisation corrections."""
class ReceiveDataStore(MonitorDataStore[ReceiveData, ReceiveData]):
"""Data store used to aggregate the subband monitoring data for Receive."""
@property
def monitor_data(self: ReceiveDataStore) -> ReceiveData:
"""
Return the current calculated monitoring data.
This aggregates all the individual subband data values into one
:py:class:`ReceiveData` instance.
:returns: current monitoring data.
"""
number_subbands: int = len(self._subband_data)
if number_subbands == 0:
return ReceiveData()
monitor_data = ReceiveData()
for subband_monitor_data in self._subband_data.values():
monitor_data.data_received += subband_monitor_data.data_received
monitor_data.data_receive_rate += subband_monitor_data.data_receive_rate
monitor_data.data_dropped += subband_monitor_data.data_dropped
monitor_data.data_drop_rate += subband_monitor_data.data_drop_rate
monitor_data.misordered_packets += subband_monitor_data.misordered_packets
monitor_data.misordered_packet_rate += subband_monitor_data.misordered_packet_rate
monitor_data.malformed_packets += subband_monitor_data.malformed_packets
monitor_data.malformed_packet_rate += subband_monitor_data.malformed_packet_rate
monitor_data.misdirected_packets += subband_monitor_data.misdirected_packets
monitor_data.misdirected_packet_rate += subband_monitor_data.misdirected_packet_rate
monitor_data.invalid_polarisation_correction_packets += (
subband_monitor_data.invalid_polarisation_correction_packets
)
monitor_data.invalid_polarisation_correction_packet_rate += (
subband_monitor_data.invalid_polarisation_correction_packet_rate
)
monitor_data.invalid_station_beam_packets += subband_monitor_data.invalid_station_beam_packets
monitor_data.invalid_station_beam_packet_rate += (
subband_monitor_data.invalid_station_beam_packet_rate
)
monitor_data.invalid_pst_beam_packets += subband_monitor_data.invalid_pst_beam_packets
monitor_data.invalid_pst_beam_packet_rate += subband_monitor_data.invalid_pst_beam_packet_rate
monitor_data.percentage_data_received += subband_monitor_data.percentage_data_received
monitor_data.percentage_valid_station_beam += subband_monitor_data.percentage_valid_station_beam
monitor_data.percentage_valid_pst_beam += subband_monitor_data.percentage_valid_pst_beam
monitor_data.percentage_valid_polarisation_correction += (
subband_monitor_data.percentage_valid_polarisation_correction
)
# assume that sub-bands contain a roughly equal workload
monitor_data.percentage_data_received /= number_subbands
monitor_data.percentage_valid_station_beam /= number_subbands
monitor_data.percentage_valid_pst_beam /= number_subbands
monitor_data.percentage_valid_polarisation_correction /= number_subbands
return monitor_data