1use crate::{
6 metrics::is_enabled, register_meter_with_group, Counter, CounterUsize,
7 Meter,
8};
9use std::sync::Arc;
10
11pub trait Queue: Send + Sync {
12 fn enqueue(&self, _n: usize) {}
13 fn dequeue(&self, _n: usize) {}
14}
15
16fn register_queue_with_name(
17 group_name: &str, enq_name: &str, deq_name: &str, queued_name: &str,
18) -> Arc<dyn Queue> {
19 if !is_enabled() {
20 return Arc::new(Noop);
21 }
22
23 Arc::new(Standard {
24 enqueue_tps: register_meter_with_group(group_name, enq_name),
25 dequeue_tps: register_meter_with_group(group_name, deq_name),
26 queued: CounterUsize::register_with_group(group_name, queued_name),
27 })
28}
29
30pub fn register_queue(name: &str) -> Arc<dyn Queue> {
31 register_queue_with_name(name, "enq_tps", "deq_tps", "queued")
32}
33
34pub fn register_queue_with_group(group: &str, name: &str) -> Arc<dyn Queue> {
35 register_queue_with_name(
36 group,
37 format!("{}_enq_tps", name).as_str(),
38 format!("{}_deq_tps", name).as_str(),
39 format!("{}_queued", name).as_str(),
40 )
41}
42
43struct Noop;
44impl Queue for Noop {}
45
46struct Standard {
47 enqueue_tps: Arc<dyn Meter>,
48 dequeue_tps: Arc<dyn Meter>,
49 queued: Arc<dyn Counter<usize>>,
50}
51
52impl Queue for Standard {
53 fn enqueue(&self, n: usize) {
54 self.enqueue_tps.mark(n);
55 self.queued.inc(n);
56 }
57
58 fn dequeue(&self, n: usize) {
59 self.dequeue_tps.mark(n);
60 self.queued.dec(n);
61 }
62}