OpenSDN source code
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
stats_manager.h
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2015 Juniper Networks, Inc. All rights reserved.
3  */
4 
5 #ifndef _ROOT_STATS_MANAGER_H_
6 #define _ROOT_STATS_MANAGER_H_
7 
8 #include <cmn/agent_cmn.h>
9 #include <cmn/agent_stats.h>
10 #include <oper/vrf.h>
11 #include <oper/interface.h>
12 #include <vrouter_types.h>
13 #include <string>
14 #include <map>
15 #include <utility>
17 #include <vr_types.h>
18 #include <uve/agent_uve.h>
19 
21  uint64_t prev_time_;
23  uint64_t prev_flow_aged_;
24 
27  }
28 };
29 
30 #define DEFAULT_FUVE_REQUEST_QUEUE_SIZE (4*1024*1024)
31 
32 // The container class for storing stats queried from vrouter
33 // Defines routines for storing and managing (add, delete and query)
34 // interface, vrf and drop statistics
35 class StatsManager {
36  public:
37  struct InterfaceStats {
39  void UpdateStats(uint64_t in_b, uint64_t in_p, uint64_t out_b,
40  uint64_t out_p);
41  void UpdatePrevStats();
42  void GetDiffStats(uint64_t *in_b, uint64_t *out_b) const;
43 
44  std::string name;
45  int32_t speed;
46  int32_t duplexity;
47  uint64_t in_pkts;
48  uint64_t in_bytes;
49  uint64_t out_pkts;
50  uint64_t out_bytes;
51  uint64_t prev_in_bytes;
52  uint64_t prev_out_bytes;
55  uint64_t stats_time;
60  vr_drop_stats_req drop_stats;
61  };
62  struct VrfStats {
63  VrfStats();
64  std::string name;
65  uint64_t discards;
66  uint64_t resolves;
67  uint64_t receives;
68  uint64_t udp_tunnels;
69  uint64_t udp_mpls_tunnels;
70  uint64_t gre_mpls_tunnels;
71  uint64_t ecmp_composites;
74  uint64_t encaps;
75  uint64_t l2_encaps;
76  uint64_t gros;
77  uint64_t diags;
78  uint64_t encap_composites;
79  uint64_t evpn_composites;
80  uint64_t vrf_translates;
81  uint64_t vxlan_tunnels;
86  uint64_t arp_tor_proxy;
88  uint64_t l2_receives;
89  uint64_t uuc_floods;
90 
91  uint64_t prev_discards;
92  uint64_t prev_resolves;
93  uint64_t prev_receives;
94  uint64_t prev_udp_tunnels;
100  uint64_t prev_encaps;
101  uint64_t prev_l2_encaps;
102  uint64_t prev_gros;
103  uint64_t prev_diags;
115  uint64_t prev_uuc_floods;
116 
117  uint64_t k_discards;
118  uint64_t k_resolves;
119  uint64_t k_receives;
120  uint64_t k_udp_tunnels;
126  uint64_t k_encaps;
127  uint64_t k_l2_encaps;
128  uint64_t k_gros;
129  uint64_t k_diags;
133  uint64_t k_vxlan_tunnels;
138  uint64_t k_arp_tor_proxy;
140  uint64_t k_l2_receives;
141  uint64_t k_uuc_floods;
142  };
143 
144  typedef std::map<const Interface *, InterfaceStats> InterfaceStatsTree;
145  typedef std::pair<const Interface *, InterfaceStats> InterfaceStatsPair;
146  typedef std::map<int, VrfStats> VrfIdToVrfStatsTree;
147  typedef std::pair<int, VrfStats> VrfStatsPair;
148 
150  std::string interface;
151  std::string sg_rule_uuid;
154  FlowRuleMatchInfo(const std::string &itf, const std::string &sg_rule,
155  const FlowUveFwPolicyInfo &fw_info,
156  const FlowUveVnAcePolicyInfo &nw_ace_info) :
157  interface(itf), sg_rule_uuid(sg_rule), fw_policy_info(fw_info),
158  vn_ace_info(nw_ace_info) {
159  }
160  bool IsFwPolicyInfoEqual(const FlowUveFwPolicyInfo &info) const {
161  if (fw_policy_info.is_valid_ != info.is_valid_) {
162  return false;
163  }
165  return false;
166  }
167  if (fw_policy_info.fw_policy_ != info.fw_policy_) {
168  return false;
169  }
171  return false;
172  }
174  return false;
175  }
176  if (fw_policy_info.local_vn_ != info.local_vn_) {
177  return false;
178  }
179  if (fw_policy_info.remote_vn_ != info.remote_vn_) {
180  return false;
181  }
182  if (fw_policy_info.initiator_ != info.initiator_) {
183  return false;
184  }
185  return true;
186  }
187  bool IsVnAceInfoEqual(const FlowUveVnAcePolicyInfo &info) const {
188  if (vn_ace_info.vn_ != info.vn_) {
189  return false;
190  }
191  if (vn_ace_info.nw_ace_uuid_ != info.nw_ace_uuid_) {
192  return false;
193  }
194  return true;
195  }
196  };
197 
198  typedef std::map<const boost::uuids::uuid, FlowRuleMatchInfo> FlowAceTree;
199  typedef std::pair<const boost::uuids::uuid, FlowRuleMatchInfo> FlowAcePair;
200 
201  explicit StatsManager(Agent *agent);
202  virtual ~StatsManager();
203 
204  vr_drop_stats_req drop_stats() const { return drop_stats_; }
205  void set_drop_stats(const vr_drop_stats_req &req) { drop_stats_ = req; }
206 
207  InterfaceStats* GetInterfaceStats(const Interface *intf);
208 
209  VrfStats* GetVrfStats(int vrf_id);
210  std::string GetNamelessVrf() { return "__untitled__"; }
211  int GetNamelessVrfId() { return -1; }
212  void Shutdown(void);
213  void RegisterDBClients();
214  void InitDone();
215  bool RequestHandler(boost::shared_ptr<FlowUveStatsRequest> req);
216  void EnqueueEvent(const boost::shared_ptr<FlowUveStatsRequest> &req);
219  FlowRateComputeInfo &flow_info,
220  VrouterFlowRate &flow_rate) const;
221  void BuildDropStats(const vr_drop_stats_req &r,
222  AgentDropStats &ds) const;
224 
225  private:
226  void VrfNotify(DBTablePartBase *partition, DBEntryBase *e);
229  void AddInterfaceStatsEntry(const Interface *intf);
230  void DelInterfaceStatsEntry(const Interface *intf);
231  void AddUpdateVrfStatsEntry(const VrfEntry *intf);
232  void DelVrfStatsEntry(const VrfEntry *intf);
233  void AddFlow(const FlowUveStatsRequest *req);
234  void DeleteFlow(const FlowUveStatsRequest *req);
235  bool FlowStatsUpdate();
236 
240  vr_drop_stats_req drop_stats_;
247 };
248 #endif // _ROOT_STATS_MANAGER_H_
void AddNamelessVrfStatsEntry()
VrfStats * GetVrfStats(int vrf_id)
uint64_t prev_l2_mcast_composites
Definition: stats_manager.h:98
FlowUveFwPolicyInfo fw_policy_info
vr_drop_stats_req drop_stats_
Definition: vrf.h:86
WorkQueue< boost::shared_ptr< FlowUveStatsRequest > > request_queue_
uint64_t prev_gre_mpls_tunnels
Definition: stats_manager.h:96
FlowAceTree flow_ace_tree_
StatsManager(Agent *agent)
std::pair< const boost::uuids::uuid, FlowRuleMatchInfo > FlowAcePair
InterfaceStatsTree if_stats_tree_
Agent * agent_
vr_drop_stats_req drop_stats() const
uint64_t prev_fabric_composites
Definition: stats_manager.h:99
int ListenerId
Definition: db_table.h:62
DISALLOW_COPY_AND_ASSIGN(StatsManager)
uint64_t prev_arp_physical_flood
void BuildDropStats(const vr_drop_stats_req &r, AgentDropStats &ds) const
void RegisterDBClients()
void Shutdown(void)
uint64_t prev_flow_created_
Definition: stats_manager.h:22
void DelVrfStatsEntry(const VrfEntry *intf)
bool RequestHandler(boost::shared_ptr< FlowUveStatsRequest > req)
void DeleteFlow(const FlowUveStatsRequest *req)
std::map< const boost::uuids::uuid, FlowRuleMatchInfo > FlowAceTree
virtual ~StatsManager()
std::map< int, VrfStats > VrfIdToVrfStatsTree
Definition: agent.h:358
FlowRateComputeInfo flow_info
Definition: stats_manager.h:56
void AddInterfaceStatsEntry(const Interface *intf)
VrfIdToVrfStatsTree vrf_stats_tree_
void EnqueueEvent(const boost::shared_ptr< FlowUveStatsRequest > &req)
uint64_t prev_udp_mpls_tunnels
Definition: stats_manager.h:95
vr_drop_stats_req drop_stats
Definition: stats_manager.h:60
bool IsFwPolicyInfoEqual(const FlowUveFwPolicyInfo &info) const
AgentStats::FlowCounters deleted
Definition: stats_manager.h:58
std::pair< const Interface *, InterfaceStats > InterfaceStatsPair
bool BuildFlowRate(AgentStats::FlowCounters &created, AgentStats::FlowCounters &aged, FlowRateComputeInfo &flow_info, VrouterFlowRate &flow_rate) const
void AddFlow(const FlowUveStatsRequest *req)
bool IsVnAceInfoEqual(const FlowUveVnAcePolicyInfo &info) const
void InterfaceNotify(DBTablePartBase *part, DBEntryBase *e)
friend class AgentStatsCollectorTest
AgentStats::FlowCounters added
Definition: stats_manager.h:57
bool FlowStatsUpdate()
static uint64_t UTCTimestampUsec()
Definition: time_util.h:13
uint64_t prev_arp_virtual_stitch
uint64_t prev_arp_physical_stitch
std::string GetNamelessVrf()
void AddUpdateVrfStatsEntry(const VrfEntry *intf)
Timer * timer_
void DelInterfaceStatsEntry(const Interface *intf)
uint64_t prev_flow_aged_
Definition: stats_manager.h:23
std::map< const Interface *, InterfaceStats > InterfaceStatsTree
void set_drop_stats(const vr_drop_stats_req &req)
Definition: timer.h:54
DBTableBase::ListenerId vrf_listener_id_
void GetDiffStats(uint64_t *in_b, uint64_t *out_b) const
std::pair< int, VrfStats > VrfStatsPair
int GetNamelessVrfId()
void UpdateStats(uint64_t in_b, uint64_t in_p, uint64_t out_b, uint64_t out_p)
InterfaceStats * GetInterfaceStats(const Interface *intf)
void VrfNotify(DBTablePartBase *partition, DBEntryBase *e)
FlowRuleMatchInfo(const std::string &itf, const std::string &sg_rule, const FlowUveFwPolicyInfo &fw_info, const FlowUveVnAcePolicyInfo &nw_ace_info)
FlowUveVnAcePolicyInfo vn_ace_info
DBTableBase::ListenerId intf_listener_id_