metrics/
queue.rs

1// Copyright 2019 Conflux Foundation. All rights reserved.
2// Conflux is free software and distributed under GNU General Public License.
3// See http://www.gnu.org/licenses/
4
5use 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}