Line data Source code
1 : //
2 : // Copyright (c) 2015 Juniper Networks, Inc. All rights reserved.
3 : // Copyright Contributors to the OpenSDN project
4 : //
5 :
6 : //
7 : // sandesh_statistics.cc
8 : // Sandesh Statistics Implementation
9 : //
10 :
11 : #include <boost/foreach.hpp>
12 :
13 : #include <sandesh/sandesh_types.h>
14 : #include <sandesh/sandesh.h>
15 : #include <sandesh/sandesh_statistics.h>
16 :
17 : //
18 : // SandeshMessageStatistics
19 : //
20 :
21 : // Detail stats
22 0 : void SandeshMessageStatistics::Get(DetailStatsMap *m_detail_type_stats,
23 : SandeshMessageStats *detail_agg_stats) const {
24 0 : *m_detail_type_stats = detail_type_stats_map_;
25 0 : *detail_agg_stats = detail_agg_stats_;
26 0 : }
27 :
28 659 : void SandeshMessageStatistics::Get(DetailStatsList *v_detail_type_stats,
29 : SandeshMessageStats *detail_agg_stats) const {
30 659 : if (deleted_) {
31 0 : return;
32 : }
33 31285 : BOOST_FOREACH(DetailStatsMap::const_iterator::value_type it,
34 : detail_type_stats_map_) {
35 15313 : v_detail_type_stats->push_back(*it.second);
36 : }
37 659 : *detail_agg_stats = detail_agg_stats_;
38 : }
39 :
40 : // Basic stats
41 0 : static void PopulateBasicStats(const SandeshMessageStats &detail_stats,
42 : SandeshMessageBasicStats *basic_stats) {
43 0 : basic_stats->set_messages_sent(detail_stats.get_messages_sent());
44 0 : basic_stats->set_bytes_sent(detail_stats.get_bytes_sent());
45 0 : basic_stats->set_messages_received(detail_stats.get_messages_received());
46 0 : basic_stats->set_bytes_received(detail_stats.get_bytes_received());
47 0 : basic_stats->set_messages_sent_dropped(
48 : detail_stats.get_messages_sent_dropped());
49 0 : basic_stats->set_messages_received_dropped(
50 : detail_stats.get_messages_received_dropped());
51 0 : }
52 :
53 0 : static void PopulateBasicTypeStats(const SandeshMessageTypeStats &detail_stats,
54 : SandeshMessageTypeBasicStats *basic_stats) {
55 0 : basic_stats->message_type = detail_stats.message_type;
56 0 : PopulateBasicStats(detail_stats.stats, &basic_stats->stats);
57 0 : }
58 :
59 0 : void SandeshMessageStatistics::Get(BasicStatsList *v_basic_type_stats,
60 : SandeshMessageBasicStats *basic_agg_stats) const {
61 0 : if (deleted_) {
62 0 : return;
63 : }
64 0 : BOOST_FOREACH(DetailStatsMap::const_iterator::value_type it,
65 : detail_type_stats_map_) {
66 0 : const SandeshMessageTypeStats *detail_stats(it.second);
67 0 : SandeshMessageTypeBasicStats basic_stats;
68 0 : PopulateBasicTypeStats(*detail_stats, &basic_stats);
69 0 : v_basic_type_stats->push_back(basic_stats);
70 0 : }
71 0 : PopulateBasicStats(detail_agg_stats_, basic_agg_stats);
72 : }
73 :
74 735362 : static void UpdateDetailStatsDrops(SandeshMessageStats *smstats,
75 : bool sent, uint64_t bytes, SandeshTxDropReason::type send_dreason,
76 : SandeshRxDropReason::type recv_dreason) {
77 735362 : if (sent) {
78 735362 : switch (send_dreason) {
79 0 : case SandeshTxDropReason::ValidationFailed:
80 0 : smstats->set_messages_sent_dropped_validation_failed(
81 0 : smstats->get_messages_sent_dropped_validation_failed() + 1);
82 0 : smstats->set_bytes_sent_dropped_validation_failed(
83 0 : smstats->get_bytes_sent_dropped_validation_failed() + bytes);
84 0 : break;
85 0 : case SandeshTxDropReason::RatelimitDrop:
86 0 : smstats->set_messages_sent_dropped_rate_limited(
87 0 : smstats->get_messages_sent_dropped_rate_limited() + 1);
88 0 : smstats->set_bytes_sent_dropped_rate_limited(
89 0 : smstats->get_bytes_sent_dropped_rate_limited() + bytes);
90 0 : break;
91 0 : case SandeshTxDropReason::QueueLevel:
92 0 : smstats->set_messages_sent_dropped_queue_level(
93 0 : smstats->get_messages_sent_dropped_queue_level() + 1);
94 0 : smstats->set_bytes_sent_dropped_queue_level(
95 0 : smstats->get_bytes_sent_dropped_queue_level() + bytes);
96 0 : break;
97 364082 : case SandeshTxDropReason::NoClient:
98 364082 : smstats->set_messages_sent_dropped_no_client(
99 364082 : smstats->get_messages_sent_dropped_no_client() + 1);
100 364082 : smstats->set_bytes_sent_dropped_no_client(
101 364082 : smstats->get_bytes_sent_dropped_no_client() + bytes);
102 364082 : break;
103 0 : case SandeshTxDropReason::NoSession:
104 0 : smstats->set_messages_sent_dropped_no_session(
105 0 : smstats->get_messages_sent_dropped_no_session() + 1);
106 0 : smstats->set_bytes_sent_dropped_no_session(
107 0 : smstats->get_bytes_sent_dropped_no_session() + bytes);
108 0 : break;
109 0 : case SandeshTxDropReason::NoQueue:
110 0 : smstats->set_messages_sent_dropped_no_queue(
111 0 : smstats->get_messages_sent_dropped_no_queue() + 1);
112 0 : smstats->set_bytes_sent_dropped_no_queue(
113 0 : smstats->get_bytes_sent_dropped_no_queue() + bytes);
114 0 : break;
115 0 : case SandeshTxDropReason::ClientSendFailed:
116 0 : smstats->set_messages_sent_dropped_client_send_failed(
117 0 : smstats->get_messages_sent_dropped_client_send_failed() + 1);
118 0 : smstats->set_bytes_sent_dropped_client_send_failed(
119 0 : smstats->get_bytes_sent_dropped_client_send_failed() + bytes);
120 0 : break;
121 2120 : case SandeshTxDropReason::WrongClientSMState:
122 2120 : smstats->set_messages_sent_dropped_wrong_client_sm_state(
123 2120 : smstats->get_messages_sent_dropped_wrong_client_sm_state() + 1);
124 2120 : smstats->set_bytes_sent_dropped_wrong_client_sm_state(
125 2120 : smstats->get_bytes_sent_dropped_wrong_client_sm_state() +
126 : bytes);
127 2120 : break;
128 0 : case SandeshTxDropReason::WriteFailed:
129 0 : smstats->set_messages_sent_dropped_write_failed(
130 0 : smstats->get_messages_sent_dropped_write_failed() + 1);
131 0 : smstats->set_bytes_sent_dropped_write_failed(
132 0 : smstats->get_bytes_sent_dropped_write_failed() + bytes);
133 0 : break;
134 0 : case SandeshTxDropReason::HeaderWriteFailed:
135 0 : smstats->set_messages_sent_dropped_header_write_failed(
136 0 : smstats->get_messages_sent_dropped_header_write_failed() + 1);
137 0 : smstats->set_bytes_sent_dropped_header_write_failed(
138 0 : smstats->get_bytes_sent_dropped_header_write_failed() + bytes);
139 0 : break;
140 0 : case SandeshTxDropReason::SessionNotConnected:
141 0 : smstats->set_messages_sent_dropped_session_not_connected(
142 0 : smstats->get_messages_sent_dropped_session_not_connected() + 1);
143 0 : smstats->set_bytes_sent_dropped_session_not_connected(
144 0 : smstats->get_bytes_sent_dropped_session_not_connected() +
145 : bytes);
146 0 : break;
147 369160 : case SandeshTxDropReason::SendingDisabled:
148 369160 : smstats->set_messages_sent_dropped_sending_disabled(
149 369160 : smstats->get_messages_sent_dropped_sending_disabled() + 1);
150 369160 : smstats->set_bytes_sent_dropped_sending_disabled(
151 369160 : smstats->get_bytes_sent_dropped_sending_disabled() +
152 : bytes);
153 369160 : break;
154 0 : case SandeshTxDropReason::SendingToSyslog:
155 0 : smstats->set_messages_sent_dropped_sending_to_syslog(
156 0 : smstats->get_messages_sent_dropped_sending_to_syslog() + 1);
157 0 : smstats->set_bytes_sent_dropped_sending_to_syslog(
158 0 : smstats->get_bytes_sent_dropped_sending_to_syslog() +
159 : bytes);
160 0 : break;
161 0 : default:
162 0 : assert(0);
163 : }
164 735362 : smstats->set_messages_sent_dropped(
165 735362 : smstats->get_messages_sent_dropped() + 1);
166 735362 : smstats->set_bytes_sent_dropped(
167 735362 : smstats->get_bytes_sent_dropped() + bytes);
168 : } else {
169 0 : switch (recv_dreason) {
170 0 : case SandeshRxDropReason::QueueLevel:
171 0 : smstats->set_messages_received_dropped_queue_level(
172 0 : smstats->get_messages_received_dropped_queue_level() + 1);
173 0 : smstats->set_bytes_received_dropped_queue_level(
174 0 : smstats->get_bytes_received_dropped_queue_level() + bytes);
175 0 : break;
176 0 : case SandeshRxDropReason::NoQueue:
177 0 : smstats->set_messages_received_dropped_no_queue(
178 0 : smstats->get_messages_received_dropped_no_queue() + 1);
179 0 : smstats->set_bytes_received_dropped_no_queue(
180 0 : smstats->get_bytes_received_dropped_no_queue() + bytes);
181 0 : break;
182 0 : case SandeshRxDropReason::DecodingFailed:
183 0 : smstats->set_messages_received_dropped_decoding_failed(
184 0 : smstats->get_messages_received_dropped_decoding_failed() + 1);
185 0 : smstats->set_bytes_received_dropped_decoding_failed(
186 0 : smstats->get_bytes_received_dropped_decoding_failed() + bytes);
187 0 : break;
188 0 : case SandeshRxDropReason::ControlMsgFailed:
189 0 : smstats->set_messages_received_dropped_control_msg_failed(
190 0 : smstats->get_messages_received_dropped_control_msg_failed() +
191 : 1);
192 0 : smstats->set_bytes_received_dropped_control_msg_failed(
193 0 : smstats->get_bytes_received_dropped_control_msg_failed() +
194 : bytes);
195 0 : break;
196 0 : case SandeshRxDropReason::CreateFailed:
197 0 : smstats->set_messages_received_dropped_create_failed(
198 0 : smstats->get_messages_received_dropped_create_failed() + 1);
199 0 : smstats->set_bytes_received_dropped_create_failed(
200 0 : smstats->get_bytes_received_dropped_create_failed() + bytes);
201 0 : break;
202 0 : default:
203 0 : assert(0);
204 : }
205 0 : smstats->set_messages_received_dropped(
206 0 : smstats->get_messages_received_dropped() + 1);
207 0 : smstats->set_bytes_received_dropped(
208 0 : smstats->get_bytes_received_dropped() + bytes);
209 : }
210 735362 : }
211 :
212 12973 : void SandeshMessageStatistics::UpdateSend(const std::string &msg_name,
213 : uint64_t bytes) {
214 12973 : UpdateInternal(msg_name, bytes, true, false,
215 : SandeshTxDropReason::NoDrop, SandeshRxDropReason::NoDrop);
216 12973 : }
217 :
218 367681 : void SandeshMessageStatistics::UpdateSendFailed(const std::string &msg_name,
219 : uint64_t bytes, SandeshTxDropReason::type dreason) {
220 367681 : UpdateInternal(msg_name, bytes, true, true, dreason,
221 : SandeshRxDropReason::NoDrop);
222 367681 : }
223 :
224 12535 : void SandeshMessageStatistics::UpdateRecv(const std::string &msg_name,
225 : uint64_t bytes) {
226 12535 : UpdateInternal(msg_name, bytes, false, false,
227 : SandeshTxDropReason::NoDrop, SandeshRxDropReason::NoDrop);
228 12535 : }
229 :
230 0 : void SandeshMessageStatistics::UpdateRecvFailed(const std::string &msg_name,
231 : uint64_t bytes, SandeshRxDropReason::type dreason) {
232 0 : UpdateInternal(msg_name, bytes, false, true,
233 : SandeshTxDropReason::NoDrop, dreason);
234 0 : }
235 :
236 393188 : void SandeshMessageStatistics::UpdateInternal(const std::string &msg_name,
237 : uint64_t bytes, bool is_tx, bool dropped,
238 : SandeshTxDropReason::type send_dreason,
239 : SandeshRxDropReason::type recv_dreason) {
240 393188 : if (deleted_) {
241 0 : return;
242 : }
243 : // Update detail stats
244 393188 : DetailStatsMap::iterator it = detail_type_stats_map_.find(msg_name);
245 393179 : if (it == detail_type_stats_map_.end()) {
246 1174 : std::string name(msg_name);
247 1174 : SandeshMessageTypeStats *n_detail_mtstats(new SandeshMessageTypeStats);
248 1174 : n_detail_mtstats->message_type = name;
249 1174 : it = (detail_type_stats_map_.insert(name, n_detail_mtstats)).first;
250 1174 : }
251 393178 : SandeshMessageTypeStats *detail_mtstats = it->second;
252 393176 : if (dropped) {
253 367668 : UpdateDetailStatsDrops(&detail_mtstats->stats, is_tx,
254 : bytes, send_dreason, recv_dreason);
255 367681 : UpdateDetailStatsDrops(&detail_agg_stats_, is_tx,
256 : bytes, send_dreason, recv_dreason);
257 : } else {
258 25508 : SandeshMessageStats *d_smstats(&detail_mtstats->stats);
259 25508 : if (is_tx) {
260 12973 : d_smstats->set_messages_sent(d_smstats->get_messages_sent() + 1);
261 12973 : d_smstats->set_bytes_sent(d_smstats->get_bytes_sent() + bytes);
262 12973 : detail_agg_stats_.set_messages_sent(
263 12973 : detail_agg_stats_.get_messages_sent() + 1);
264 12973 : detail_agg_stats_.set_bytes_sent(
265 12973 : detail_agg_stats_.get_bytes_sent() + bytes);
266 : } else {
267 12535 : d_smstats->set_messages_received(
268 12535 : d_smstats->get_messages_received() + 1);
269 12535 : d_smstats->set_bytes_received(
270 12535 : d_smstats->get_bytes_received() + bytes);
271 12535 : detail_agg_stats_.set_messages_received(
272 12535 : detail_agg_stats_.get_messages_received() + 1);
273 12535 : detail_agg_stats_.set_bytes_received(
274 12535 : detail_agg_stats_.get_bytes_received() + bytes);
275 : }
276 : }
277 : }
278 :
279 37 : void SandeshMessageStatistics::Shutdown() {
280 37 : deleted_ = true;
281 37 : }
282 : //
283 : // SandeshEventStatistics
284 : //
285 7 : void SandeshEventStatistics::Get(
286 : std::vector<SandeshStateMachineEvStats> *ev_stats) const {
287 7 : if (deleted_) {
288 0 : return;
289 : }
290 89 : BOOST_FOREACH(EventStatsMap::const_iterator::value_type it,
291 : event_stats_) {
292 41 : ev_stats->push_back(*it.second);
293 : }
294 7 : ev_stats->push_back(agg_stats_);
295 : }
296 :
297 54340 : void SandeshEventStatistics::Update(std::string &event_name, bool enqueue,
298 : bool fail) {
299 54340 : if (deleted_) {
300 0 : return;
301 : }
302 54340 : EventStatsMap::iterator it = event_stats_.find(event_name);
303 54340 : if (it == event_stats_.end()) {
304 812 : it = (event_stats_.insert(event_name, new SandeshStateMachineEvStats)).first;
305 : }
306 54338 : SandeshStateMachineEvStats *es = it->second;
307 54338 : es->set_event(event_name);
308 54341 : if (enqueue) {
309 27171 : if (fail) {
310 0 : es->set_enqueue_fails(es->get_enqueue_fails() + 1);
311 0 : agg_stats_.set_enqueue_fails(agg_stats_.get_enqueue_fails() + 1);
312 : } else {
313 27171 : es->set_enqueues(es->get_enqueues() + 1);
314 27171 : agg_stats_.set_enqueues(agg_stats_.get_enqueues() + 1);
315 : }
316 : } else {
317 27170 : if (fail) {
318 0 : es->set_dequeue_fails(es->get_dequeue_fails() + 1);
319 0 : agg_stats_.set_dequeue_fails(agg_stats_.get_dequeue_fails() + 1);
320 : } else {
321 27170 : es->set_dequeues(es->get_dequeues() + 1);
322 27170 : agg_stats_.set_dequeues(agg_stats_.get_dequeues() + 1);
323 : }
324 : }
325 : }
326 :
327 37 : void SandeshEventStatistics::Shutdown() {
328 37 : deleted_ = true;
329 37 : }
|