bee_protocol/types/metrics/
node.rs

1// Copyright 2020-2021 IOTA Stiftung
2// SPDX-License-Identifier: Apache-2.0
3
4//! Module that provides a type to hold metrics related to nodes.
5
6use std::sync::atomic::{AtomicU64, Ordering};
7
8/// Holds metrics related to a node.
9#[derive(Default, Debug)]
10pub struct NodeMetrics {
11    invalid_packets: AtomicU64,
12
13    milestone_requests_received: AtomicU64,
14    messages_received: AtomicU64,
15    message_requests_received: AtomicU64,
16    heartbeats_received: AtomicU64,
17
18    milestone_requests_sent: AtomicU64,
19    messages_sent: AtomicU64,
20    message_requests_sent: AtomicU64,
21    heartbeats_sent: AtomicU64,
22
23    invalid_messages: AtomicU64,
24    new_messages: AtomicU64,
25    known_messages: AtomicU64,
26    messages_average_latency: AtomicU64,
27
28    referenced_messages: AtomicU64,
29    excluded_no_transaction_messages: AtomicU64,
30    excluded_conflicting_messages: AtomicU64,
31    included_messages: AtomicU64,
32
33    created_outputs: AtomicU64,
34    consumed_outputs: AtomicU64,
35    receipts: AtomicU64,
36
37    transaction_payloads: AtomicU64,
38    milestone_payloads: AtomicU64,
39    indexation_payloads: AtomicU64,
40
41    snapshots: AtomicU64,
42    prunings: AtomicU64,
43}
44
45impl NodeMetrics {
46    /// Creates a new `NodeMetrics`.
47    pub fn new() -> Self {
48        Self::default()
49    }
50}
51
52impl NodeMetrics {
53    /// Returns the number of invalid packets of the `NodeMetrics`.
54    pub fn invalid_packets(&self) -> u64 {
55        self.invalid_packets.load(Ordering::Relaxed)
56    }
57
58    /// Increments the number of invalid packets of the `NodeMetrics`.
59    pub fn invalid_packets_inc(&self) -> u64 {
60        self.invalid_packets.fetch_add(1, Ordering::SeqCst)
61    }
62
63    /// Returns the number of received milestone requests of the `NodeMetrics`.
64    pub fn milestone_requests_received(&self) -> u64 {
65        self.milestone_requests_received.load(Ordering::Relaxed)
66    }
67
68    /// Increments the number of received milestone requests of the `NodeMetrics`.
69    pub fn milestone_requests_received_inc(&self) -> u64 {
70        self.milestone_requests_received.fetch_add(1, Ordering::SeqCst)
71    }
72
73    /// Returns the number of received messages of the `NodeMetrics`.
74    pub fn messages_received(&self) -> u64 {
75        self.messages_received.load(Ordering::Relaxed)
76    }
77
78    /// Increments the number of received messages of the `NodeMetrics`.
79    pub fn messages_received_inc(&self) -> u64 {
80        self.messages_received.fetch_add(1, Ordering::SeqCst)
81    }
82
83    /// Returns the number of received message requests of the `NodeMetrics`.
84    pub fn message_requests_received(&self) -> u64 {
85        self.message_requests_received.load(Ordering::Relaxed)
86    }
87
88    /// Increments the number of received message requests of the `NodeMetrics`.
89    pub fn message_requests_received_inc(&self) -> u64 {
90        self.message_requests_received.fetch_add(1, Ordering::SeqCst)
91    }
92
93    /// Returns the number of received heartbeats of the `NodeMetrics`.
94    pub fn heartbeats_received(&self) -> u64 {
95        self.heartbeats_received.load(Ordering::Relaxed)
96    }
97
98    /// Increments the number of received heartbeats of the `NodeMetrics`.
99    pub fn heartbeats_received_inc(&self) -> u64 {
100        self.heartbeats_received.fetch_add(1, Ordering::SeqCst)
101    }
102
103    /// Returns the number of sent milestone requests of the `NodeMetrics`.
104    pub fn milestone_requests_sent(&self) -> u64 {
105        self.milestone_requests_sent.load(Ordering::Relaxed)
106    }
107
108    /// Increments the number of sent milestone requests of the `NodeMetrics`.
109    pub fn milestone_requests_sent_inc(&self) -> u64 {
110        self.milestone_requests_sent.fetch_add(1, Ordering::SeqCst)
111    }
112
113    /// Returns the number of sent messages of the `NodeMetrics`.
114    pub fn messages_sent(&self) -> u64 {
115        self.messages_sent.load(Ordering::Relaxed)
116    }
117
118    /// Increments the number of sent messages of the `NodeMetrics`.
119    pub fn messages_sent_inc(&self) -> u64 {
120        self.messages_sent.fetch_add(1, Ordering::SeqCst)
121    }
122
123    /// Returns the number of sent message requests of the `NodeMetrics`.
124    pub fn message_requests_sent(&self) -> u64 {
125        self.message_requests_sent.load(Ordering::Relaxed)
126    }
127
128    /// Increments the number of sent message requests of the `NodeMetrics`.
129    pub fn message_requests_sent_inc(&self) -> u64 {
130        self.message_requests_sent.fetch_add(1, Ordering::SeqCst)
131    }
132
133    /// Returns the number of sent heartbeats of the `NodeMetrics`.
134    pub fn heartbeats_sent(&self) -> u64 {
135        self.heartbeats_sent.load(Ordering::Relaxed)
136    }
137
138    /// Increments the number of sent heartbeats of the `NodeMetrics`.
139    pub fn heartbeats_sent_inc(&self) -> u64 {
140        self.heartbeats_sent.fetch_add(1, Ordering::SeqCst)
141    }
142
143    /// Returns the number of invalid messages of the `NodeMetrics`.
144    pub fn invalid_messages(&self) -> u64 {
145        self.invalid_messages.load(Ordering::Relaxed)
146    }
147
148    /// Increments the number of invalid messages of the `NodeMetrics`.
149    pub fn invalid_messages_inc(&self) -> u64 {
150        self.invalid_messages.fetch_add(1, Ordering::SeqCst)
151    }
152
153    /// Returns the number of new messages of the `NodeMetrics`.
154    pub fn new_messages(&self) -> u64 {
155        self.new_messages.load(Ordering::Relaxed)
156    }
157
158    /// Increments the number of new messages of the `NodeMetrics`.
159    pub fn new_messages_inc(&self) -> u64 {
160        self.new_messages.fetch_add(1, Ordering::SeqCst)
161    }
162
163    /// Returns the number of known messages of the `NodeMetrics`.
164    pub fn known_messages(&self) -> u64 {
165        self.known_messages.load(Ordering::Relaxed)
166    }
167
168    /// Increments the number of known messages of the `NodeMetrics`.
169    pub fn known_messages_inc(&self) -> u64 {
170        self.known_messages.fetch_add(1, Ordering::SeqCst)
171    }
172
173    /// Returns the average messages latency of the `NodeMetrics`.
174    pub fn messages_average_latency(&self) -> u64 {
175        self.messages_average_latency.load(Ordering::Relaxed)
176    }
177
178    /// Sets the average messages latency of the `NodeMetrics`
179    pub fn messages_average_latency_set(&self, val: u64) {
180        self.messages_average_latency.store(val, Ordering::Relaxed)
181    }
182
183    /// Returns the number of referenced messages of the `NodeMetrics`.
184    pub fn referenced_messages(&self) -> u64 {
185        self.referenced_messages.load(Ordering::Relaxed)
186    }
187
188    /// Increments the number of referenced messages of the `NodeMetrics`.
189    pub fn referenced_messages_inc(&self, value: u64) -> u64 {
190        self.referenced_messages.fetch_add(value, Ordering::SeqCst)
191    }
192
193    /// Returns the number of excluded messages - because without transaction - of the `NodeMetrics`.
194    pub fn excluded_no_transaction_messages(&self) -> u64 {
195        self.excluded_no_transaction_messages.load(Ordering::Relaxed)
196    }
197
198    /// Increments the number of excluded messages - because without transaction - of the `NodeMetrics`.
199    pub fn excluded_no_transaction_messages_inc(&self, value: u64) -> u64 {
200        self.excluded_no_transaction_messages.fetch_add(value, Ordering::SeqCst)
201    }
202
203    /// Returns the number of excluded messages - because conflicting - of the `NodeMetrics`.
204    pub fn excluded_conflicting_messages(&self) -> u64 {
205        self.excluded_conflicting_messages.load(Ordering::Relaxed)
206    }
207
208    /// Increments the number of excluded messages - because conflicting - of the `NodeMetrics`.
209    pub fn excluded_conflicting_messages_inc(&self, value: u64) -> u64 {
210        self.excluded_conflicting_messages.fetch_add(value, Ordering::SeqCst)
211    }
212
213    /// Returns the number of included messages of the `NodeMetrics`.
214    pub fn included_messages(&self) -> u64 {
215        self.included_messages.load(Ordering::Relaxed)
216    }
217
218    /// Increments the number of included messages of the `NodeMetrics`.
219    pub fn included_messages_inc(&self, value: u64) -> u64 {
220        self.included_messages.fetch_add(value, Ordering::SeqCst)
221    }
222
223    /// Returns the number of created outputs of the `NodeMetrics`.
224    pub fn created_outputs(&self) -> u64 {
225        self.created_outputs.load(Ordering::Relaxed)
226    }
227
228    /// Increments the number of created outputs of the `NodeMetrics`.
229    pub fn created_outputs_inc(&self, value: u64) -> u64 {
230        self.created_outputs.fetch_add(value, Ordering::SeqCst)
231    }
232
233    /// Returns the number of consumed outputs of the `NodeMetrics`.
234    pub fn consumed_outputs(&self) -> u64 {
235        self.consumed_outputs.load(Ordering::Relaxed)
236    }
237
238    /// Increments the number of consumed outputs of the `NodeMetrics`.
239    pub fn consumed_outputs_inc(&self, value: u64) -> u64 {
240        self.consumed_outputs.fetch_add(value, Ordering::SeqCst)
241    }
242
243    /// Returns the number of receipts of the `NodeMetrics`.
244    pub fn receipts(&self) -> u64 {
245        self.receipts.load(Ordering::Relaxed)
246    }
247
248    /// Increments the number of receipts of the `NodeMetrics`.
249    pub fn receipts_inc(&self, value: u64) -> u64 {
250        self.receipts.fetch_add(value, Ordering::SeqCst)
251    }
252
253    /// Returns the number of transaction payloads of the `NodeMetrics`.
254    pub fn transaction_payloads(&self) -> u64 {
255        self.transaction_payloads.load(Ordering::Relaxed)
256    }
257
258    /// Increments the number of transaction payloads of the `NodeMetrics`.
259    pub fn transaction_payloads_inc(&self, value: u64) -> u64 {
260        self.transaction_payloads.fetch_add(value, Ordering::SeqCst)
261    }
262
263    /// Returns the number of milestone payloads of the `NodeMetrics`.
264    pub fn milestone_payloads(&self) -> u64 {
265        self.milestone_payloads.load(Ordering::Relaxed)
266    }
267
268    /// Increments the number of milestone payloads of the `NodeMetrics`.
269    pub fn milestone_payloads_inc(&self, value: u64) -> u64 {
270        self.milestone_payloads.fetch_add(value, Ordering::SeqCst)
271    }
272
273    /// Returns the number of indexation payloads of the `NodeMetrics`.
274    pub fn indexation_payloads(&self) -> u64 {
275        self.indexation_payloads.load(Ordering::Relaxed)
276    }
277
278    /// Increments the number of indexation payloads of the `NodeMetrics`.
279    pub fn indexation_payload_inc(&self, value: u64) -> u64 {
280        self.indexation_payloads.fetch_add(value, Ordering::SeqCst)
281    }
282
283    /// Returns the number of snapshots of the `NodeMetrics`.
284    pub fn snapshots(&self) -> u64 {
285        self.snapshots.load(Ordering::Relaxed)
286    }
287
288    /// Increments the number of snapshots of the `NodeMetrics`.
289    pub fn snapshots_inc(&self, value: u64) -> u64 {
290        self.snapshots.fetch_add(value, Ordering::SeqCst)
291    }
292
293    /// Returns the number of prunings of the `NodeMetrics`.
294    pub fn prunings(&self) -> u64 {
295        self.prunings.load(Ordering::Relaxed)
296    }
297
298    /// Increments the number of prunings of the `NodeMetrics`.
299    pub fn prunings_inc(&self, value: u64) -> u64 {
300        self.prunings.fetch_add(value, Ordering::SeqCst)
301    }
302}
303
304#[cfg(test)]
305mod tests {
306
307    use super::*;
308
309    #[test]
310    fn protocol_metrics() {
311        let metrics = NodeMetrics::default();
312
313        assert_eq!(metrics.invalid_packets(), 0);
314        assert_eq!(metrics.milestone_requests_received(), 0);
315        assert_eq!(metrics.messages_received(), 0);
316        assert_eq!(metrics.message_requests_received(), 0);
317        assert_eq!(metrics.heartbeats_received(), 0);
318        assert_eq!(metrics.milestone_requests_sent(), 0);
319        assert_eq!(metrics.messages_sent(), 0);
320        assert_eq!(metrics.message_requests_sent(), 0);
321        assert_eq!(metrics.heartbeats_sent(), 0);
322        assert_eq!(metrics.invalid_messages(), 0);
323        assert_eq!(metrics.new_messages(), 0);
324        assert_eq!(metrics.known_messages(), 0);
325        assert_eq!(metrics.messages_average_latency(), 0);
326        assert_eq!(metrics.referenced_messages(), 0);
327        assert_eq!(metrics.excluded_no_transaction_messages(), 0);
328        assert_eq!(metrics.excluded_conflicting_messages(), 0);
329        assert_eq!(metrics.included_messages(), 0);
330        assert_eq!(metrics.created_outputs(), 0);
331        assert_eq!(metrics.consumed_outputs(), 0);
332        assert_eq!(metrics.receipts(), 0);
333        assert_eq!(metrics.transaction_payloads(), 0);
334        assert_eq!(metrics.milestone_payloads(), 0);
335        assert_eq!(metrics.indexation_payloads(), 0);
336        assert_eq!(metrics.snapshots(), 0);
337        assert_eq!(metrics.prunings(), 0);
338
339        metrics.invalid_packets_inc();
340        metrics.milestone_requests_received_inc();
341        metrics.messages_received_inc();
342        metrics.message_requests_received_inc();
343        metrics.heartbeats_received_inc();
344        metrics.milestone_requests_sent_inc();
345        metrics.messages_sent_inc();
346        metrics.message_requests_sent_inc();
347        metrics.heartbeats_sent_inc();
348        metrics.invalid_messages_inc();
349        metrics.new_messages_inc();
350        metrics.known_messages_inc();
351        metrics.messages_average_latency_set(42);
352        metrics.referenced_messages_inc(1);
353        metrics.excluded_no_transaction_messages_inc(1);
354        metrics.excluded_conflicting_messages_inc(1);
355        metrics.included_messages_inc(1);
356        metrics.created_outputs_inc(1);
357        metrics.consumed_outputs_inc(1);
358        metrics.receipts_inc(1);
359        metrics.transaction_payloads_inc(1);
360        metrics.milestone_payloads_inc(1);
361        metrics.indexation_payload_inc(1);
362        metrics.snapshots_inc(1);
363        metrics.prunings_inc(1);
364
365        assert_eq!(metrics.invalid_packets(), 1);
366        assert_eq!(metrics.milestone_requests_received(), 1);
367        assert_eq!(metrics.messages_received(), 1);
368        assert_eq!(metrics.message_requests_received(), 1);
369        assert_eq!(metrics.heartbeats_received(), 1);
370        assert_eq!(metrics.milestone_requests_sent(), 1);
371        assert_eq!(metrics.messages_sent(), 1);
372        assert_eq!(metrics.message_requests_sent(), 1);
373        assert_eq!(metrics.heartbeats_sent(), 1);
374        assert_eq!(metrics.invalid_messages(), 1);
375        assert_eq!(metrics.new_messages(), 1);
376        assert_eq!(metrics.known_messages(), 1);
377        assert_eq!(metrics.messages_average_latency(), 42);
378        assert_eq!(metrics.referenced_messages(), 1);
379        assert_eq!(metrics.excluded_no_transaction_messages(), 1);
380        assert_eq!(metrics.excluded_conflicting_messages(), 1);
381        assert_eq!(metrics.included_messages(), 1);
382        assert_eq!(metrics.created_outputs(), 1);
383        assert_eq!(metrics.consumed_outputs(), 1);
384        assert_eq!(metrics.receipts(), 1);
385        assert_eq!(metrics.transaction_payloads(), 1);
386        assert_eq!(metrics.milestone_payloads(), 1);
387        assert_eq!(metrics.indexation_payloads(), 1);
388        assert_eq!(metrics.snapshots(), 1);
389        assert_eq!(metrics.prunings(), 1);
390    }
391}