LCOV - code coverage report
Current view: top level - root/contrail/src/contrail-common/sandesh/library/cpp - sandesh_statistics.cc (source / functions) Hit Total Coverage
Test: OpenSDN C/C++ coverage (all TARGET_SET jobs) Lines: 94 230 40.9 %
Date: 2026-08-03 02:19:58 Functions: 10 15 66.7 %
Legend: Lines: hit not hit

          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 : }

Generated by: LCOV version 1.14