use std::sync::{Arc, OnceLock};
use zerodds_monitor::{Counter, Labels, default_registry, metric_names};
struct RtpsCounters {
heartbeats_sent: Arc<Counter>,
acknacks_received: Arc<Counter>,
retransmits: Arc<Counter>,
fragmented_samples: Arc<Counter>,
samples_dropped: Arc<Counter>,
unknown_submessages: Arc<Counter>,
}
fn counters() -> &'static RtpsCounters {
static C: OnceLock<RtpsCounters> = OnceLock::new();
C.get_or_init(|| {
let r = default_registry();
r.set_help(
metric_names::DDS_RTPS_HEARTBEATS_SENT_TOTAL,
"Heartbeats gesendet (zerodds-monitor-1.0 §2.2)",
);
r.set_help(
metric_names::DDS_RTPS_ACKNACKS_RECEIVED_TOTAL,
"Acknacks empfangen (zerodds-monitor-1.0 §2.2)",
);
r.set_help(
metric_names::DDS_RTPS_RETRANSMITS_TOTAL,
"Retransmissions (zerodds-monitor-1.0 §2.2)",
);
r.set_help(
metric_names::DDS_RTPS_FRAGMENTED_SAMPLES_TOTAL,
"Fragmentierte Samples (zerodds-monitor-1.0 §2.2)",
);
r.set_help(
metric_names::DDS_RTPS_SAMPLES_DROPPED_TOTAL,
"Samples gedropped (zerodds-monitor-1.0 §2.2)",
);
r.set_help(
metric_names::DDS_RTPS_UNKNOWN_SUBMESSAGES_TOTAL,
"Unbekannte Submessage-Kinds (zerodds-monitor-1.0 §2.2)",
);
let writer = || Labels::new().with("writer_kind", "reliable");
RtpsCounters {
heartbeats_sent: r.counter(metric_names::DDS_RTPS_HEARTBEATS_SENT_TOTAL, writer()),
acknacks_received: r.counter(metric_names::DDS_RTPS_ACKNACKS_RECEIVED_TOTAL, writer()),
retransmits: r.counter(metric_names::DDS_RTPS_RETRANSMITS_TOTAL, writer()),
fragmented_samples: r
.counter(metric_names::DDS_RTPS_FRAGMENTED_SAMPLES_TOTAL, writer()),
samples_dropped: r.counter(
metric_names::DDS_RTPS_SAMPLES_DROPPED_TOTAL,
Labels::new()
.with("writer_kind", "reliable")
.with("reason", "history_limit"),
),
unknown_submessages: r.counter(
metric_names::DDS_RTPS_UNKNOWN_SUBMESSAGES_TOTAL,
Labels::new().with("vendor_id", "unknown"),
),
}
})
}
pub fn inc_heartbeat_sent() {
counters().heartbeats_sent.inc();
}
pub fn inc_acknack_received() {
counters().acknacks_received.inc();
}
pub fn inc_retransmit() {
counters().retransmits.inc();
}
pub fn inc_fragmented_sample() {
counters().fragmented_samples.inc();
}
pub fn inc_sample_dropped() {
counters().samples_dropped.inc();
}
pub fn inc_unknown_submessage() {
counters().unknown_submessages.inc();
}