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