plumcast/
metrics.rs

1//! [Prometheus][prometheus] metrics.
2//!
3//! Note that you can also use [fibers_rpc's metrics] in addition to the metrics defined in this module.
4//!
5//! [prometheus]: https://prometheus.io/
6//! [fibers_rpc's metrics]: https://docs.rs/fibers_rpc/0.2/fibers_rpc/metrics/index.html
7use prometrics::metrics::{Counter, MetricBuilder};
8
9/// Metrics of a [`Service`].
10///
11/// [`Service`]: ../service/struct.Service.html
12#[derive(Debug, Clone)]
13pub struct ServiceMetrics {
14    pub(crate) registered_nodes: Counter,
15    pub(crate) deregistered_nodes: Counter,
16    pub(crate) destination_unknown_messages: Counter,
17}
18impl ServiceMetrics {
19    /// Metric: `plumcast_service_registered_nodes_total <COUNTER>`
20    pub fn registered_nodes(&self) -> u64 {
21        self.registered_nodes.value() as u64
22    }
23
24    /// Metric: `plumcast_service_deregistered_nodes_total <COUNTER>`
25    pub fn deregistered_nodes(&self) -> u64 {
26        self.deregistered_nodes.value() as u64
27    }
28
29    /// Metric: `plumcast_service_destination_unknown_messages_total <COUNTER>`
30    pub fn destination_unknown_messages(&self) -> u64 {
31        self.destination_unknown_messages.value() as u64
32    }
33
34    pub(crate) fn new(mut builder: MetricBuilder) -> Self {
35        builder.namespace("plumcast").subsystem("service");
36        ServiceMetrics {
37            registered_nodes: builder
38                .counter("registered_nodes_total")
39                .help("Number of nodes registered so far")
40                .finish()
41                .expect("Never fails"),
42            deregistered_nodes: builder
43                .counter("deregistered_nodes_total")
44                .help("Number of nodes deregistered so far")
45                .finish()
46                .expect("Never fails"),
47            destination_unknown_messages: builder
48                .counter("destination_unknown_messages_total")
49                .help("Number of RPC messages received but the destination node is missing")
50                .finish()
51                .expect("Never fails"),
52        }
53    }
54}
55
56/// Metrics of a [`Node`].
57///
58/// [`Node`]: ../node/struct.Node.html
59#[derive(Debug, Clone)]
60pub struct NodeMetrics {
61    pub(crate) broadcasted_messages: Counter,
62    pub(crate) forgot_messages: Counter,
63    pub(crate) delivered_messages: Counter,
64    pub(crate) connected_neighbors: Counter,
65    pub(crate) disconnected_neighbors: Counter,
66    pub(crate) isolated_times: Counter,
67    pub(crate) deisolated_times: Counter,
68    pub(crate) forget_unknown_message_errors: Counter,
69    pub(crate) cannot_send_hyparview_message_errors: Counter,
70    pub(crate) cannot_send_plumtree_message_errors: Counter,
71    pub(crate) unknown_plumtree_node_errors: Counter,
72}
73impl NodeMetrics {
74    /// Metric: `plumcast_node_broadcasted_messages_total <COUNTER>`
75    pub fn broadcasted_messages(&self) -> u64 {
76        self.broadcasted_messages.value() as u64
77    }
78
79    /// Metric: `plumcast_node_forgot_messages_total <COUNTER>`
80    pub fn forgot_messages(&self) -> u64 {
81        self.forgot_messages.value() as u64
82    }
83
84    /// Metric: `plumcast_node_delivered_messages_total <COUNTER>`
85    pub fn delivered_messages(&self) -> u64 {
86        self.delivered_messages.value() as u64
87    }
88
89    /// Metric: `plumcast_node_connected_neighbors_total <COUNTER>`
90    pub fn connected_neighbors(&self) -> u64 {
91        self.connected_neighbors.value() as u64
92    }
93
94    /// Metric: `plumcast_node_disconnected_neighbors_total <COUNTER>`
95    pub fn disconnected_neighbors(&self) -> u64 {
96        self.disconnected_neighbors.value() as u64
97    }
98
99    /// Metric: `plumcast_node_isolated_times_total <COUNTER>`
100    pub fn isolated_times(&self) -> u64 {
101        self.isolated_times.value() as u64
102    }
103
104    /// Metric: `plumcast_node_deisolated_times_total <COUNTER>`
105    pub fn deisolated_times(&self) -> u64 {
106        self.deisolated_times.value() as u64
107    }
108
109    /// Metric: `plumcast_node_errors_total { kind="forget_unknown_message" } <COUNTER>`
110    pub fn forget_unknown_message_errors(&self) -> u64 {
111        self.forget_unknown_message_errors.value() as u64
112    }
113
114    /// Metric: `plumcast_node_errors_total { kind="cannot_send_hyparview_message" } <COUNTER>`
115    pub fn cannot_send_hyparview_message_errors(&self) -> u64 {
116        self.cannot_send_hyparview_message_errors.value() as u64
117    }
118
119    /// Metric: `plumcast_node_errors_total { kind="cannot_send_plumtree_message" } <COUNTER>`
120    pub fn cannot_send_plumtree_message_errors(&self) -> u64 {
121        self.cannot_send_plumtree_message_errors.value() as u64
122    }
123
124    /// Metric: `plumcast_node_errors_total { kind="unknown_plumtree_node" } <COUNTER>`
125    pub fn unknown_plumtree_node_errors(&self) -> u64 {
126        self.unknown_plumtree_node_errors.value() as u64
127    }
128
129    pub(crate) fn new(mut builder: MetricBuilder) -> Self {
130        builder.namespace("plumcast").subsystem("node");
131        NodeMetrics {
132            broadcasted_messages: builder
133                .counter("broadcasted_messages_total")
134                .help("Number of messages broadcasted so far")
135                .finish()
136                .expect("Never fails"),
137            forgot_messages: builder
138                .counter("forgot_messages_total")
139                .help("Number of messages forgot so far")
140                .finish()
141                .expect("Never fails"),
142            delivered_messages: builder
143                .counter("delivered_messages_total")
144                .help("Number of messages delivered so far")
145                .finish()
146                .expect("Never fails"),
147            connected_neighbors: builder
148                .counter("connected_neighbors_total")
149                .help("Number of neighbors connected so far")
150                .finish()
151                .expect("Never fails"),
152            disconnected_neighbors: builder
153                .counter("disconnected_neighbors_total")
154                .help("Number of neighbors disconnected so far")
155                .finish()
156                .expect("Never fails"),
157            isolated_times: builder
158                .counter("isolated_times_total")
159                .help("Number of times the node was isolated so far")
160                .finish()
161                .expect("Never fails"),
162            deisolated_times: builder
163                .counter("deisolated_times_total")
164                .help("Number of times the node was de-isolated so far")
165                .finish()
166                .expect("Never fails"),
167            forget_unknown_message_errors: builder
168                .counter("errors_total")
169                .help("Number of errors happened so far")
170                .label("kind", "forget_unknown_message")
171                .finish()
172                .expect("Never fails"),
173            cannot_send_hyparview_message_errors: builder
174                .counter("errors_total")
175                .help("Number of errors happened so far")
176                .label("kind", "cannot_send_hyparview_message")
177                .finish()
178                .expect("Never fails"),
179            cannot_send_plumtree_message_errors: builder
180                .counter("errors_total")
181                .help("Number of errors happened so far")
182                .label("kind", "cannot_send_plumtree_message")
183                .finish()
184                .expect("Never fails"),
185            unknown_plumtree_node_errors: builder
186                .counter("errors_total")
187                .help("Number of errors happened so far")
188                .label("kind", "unknown_plumtree_node")
189                .finish()
190                .expect("Never fails"),
191        }
192    }
193
194    pub(crate) fn add(&self, other: &Self) {
195        self.broadcasted_messages
196            .add_u64(other.broadcasted_messages());
197        self.forgot_messages.add_u64(other.forgot_messages());
198        self.delivered_messages.add_u64(other.delivered_messages());
199        self.connected_neighbors
200            .add_u64(other.connected_neighbors());
201        self.disconnected_neighbors
202            .add_u64(other.disconnected_neighbors());
203        self.isolated_times.add_u64(other.isolated_times());
204        self.deisolated_times.add_u64(other.deisolated_times());
205        self.forget_unknown_message_errors
206            .add_u64(other.forget_unknown_message_errors());
207        self.cannot_send_hyparview_message_errors
208            .add_u64(other.cannot_send_hyparview_message_errors());
209        self.cannot_send_plumtree_message_errors
210            .add_u64(other.cannot_send_plumtree_message_errors());
211        self.unknown_plumtree_node_errors
212            .add_u64(other.unknown_plumtree_node_errors());
213    }
214}