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