VOM: stats 03/16603/2
authorNeale Ranns <nranns@cisco.com>
Sun, 23 Dec 2018 14:38:39 +0000 (06:38 -0800)
committerDamjan Marion <dmarion@me.com>
Sun, 23 Dec 2018 16:25:26 +0000 (16:25 +0000)
- onnly read when connected. use bool for state
- operator<< for counter_t
- only publish stats for interfaces that have them available

Change-Id: I66a8a336a05912592851c88e3af69155d840a573
Signed-off-by: Neale Ranns <nranns@cisco.com>
extras/vom/vom/interface.cpp
extras/vom/vom/interface.hpp
extras/vom/vom/stat_client.cpp
extras/vom/vom/stat_client.hpp
extras/vom/vom/stat_reader.cpp
extras/vom/vom/types.cpp
extras/vom/vom/types.hpp

index 97f7776..f2f32b4 100644 (file)
@@ -424,6 +424,8 @@ interface::set(const counter_t& count, const std::string& stat_type)
     m_stats.m_rx = count;
   else if ("tx" == stat_type)
     m_stats.m_tx = count;
+  else if ("drops" == stat_type)
+    m_stats.m_drop = count;
   else if ("rx-unicast" == stat_type)
     m_stats.m_rx_unicast = count;
   else if ("tx-unicast" == stat_type)
@@ -454,22 +456,12 @@ std::ostream&
 operator<<(std::ostream& os, const interface::stats_t& stats)
 {
   os << "["
-     << "rx [packets " << stats.m_rx.packets << ", bytes " << stats.m_rx.bytes
-     << "]"
-     << " rx-unicast [packets " << stats.m_rx_unicast.packets << ", bytes "
-     << stats.m_rx_unicast.bytes << "]"
-     << " rx-multicast [packets " << stats.m_rx_multicast.packets << ", bytes "
-     << stats.m_rx_multicast.bytes << "]"
-     << " rx-broadcast [packets " << stats.m_rx_broadcast.packets << ", bytes "
-     << stats.m_rx_broadcast.bytes << "]"
-     << " tx [packets " << stats.m_tx.packets << ", bytes " << stats.m_tx.bytes
-     << "]"
-     << " tx-unicast [packets " << stats.m_tx_unicast.packets << ", bytes "
-     << stats.m_tx_unicast.bytes << "]"
-     << " tx-multicast [packets " << stats.m_tx_multicast.packets << ", bytes "
-     << stats.m_tx_multicast.bytes << "]"
-     << " tx-broadcast [packets " << stats.m_tx_broadcast.packets << ", bytes "
-     << stats.m_tx_broadcast.bytes << "]]" << std::endl;
+     << "rx " << stats.m_rx << " rx-unicast " << stats.m_rx_unicast
+     << " rx-multicast " << stats.m_rx_multicast << " rx-broadcast "
+     << stats.m_rx_broadcast << " tx " << stats.m_tx << " tx-unicast "
+     << stats.m_tx_unicast << " tx-multicast " << stats.m_tx_multicast
+     << " tx-broadcast " << stats.m_tx_broadcast << " drops " << stats.m_drop
+     << "]" << std::endl;
 
   return (os);
 }
index 2f6511e..05642f0 100644 (file)
@@ -197,6 +197,7 @@ public:
     counter_t m_tx_multicast;
     counter_t m_rx_broadcast;
     counter_t m_tx_broadcast;
+    counter_t m_drop;
   };
 
   /**
index 6406e21..b2d4299 100644 (file)
@@ -78,7 +78,7 @@ stat_client::stat_data_t::get_stat_segment_combined_counter_data() const
 stat_client::stat_client(std::string& socket_name)
   : m_socket_name(socket_name)
   , m_patterns()
-  , m_stat_connect(0)
+  , m_stat_connect(false)
   , m_counter_vec()
   , m_stat_seg_data(nullptr)
   , m_stat_data()
@@ -89,7 +89,7 @@ stat_client::stat_client(std::string& socket_name)
 stat_client::stat_client(std::vector<std::string>& pattern)
   : m_socket_name("/run/vpp/stats.sock")
   , m_patterns(pattern)
-  , m_stat_connect(0)
+  , m_stat_connect(false)
   , m_counter_vec()
   , m_stat_seg_data(nullptr)
   , m_stat_data()
@@ -100,7 +100,7 @@ stat_client::stat_client(std::string socket_name,
                          std::vector<std::string> patterns)
   : m_socket_name(socket_name)
   , m_patterns(patterns)
-  , m_stat_connect(0)
+  , m_stat_connect(false)
   , m_counter_vec()
   , m_stat_seg_data(nullptr)
   , m_stat_data()
@@ -110,7 +110,7 @@ stat_client::stat_client(std::string socket_name,
 stat_client::stat_client()
   : m_socket_name("/run/vpp/stats.sock")
   , m_patterns()
-  , m_stat_connect(0)
+  , m_stat_connect(false)
   , m_counter_vec()
   , m_stat_seg_data(nullptr)
   , m_stat_data()
@@ -136,7 +136,7 @@ int
 stat_client::connect()
 {
   if (stat_segment_connect(m_socket_name.c_str()) == 0) {
-    m_stat_connect = 1;
+    m_stat_connect = true;
     ls();
   }
   return m_stat_connect;
@@ -147,6 +147,7 @@ stat_client::disconnect()
 {
   if (m_stat_connect)
     stat_segment_disconnect();
+  m_stat_connect = false;
 }
 
 int
@@ -176,17 +177,20 @@ const stat_client::stat_data_vec_t&
 stat_client::dump()
 {
   stat_segment_data_free(m_stat_seg_data);
+  m_stat_seg_data = NULL;
   if (m_stat_data.size()) {
     m_stat_data.clear();
   }
-  m_stat_seg_data = stat_segment_dump(m_counter_vec);
-  if (!m_stat_seg_data) {
-    ls();
-    return m_stat_data;
-  }
-  for (int i = 0; i < stat_segment_vec_len(m_stat_seg_data); i++) {
-    stat_data_t sd(m_stat_seg_data[i]);
-    m_stat_data.push_back(sd);
+  if (m_stat_connect) {
+    m_stat_seg_data = stat_segment_dump(m_counter_vec);
+    if (!m_stat_seg_data) {
+      ls();
+      return m_stat_data;
+    }
+    for (int i = 0; i < stat_segment_vec_len(m_stat_seg_data); i++) {
+      stat_data_t sd(m_stat_seg_data[i]);
+      m_stat_data.push_back(sd);
+    }
   }
   return m_stat_data;
 }
@@ -195,17 +199,20 @@ const stat_client::stat_data_vec_t&
 stat_client::dump_entry(uint32_t index)
 {
   stat_segment_data_free(m_stat_seg_data);
+  m_stat_seg_data = NULL;
   if (m_stat_data.size()) {
     m_stat_data.clear();
   }
-  m_stat_seg_data = stat_segment_dump_entry(index);
-  if (!m_stat_seg_data) {
-    ls();
-    return m_stat_data;
-  }
-  for (int i = 0; i < stat_segment_vec_len(m_stat_seg_data); i++) {
-    stat_data_t sd(m_stat_seg_data[i]);
-    m_stat_data.push_back(sd);
+  if (m_stat_connect) {
+    m_stat_seg_data = stat_segment_dump_entry(index);
+    if (!m_stat_seg_data) {
+      ls();
+      return m_stat_data;
+    }
+    for (int i = 0; i < stat_segment_vec_len(m_stat_seg_data); i++) {
+      stat_data_t sd(m_stat_seg_data[i]);
+      m_stat_data.push_back(sd);
+    }
   }
   return m_stat_data;
 }
index 40729fe..8e014da 100644 (file)
@@ -179,7 +179,7 @@ private:
   /**
    * connection bit
    */
-  int m_stat_connect;
+  bool m_stat_connect;
 
   /**
    * Pointer to VPP style vector of stat indexes
index 82e09ae..1851f74 100644 (file)
@@ -61,7 +61,9 @@ stat_reader::unregisters(const interface& intf)
 void
 stat_reader::read()
 {
+  std::set<std::shared_ptr<interface>> itfs_w_stats;
   const stat_client::stat_data_vec_t& sd = m_client.dump();
+
   for (auto& sde : sd) {
     std::string name;
 
@@ -70,20 +72,41 @@ stat_reader::read()
 
     name = sde.name();
 
+    if (name.find("/if") != std::string::npos)
+      name.erase(0, 4);
+
     switch (sde.type()) {
-      case STAT_DIR_TYPE_COUNTER_VECTOR_SIMPLE:
       case STAT_DIR_TYPE_ERROR_INDEX:
       case STAT_DIR_TYPE_SCALAR_INDEX:
       case STAT_DIR_TYPE_ILLEGAL:
         break;
 
+      case STAT_DIR_TYPE_COUNTER_VECTOR_SIMPLE: {
+        uint64_t** data;
+
+        data = sde.get_stat_segment_simple_counter_data();
+
+        for (auto& i : m_stat_itf_indexes) {
+          counter_t count;
+
+          for (int k = 0; k < m_client.vec_len(data); k++) {
+            count.packets += data[k][i];
+          }
+
+          std::shared_ptr<interface> itf = interface::find(i);
+          if (itf) {
+            itf->set(count, name);
+            itfs_w_stats.insert(itf);
+          }
+        }
+        break;
+      }
+
       case STAT_DIR_TYPE_COUNTER_VECTOR_COMBINED: {
         vlib_counter_t** data;
 
         data = sde.get_stat_segment_combined_counter_data();
 
-        if (name.find("/if") != std::string::npos)
-          name.erase(0, 4);
         for (auto& i : m_stat_itf_indexes) {
           counter_t count;
 
@@ -91,19 +114,19 @@ stat_reader::read()
             count.packets += data[k][i].packets;
             count.bytes += data[k][i].bytes;
           }
+
           std::shared_ptr<interface> itf = interface::find(i);
-          if (itf)
+          if (itf) {
             itf->set(count, name);
+            itfs_w_stats.insert(itf);
+          }
         }
         break;
       }
     }
   }
-
-  for (auto& i : m_stat_itf_indexes) {
-    std::shared_ptr<interface> itf = interface::find(i);
-    if (itf)
-      itf->publish_stats();
+  for (auto itf : itfs_w_stats) {
+    itf->publish_stats();
   }
 }
 
index a67a7f3..0236df2 100644 (file)
@@ -324,6 +324,13 @@ ethertype_t::from_numeric_val(uint16_t numeric)
   return (ethertype_t::UNSPECIFIED);
 }
 
+std::ostream&
+operator<<(std::ostream& os, const counter_t& c)
+{
+  os << "[packets: " << c.packets << " bytes:" << c.bytes << "]";
+  return os;
+}
+
 }; // namespace VOM
 
 /*
index e3b21ad..56759d5 100644 (file)
@@ -385,6 +385,11 @@ struct counter_t
     , bytes(0)
   {
   }
+  counter_t(const counter_t& c)
+    : packets(c.packets)
+    , bytes(c.bytes)
+  {
+  }
   uint64_t packets;
   uint64_t bytes;
 };
@@ -398,6 +403,11 @@ std::ostream& operator<<(std::ostream& os, const mac_address_t& mac);
  * Ostream operator for a MAC address
  */
 std::ostream& operator<<(std::ostream& os, const l2_address_t& l2);
+
+/**
+ * Ostream operator for a MAC address
+ */
+std::ostream& operator<<(std::ostream& os, const counter_t& c);
 };
 
 /*