1use prometrics::metrics::{Counter, MetricBuilder};
8
9#[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 pub fn registered_nodes(&self) -> u64 {
21 self.registered_nodes.value() as u64
22 }
23
24 pub fn deregistered_nodes(&self) -> u64 {
26 self.deregistered_nodes.value() as u64
27 }
28
29 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#[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 pub fn broadcasted_messages(&self) -> u64 {
76 self.broadcasted_messages.value() as u64
77 }
78
79 pub fn forgot_messages(&self) -> u64 {
81 self.forgot_messages.value() as u64
82 }
83
84 pub fn delivered_messages(&self) -> u64 {
86 self.delivered_messages.value() as u64
87 }
88
89 pub fn connected_neighbors(&self) -> u64 {
91 self.connected_neighbors.value() as u64
92 }
93
94 pub fn disconnected_neighbors(&self) -> u64 {
96 self.disconnected_neighbors.value() as u64
97 }
98
99 pub fn isolated_times(&self) -> u64 {
101 self.isolated_times.value() as u64
102 }
103
104 pub fn deisolated_times(&self) -> u64 {
106 self.deisolated_times.value() as u64
107 }
108
109 pub fn forget_unknown_message_errors(&self) -> u64 {
111 self.forget_unknown_message_errors.value() as u64
112 }
113
114 pub fn cannot_send_hyparview_message_errors(&self) -> u64 {
116 self.cannot_send_hyparview_message_errors.value() as u64
117 }
118
119 pub fn cannot_send_plumtree_message_errors(&self) -> u64 {
121 self.cannot_send_plumtree_message_errors.value() as u64
122 }
123
124 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}