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-11-09 02:10:49 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             : // 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 : }

Generated by: LCOV version 1.14