Skip to main content

EventNotificationCounters

Struct EventNotificationCounters 

Source
pub struct EventNotificationCounters {
Show 15 fields pub notification_class_missing: u64, pub recipient_list_unavailable: u64, pub recipient_list_invalid: u64, pub recipient_list_too_long: u64, pub device_recipient_unbound: u64, pub recipient_unroutable: u64, pub confirmed_broadcast_recipient: u64, pub confirmed_no_invoke_id: u64, pub confirmed_rejected: u64, pub confirmed_unanswered: u64, pub unconfirmed_send_failed: u64, pub apdu_too_large: u64, pub received_not_forwarded: u64, pub forwarding_cap_dropped: u64, pub received_not_logged: u64,
}
Expand description

Lifetime totals of event notifications that were not delivered, each saturating at u64::MAX. A new server starts at zero, and the totals stay readable after stop(). Fields are sampled independently, not as one atomic aggregate. Each refusal also logs a warning (the forwarding cap’s at most once a minute); these totals are the running signal, not an audit log.

The first four count transitions (event or acknowledgment notifications) whose Notification Class lookup failed closed, so no recipient received them. A class whose list is empty, or whose destinations all filter the transition out by day, time or transition, is configured behaviour and is not counted. Neither are notifications held back by DeviceCommunicationControl or Event_Enable; DCC holds a confirmed one back at a retry too, ending it there uncounted.

The next three count destinations that matched the transition but were skipped while their route was resolved, once per destination: the rest of the transition’s destinations are still served. They are grouped by what fixes them: a Device recipient the server holds no current address for, a recipient that can never be routed as written, and a confirmed recipient at a broadcast or other group address. The warning logged with each skip names the finer reason.

The next three count confirmed notifications to one recipient that were never acknowledged.

The next one counts unconfirmed notifications whose send failed at the transport, once per destination. The transition’s other destinations are still served. There is no counter for a notification that fails to encode: the committed payload and message text are validated before the destinations are walked, so a well-formed transition always encodes, and the send loop only logs and skips if that invariant is ever broken.

The next three concern the Notification Forwarder objects (#1225): copies too large to send unsegmented, received notifications no forwarder took, and destinations past the cap on one notification’s copies (#1259).

The last one counts received notifications the Event Logs that collect them would have taken but for their source’s allowance (#1346).

Fields§

§notification_class_missing: u64

No Notification Class object has the class number the event object names.

§recipient_list_unavailable: u64

The class exists but reading its Recipient_List failed.

§recipient_list_invalid: u64

The class’s Recipient_List did not decode as a whole; no decodable prefix is routed.

§recipient_list_too_long: u64

The class serves more than MAX_RECIPIENT_LIST_DESTINATIONS destinations, which only a custom Notification Class object can do.

§device_recipient_unbound: u64

Device recipients skipped because the server has no current binding for them: none was configured or observed, or the observed one has expired, and looking for the device found none. Such a recipient’s notification waits in its device’s queue for the I-Am a targeted Who-Is asks for (#1368), behind any already waiting there; it counts here once when the device stays silent past the APDU timeout (a minute at most), or at once when no Who-Is may go out for it (within a minute of one that drew nothing, or with 256 devices already being looked for) or 1,024 notifications already wait. Both clear once the device’s I-Am is observed again or a binding is configured. A confirmed notification whose observed binding expires before a retry ends at that retry, its invoke ID freed, and counts here rather than in confirmed_unanswered (#1371).

§recipient_unroutable: u64

Recipients that cannot be routed as configured, so no binding or retry delivers them: a Device recipient whose identifier is not a Device object, or whose binding is unusable on this link, and an address that puts a MAC on the global broadcast network (65535), which names neither a broadcast nor one device.

§confirmed_broadcast_recipient: u64

Recipients configured for confirmed notifications at a broadcast address (local, remote or global, the link’s own broadcast MAC included), or at any other group address the link reports (TransportPort::is_group_destination, such as a B/IP multicast address, #1493). Clause 6.3 lets only unconfirmed requests be broadcast, and sending one unconfirmed would drop the acknowledgment the destination asks for. No invoke ID is reserved for them.

§confirmed_no_invoke_id: u64

Confirmed notifications not sent because no confirmed transaction could be reserved, normally because every invoke ID was in use. Reservations refused while the server stops are not counted.

§confirmed_rejected: u64

Confirmed notifications the recipient answered with an Error, Reject or Abort.

§confirmed_unanswered: u64

Confirmed notifications that drew no acknowledgment after the last retry, including attempts whose send failed locally.

§unconfirmed_send_failed: u64

Unconfirmed notifications the transport refused to send, one per destination: a unicast, a broadcast or a routed send that returned an error. Nothing is retried. Confirmed sends that fail locally count in confirmed_unanswered instead.

§apdu_too_large: u64

Notifications not sent to one destination because their APDU is longer than the local APDU capacity; notifications are never sent segmented. A forwarded copy of a notification that arrived segmented is the usual case. The other destinations are still served.

§received_not_forwarded: u64

Received ConfirmedEventNotification and UnconfirmedEventNotification requests that decoded but that no Notification Forwarder object took. A confirmed one is still acknowledged. One sent by global broadcast, which forwarders ignore, and a retransmitted confirmed one, which is acknowledged without being offered to them again, are not counted.

§forwarding_cap_dropped: u64

Destinations a notification was not forwarded to because it already had MAX_FORWARDED_DESTINATIONS copies on their way across this device’s forwarders, one per destination dropped. Only copies that would be sent take room, so a destination the loop rules refuse is neither counted here nor against the cap. Destinations go in forwarder order, then list order, so the ones dropped are the last. A capped notification logs a warning at most once a minute, process-wide, and at debug level otherwise.

§received_not_logged: u64

Received ConfirmedEventNotification and UnconfirmedEventNotification requests not logged because their source had used its allowance of RECEIVED_EVENT_LOG_RATE records in the current second, one per notification whatever the number of logs. Notifications no Event Log collects are not counted.

Trait Implementations§

Source§

impl Clone for EventNotificationCounters

Source§

fn clone(&self) -> Self

Returns a duplicate of the value. Read more
1.0.0 (const: unstable) · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Copy for EventNotificationCounters

Source§

impl Debug for EventNotificationCounters

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for EventNotificationCounters

Source§

fn default() -> Self

Returns the “default value” for a type. Read more
Source§

impl Eq for EventNotificationCounters

Source§

impl PartialEq for EventNotificationCounters

Source§

fn eq(&self, other: &Self) -> bool

Equality operator ==. Read more
1.0.0 (const: unstable) · Source§

fn ne(&self, other: &Rhs) -> bool

Inequality operator !=. Read more
Source§

impl StructuralPartialEq for EventNotificationCounters

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<'a, T, E> AsTaggedExplicit<'a, E> for T
where T: 'a,

Source§

fn explicit(self, class: Class, tag: u32) -> TaggedParser<'a, Explicit, Self, E>

Source§

impl<'a, T, E> AsTaggedImplicit<'a, E> for T
where T: 'a,

Source§

fn implicit( self, class: Class, constructed: bool, tag: u32, ) -> TaggedParser<'a, Implicit, Self, E>

Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
where ST: ?Sized, DT: ?Sized,

Source§

impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
where ST: ?Sized, DT: ?Sized,

Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self> ⓘ

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self> ⓘ

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> Read<Exclusive, BecauseExclusive> for T
where T: ?Sized,

Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = !

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, !>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

Source§

fn vzip(self) -> V

Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self> ⓘ
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self> ⓘ

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more