rippled
Loading...
Searching...
No Matches
TrafficCount.h
1#ifndef XRPL_OVERLAY_TRAFFIC_H_INCLUDED
2#define XRPL_OVERLAY_TRAFFIC_H_INCLUDED
3
4#include <xrpl/beast/utility/instrumentation.h>
5#include <xrpl/protocol/messages.h>
6
7#include <atomic>
8#include <cstdint>
9
10namespace ripple {
11
31{
32public:
33 enum category : std::size_t;
34
36 {
37 public:
39
44
49
51 : name(ts.name)
52 , bytesIn(ts.bytesIn.load())
53 , bytesOut(ts.bytesOut.load())
54 , messagesIn(ts.messagesIn.load())
55 , messagesOut(ts.messagesOut.load())
56 {
57 }
58
59 operator bool() const
60 {
61 return messagesIn || messagesOut;
62 }
63 };
64
65 // If you add entries to this enum, you need to update the initialization
66 // of the arrays at the bottom of this file which map array numbers to
67 // human-readable, monitoring-tool friendly names.
69 base, // basic peer overhead, must be first
70
71 cluster, // cluster overhead
72 overlay, // overlay management
73 manifests, // manifest management
74
75 transaction, // transaction messages
76 // The following categories breakdown transaction message type
77 transaction_duplicate, // duplicate transaction messages
78
79 proposal, // proposal messages
80 // The following categories breakdown proposal message type
81 proposal_untrusted, // proposals from untrusted validators
82 proposal_duplicate, // proposals seen previously
83
84 validation, // validation messages
85 // The following categories breakdown validation message type
86 validation_untrusted, // validations from untrusted validators
87 validation_duplicate, // validations seen previously
88
90
92 squelch_suppressed, // egress traffic amount suppressed by squelching
93 squelch_ignored, // the traffic amount that came from peers ignoring
94 // squelch messages
95
96 // TMHaveSet message:
97 get_set, // transaction sets we try to get
98 share_set, // transaction sets we get
99
100 // TMLedgerData: transaction set candidate
103
104 // TMLedgerData: transaction node
107
108 // TMLedgerData: account state node
111
112 // TMLedgerData: generic
115
116 // TMGetLedger: transaction set candidate
119
120 // TMGetLedger: transaction node
123
124 // TMGetLedger: account state node
127
128 // TMGetLedger: generic
131
132 // TMGetObjectByHash:
135
136 // TMGetObjectByHash:
139
140 // TMGetObjectByHash: transaction node
143
144 // TMGetObjectByHash: account state node
147
148 // TMGetObjectByHash: CAS
151
152 // TMGetObjectByHash: fetch packs
155
156 // TMGetObjectByHash: transactions
158
159 // TMGetObjectByHash: generic
162
163 // TMProofPathRequest and TMProofPathResponse
166
167 // TMReplayDeltaRequest and TMReplayDeltaResponse
170
171 // TMHaveTransactions
173
174 // TMTransactions
176
177 // The total p2p bytes sent and received on the wire
179
180 unknown // must be last
181 };
182
183 TrafficCount() = default;
184
187 static category
189 ::google::protobuf::Message const& message,
190 protocol::MessageType type,
191 bool inbound);
192
194 void
195 addCount(category cat, bool inbound, int bytes)
196 {
197 XRPL_ASSERT(
198 cat <= category::unknown,
199 "ripple::TrafficCount::addCount : valid category input");
200
201 auto it = counts_.find(cat);
202
203 // nothing to do, the category does not exist
204 if (it == counts_.end())
205 return;
206
207 if (inbound)
208 {
209 it->second.bytesIn += bytes;
210 ++it->second.messagesIn;
211 }
212 else
213 {
214 it->second.bytesOut += bytes;
215 ++it->second.messagesOut;
216 }
217 }
218
223 auto const&
224 getCounts() const
225 {
226 return counts_;
227 }
228
229 static std::string
231 {
232 static std::unordered_map<category, std::string> const category_map = {
233 {base, "overhead"},
234 {cluster, "overhead_cluster"},
235 {overlay, "overhead_overlay"},
236 {manifests, "overhead_manifest"},
237 {transaction, "transactions"},
238 {transaction_duplicate, "transactions_duplicate"},
239 {proposal, "proposals"},
240 {proposal_untrusted, "proposals_untrusted"},
241 {proposal_duplicate, "proposals_duplicate"},
242 {validation, "validations"},
243 {validation_untrusted, "validations_untrusted"},
244 {validation_duplicate, "validations_duplicate"},
245 {validatorlist, "validator_lists"},
246 {squelch, "squelch"},
247 {squelch_suppressed, "squelch_suppressed"},
248 {squelch_ignored, "squelch_ignored"},
249 {get_set, "set_get"},
250 {share_set, "set_share"},
251 {ld_tsc_get, "ledger_data_Transaction_Set_candidate_get"},
252 {ld_tsc_share, "ledger_data_Transaction_Set_candidate_share"},
253 {ld_txn_get, "ledger_data_Transaction_Node_get"},
254 {ld_txn_share, "ledger_data_Transaction_Node_share"},
255 {ld_asn_get, "ledger_data_Account_State_Node_get"},
256 {ld_asn_share, "ledger_data_Account_State_Node_share"},
257 {ld_get, "ledger_data_get"},
258 {ld_share, "ledger_data_share"},
259 {gl_tsc_share, "ledger_Transaction_Set_candidate_share"},
260 {gl_tsc_get, "ledger_Transaction_Set_candidate_get"},
261 {gl_txn_share, "ledger_Transaction_node_share"},
262 {gl_txn_get, "ledger_Transaction_node_get"},
263 {gl_asn_share, "ledger_Account_State_node_share"},
264 {gl_asn_get, "ledger_Account_State_node_get"},
265 {gl_share, "ledger_share"},
266 {gl_get, "ledger_get"},
267 {share_hash_ledger, "getobject_Ledger_share"},
268 {get_hash_ledger, "getobject_Ledger_get"},
269 {share_hash_tx, "getobject_Transaction_share"},
270 {get_hash_tx, "getobject_Transaction_get"},
271 {share_hash_txnode, "getobject_Transaction_node_share"},
272 {get_hash_txnode, "getobject_Transaction_node_get"},
273 {share_hash_asnode, "getobject_Account_State_node_share"},
274 {get_hash_asnode, "getobject_Account_State_node_get"},
275 {share_cas_object, "getobject_CAS_share"},
276 {get_cas_object, "getobject_CAS_get"},
277 {share_fetch_pack, "getobject_Fetch_Pack_share"},
278 {get_fetch_pack, "getobject_Fetch Pack_get"},
279 {get_transactions, "getobject_Transactions_get"},
280 {share_hash, "getobject_share"},
281 {get_hash, "getobject_get"},
282 {proof_path_request, "proof_path_request"},
283 {proof_path_response, "proof_path_response"},
284 {replay_delta_request, "replay_delta_request"},
285 {replay_delta_response, "replay_delta_response"},
286 {have_transactions, "have_transactions"},
287 {requested_transactions, "requested_transactions"},
288 {total, "total"}};
289
290 if (auto it = category_map.find(cat); it != category_map.end())
291 return it->second;
292
293 return "unknown";
294 }
295
296protected:
298 {base, {base}},
299 {cluster, {cluster}},
300 {overlay, {overlay}},
301 {manifests, {manifests}},
304 {proposal, {proposal}},
311 {squelch, {squelch}},
314 {get_set, {get_set}},
315 {share_set, {share_set}},
322 {ld_get, {ld_get}},
323 {ld_share, {ld_share}},
330 {gl_share, {gl_share}},
331 {gl_get, {gl_get}},
346 {get_hash, {get_hash}},
353 {total, {total}},
354 {unknown, {unknown}},
355 };
356};
357
358} // namespace ripple
359#endif
TrafficStats(TrafficStats const &ts)
std::atomic< std::uint64_t > bytesOut
TrafficStats(TrafficCount::category cat)
std::atomic< std::uint64_t > messagesOut
std::atomic< std::uint64_t > messagesIn
std::atomic< std::uint64_t > bytesIn
TrafficCount is used to count ingress and egress wire bytes and number of messages.
auto const & getCounts() const
An up-to-date copy of all the counters.
std::unordered_map< category, TrafficStats > counts_
static category categorize(::google::protobuf::Message const &message, protocol::MessageType type, bool inbound)
Given a protocol message, determine which traffic category it belongs to.
static std::string to_string(category cat)
void addCount(category cat, bool inbound, int bytes)
Account for traffic associated with the given category.
T end(T... args)
T find(T... args)
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
Definition algorithm.h:6