OpenSDN source code
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
stats_manager.cc
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2015 Juniper Networks, Inc. All rights reserved.
3  */
4 
5 #include <uve/stats_manager.h>
6 #include <uve/vn_uve_table.h>
8 #include <oper/vm_interface.h>
9 #include <uve/agent_uve_stats.h>
10 
12  : vrf_listener_id_(DBTableBase::kInvalidId),
13  intf_listener_id_(DBTableBase::kInvalidId), agent_(agent),
14  request_queue_(agent->task_scheduler()->GetTaskId("Agent::Uve"), 0,
15  boost::bind(&StatsManager::RequestHandler, this, _1),
17  timer_(TimerManager::CreateTimer
18  (*(agent->event_manager())->io_service(), "IntfFlowStatsUpdateTimer",
19  TaskScheduler::GetInstance()->GetTaskId(kTaskFlowStatsUpdate), 1)) {
22 }
23 
25 }
26 
28  InterfaceStatsTree::iterator it;
29  it = if_stats_tree_.find(intf);
30  if (it == if_stats_tree_.end()) {
31  InterfaceStats stats;
32  stats.name = intf->name();
33  if_stats_tree_.insert(InterfaceStatsPair(intf, stats));
34  }
35 }
36 
38  InterfaceStatsTree::iterator it;
39  it = if_stats_tree_.find(intf);
40  if (it != if_stats_tree_.end()) {
41  if_stats_tree_.erase(it);
42  }
43 }
44 
46  VrfStats stats;
47  stats.name = GetNamelessVrf();
49 }
50 
52  StatsManager::VrfIdToVrfStatsTree::iterator it;
53  it = vrf_stats_tree_.find(vrf->vrf_id());
54  if (it == vrf_stats_tree_.end()) {
55  VrfStats stats;
56  stats.name = vrf->GetName();
57  vrf_stats_tree_.insert(VrfStatsPair(vrf->vrf_id(), stats));
58  } else {
59  /* Vrf could be deleted in agent oper DB but not in Kernel. To handle
60  * this case we maintain vrfstats object in StatsManager even
61  * when vrf is absent in agent oper DB. Since vrf could get deleted and
62  * re-added we need to update the name in vrfstats object.
63  */
64  VrfStats *stats = &it->second;
65  stats->name = vrf->GetName();
66  }
67 }
68 
70  StatsManager::VrfIdToVrfStatsTree::iterator it;
71  it = vrf_stats_tree_.find(vrf->vrf_id());
72  if (it != vrf_stats_tree_.end()) {
73  VrfStats *stats = &it->second;
74  stats->prev_discards = stats->k_discards;
75  stats->prev_resolves = stats->k_resolves;
76  stats->prev_receives = stats->k_receives;
78  stats->prev_udp_tunnels = stats->k_udp_tunnels;
83  stats->prev_l2_encaps = stats->k_l2_encaps;
84  stats->prev_encaps = stats->k_encaps;
85  stats->prev_gros = stats->gros;
86  stats->prev_diags = stats->diags;
88  stats->prev_evpn_composites = stats->evpn_composites;
89  stats->prev_vrf_translates = stats->vrf_translates;
90  stats->prev_vxlan_tunnels = stats->vxlan_tunnels;
95  stats->prev_arp_tor_proxy = stats->arp_tor_proxy;
97  stats->prev_l2_receives = stats->l2_receives;
98  stats->prev_uuc_floods = stats->uuc_floods;
99  }
100 }
101 
103  (const Interface *intf) {
104  StatsManager::InterfaceStatsTree::iterator it;
105 
106  it = if_stats_tree_.find(intf);
107  if (it == if_stats_tree_.end()) {
108  return NULL;
109  }
110 
111  return &it->second;
112 }
113 
115  StatsManager::VrfIdToVrfStatsTree::iterator it;
116  it = vrf_stats_tree_.find(vrf_id);
117  if (it == vrf_stats_tree_.end()) {
118  return NULL;
119  }
120 
121  return &it->second;
122 }
123 
125  const Interface *intf = static_cast<const Interface *>(e);
126  const VmInterface *vmi = NULL;
127  bool set_state = false, reset_state = false;
128 
129  DBState *state = static_cast<DBState *>
130  (e->GetState(part->parent(), intf_listener_id_));
131  switch (intf->type()) {
133  vmi = static_cast<const VmInterface *>(intf);
134  if (e->IsDeleted() || (vmi->IsUveActive() == false)) {
135  if (state) {
136  reset_state = true;
137  }
138  } else {
139  if (!state) {
140  set_state = true;
141  }
142  }
143  break;
144  default:
145  if (e->IsDeleted()) {
146  if (state) {
147  reset_state = true;
148  }
149  } else {
150  if (!state) {
151  set_state = true;
152  }
153  }
154  }
155  if (set_state) {
156  state = new DBState();
157  e->SetState(part->parent(), intf_listener_id_, state);
159  } else if (reset_state) {
161  delete state;
162  e->ClearState(part->parent(), intf_listener_id_);
163  }
164  return;
165 }
166 
168  const VrfEntry *vrf = static_cast<const VrfEntry *>(e);
169  DBState *state = static_cast<DBState *>
170  (e->GetState(part->parent(), vrf_listener_id_));
171  if (e->IsDeleted()) {
172  if (state) {
173  DelVrfStatsEntry(vrf);
174  delete state;
175  e->ClearState(part->parent(), vrf_listener_id_);
176  }
177  } else {
178  if (!state) {
179  state = new DBState();
180  e->SetState(part->parent(), vrf_listener_id_, state);
181  }
183  }
184 }
185 
187  InterfaceTable *intf_table = agent_->interface_table();
188  intf_listener_id_ = intf_table->Register
189  (boost::bind(&StatsManager::InterfaceNotify, this, _1, _2));
190 
191  VrfTable *vrf_table = agent_->vrf_table();
192  vrf_listener_id_ = vrf_table->Register
193  (boost::bind(&StatsManager::VrfNotify, this, _1, _2));
194 }
195 
200  if (timer_) {
201  timer_->Cancel();
203  }
204 }
205 
207  : name(""), speed(0), duplexity(0), in_pkts(0), in_bytes(0),
208  out_pkts(0), out_bytes(0), prev_in_bytes(0), prev_out_bytes(0)
209  , prev_5min_in_bytes(0), prev_5min_out_bytes(0), stats_time(0), flow_info(),
210  added(), deleted(), drop_stats_received(false) {
211 }
212 
214  (uint64_t in_b, uint64_t in_p, uint64_t out_b, uint64_t out_p) {
215  in_bytes = in_b;
216  in_pkts = in_p;
217  out_bytes = out_b;
218  out_pkts = out_p;
219 }
220 
222  prev_in_bytes = in_bytes;
223  prev_out_bytes = out_bytes;
224 }
225 
227  uint64_t *out_b) const {
228  *in_b = in_bytes - prev_in_bytes;
229  *out_b = out_bytes - prev_out_bytes;
230 }
231 
233  : name(""), discards(0), resolves(0), receives(0), udp_tunnels(0),
234  udp_mpls_tunnels(0), gre_mpls_tunnels(0), ecmp_composites(0),
235  l2_mcast_composites(0), fabric_composites(0), encaps(0), l2_encaps(0),
236  gros(0), diags(0), encap_composites(0), evpn_composites(0),
237  vrf_translates(0), vxlan_tunnels(0), arp_virtual_proxy(0),
238  arp_virtual_stitch(0), arp_virtual_flood(0), arp_physical_stitch(0),
239  arp_tor_proxy(0), arp_physical_flood(0), l2_receives(0), uuc_floods(0),
240  prev_discards(0), prev_resolves(0), prev_receives(0), prev_udp_tunnels(0),
241  prev_udp_mpls_tunnels(0), prev_gre_mpls_tunnels(0), prev_ecmp_composites(0),
242  prev_l2_mcast_composites(0), prev_fabric_composites(0), prev_encaps(0),
243  prev_l2_encaps(0), prev_gros(0), prev_diags(0), prev_encap_composites(0),
244  prev_evpn_composites(0), prev_vrf_translates(0), prev_vxlan_tunnels(0),
245  prev_arp_virtual_proxy(0), prev_arp_virtual_stitch(0),
246  prev_arp_virtual_flood(0), prev_arp_physical_stitch(0),
247  prev_arp_tor_proxy(0), prev_arp_physical_flood(0), prev_l2_receives(0),
248  prev_uuc_floods(0), k_discards(0), k_resolves(0), k_receives(0),
249  k_udp_tunnels(0), k_udp_mpls_tunnels(0), k_gre_mpls_tunnels(0),
250  k_ecmp_composites(0), k_l2_mcast_composites(0), k_fabric_composites(0),
251  k_encaps(0), k_l2_encaps(0), k_gros(0), k_diags(0), k_encap_composites(0),
252  k_evpn_composites(0), k_vrf_translates(0), k_vxlan_tunnels(0),
253  k_arp_virtual_proxy(0), k_arp_virtual_stitch(0), k_arp_virtual_flood(0),
254  k_arp_physical_stitch(0), k_arp_tor_proxy(0), k_arp_physical_flood(0),
255  k_l2_receives(0), k_uuc_floods(0) {
256 }
257 
259  FlowAceTree::iterator it = flow_ace_tree_.find(req->uuid());
260  AgentUveStats *uve = static_cast<AgentUveStats *>(agent_->uve());
261  InterfaceUveStatsTable *itable = static_cast<InterfaceUveStatsTable *>
262  (uve->interface_uve_table());
263  VnUveTable *vtable = static_cast<VnUveTable *>(uve->vn_uve_table());
264  FlowUveFwPolicyInfo fw_info = req->fw_policy_info();
265  if (fw_info.is_valid_) {
266  assert(fw_info.added_);
267  }
268  if (it == flow_ace_tree_.end()) {
269  InterfaceStats stats;
270  itable->IncrInterfaceAceStats(req);
271  bool fw_valid = itable->IncrInterfaceEndpointHits(req->interface(),
272  fw_info);
273  fw_info.is_valid_ = fw_valid;
274  vtable->IncrVnAceStats(req->vn_ace_info());
275  FlowRuleMatchInfo info(req->interface(), req->sg_rule_uuid(), fw_info,
276  req->vn_ace_info());
277  flow_ace_tree_.insert(FlowAcePair(req->uuid(), info));
278  } else {
279  FlowRuleMatchInfo &info = it->second;
280  bool intf_changed = false;
281  const string old_itf = info.interface;
282  if (req->interface() != info.interface) {
283  info.interface = req->interface();
284  intf_changed = true;
285  }
286  if (intf_changed || (req->sg_rule_uuid() != info.sg_rule_uuid)) {
287  itable->IncrInterfaceAceStats(req);
288  info.sg_rule_uuid = req->sg_rule_uuid();
289  }
290  if (intf_changed ||
291  (fw_info.is_valid_ && !info.IsFwPolicyInfoEqual(fw_info))) {
292  /* When there is change either in interface-name or key of
293  * Endpoint record, treat it as delete for old key and add for new
294  * key.
295  * (a) Increment added counter for new interface and new key
296  * (b) Increment deleted counter for old interface and old key
297  * (c) Update flow to point to new key
298  */
299  if (itable->IncrInterfaceEndpointHits(req->interface(), fw_info)) {
300  /* Increment deleted counter for old interface and old key */
301  FlowUveFwPolicyInfo old_info = info.fw_policy_info;
302  old_info.added_ = false;
303  itable->IncrInterfaceEndpointHits(old_itf, old_info);
304  /* Update the flow with new key of endpoint after delete
305  * counter is incremented */
306  info.fw_policy_info = fw_info;
307  }
308  }
309  if (!info.IsVnAceInfoEqual(req->vn_ace_info())) {
310  vtable->IncrVnAceStats(req->vn_ace_info());
311  info.vn_ace_info = req->vn_ace_info();
312  }
313  }
314 }
315 
317  FlowAceTree::iterator it = flow_ace_tree_.find(req->uuid());
318  if (it == flow_ace_tree_.end()) {
319  return;
320  }
321  FlowRuleMatchInfo &old_fw_info = it->second;
322  const FlowUveFwPolicyInfo &new_fw_info = req->fw_policy_info();
323  /* Increment deleted counter only if add counter was incremented earlier
324  * for this. This is determined by checking whether old and new keys are
325  * equal */
326  if (old_fw_info.IsFwPolicyInfoEqual(new_fw_info)) {
327  AgentUveStats *uve = static_cast<AgentUveStats *>(agent_->uve());
328  InterfaceUveStatsTable *itable = static_cast<InterfaceUveStatsTable *>
329  (uve->interface_uve_table());
330  itable->IncrInterfaceEndpointHits(req->interface(), new_fw_info);
331  }
332  flow_ace_tree_.erase(it);
333 }
334 
335 void StatsManager::EnqueueEvent(const boost::shared_ptr<FlowUveStatsRequest>
336  &req) {
337  request_queue_.Enqueue(req);
338 }
339 
340 bool StatsManager::RequestHandler(boost::shared_ptr<FlowUveStatsRequest> req) {
341  switch (req->event()) {
343  AddFlow(req.get());
344  break;
346  DeleteFlow(req.get());
347  break;
348  default:
349  assert(0);
350  }
351  return true;
352 }
353 
356  FlowRateComputeInfo &flow_info,
357  VrouterFlowRate &flow_rate) const {
358  uint64_t max_add_rate = 0, min_add_rate = 0;
359  uint64_t max_del_rate = 0, min_del_rate = 0;
360  uint64_t cur_time = UTCTimestampUsec();
361  if (flow_info.prev_time_) {
362  uint64_t diff_time = cur_time - flow_info.prev_time_;
363  uint64_t diff_secs = diff_time / 1000000;
364  if (diff_secs) {
365  uint64_t created_flows = created.prev_flow_count -
366  flow_info.prev_flow_created_;
367  uint64_t aged_flows = aged.prev_flow_count -
368  flow_info.prev_flow_aged_;
369  //Flow setup/delete rate are always sent
370  if (created_flows) {
371  max_add_rate = created.max_flows_per_second;
372  min_add_rate = created.min_flows_per_second;
373  if (max_add_rate == AgentStats::kInvalidFlowCount) {
374  LOG(WARN, "Invalid max_flow_adds_per_second " << max_add_rate);
375  max_add_rate = 0;
376  }
377  if (min_add_rate == AgentStats::kInvalidFlowCount) {
378  LOG(WARN, "Invalid min_flow_adds_per_second " << min_add_rate);
379  min_add_rate = 0;
380  }
381  }
382  if (aged_flows) {
383  max_del_rate = aged.max_flows_per_second;
384  min_del_rate = aged.min_flows_per_second;
385  if (max_del_rate == AgentStats::kInvalidFlowCount) {
386  LOG(WARN, "Invalid max_flow_deletes_per_second " << max_del_rate);
387  max_del_rate = 0;
388  }
389  if (min_del_rate == AgentStats::kInvalidFlowCount) {
390  LOG(WARN, "Invalid min_flow_deletes_per_second " << min_del_rate);
391  min_del_rate = 0;
392  }
393  }
394 
395  flow_rate.set_added_flows(created_flows);
396  flow_rate.set_max_flow_adds_per_second(max_add_rate);
397  flow_rate.set_min_flow_adds_per_second(min_add_rate);
398  flow_rate.set_deleted_flows(aged_flows);
399  flow_rate.set_max_flow_deletes_per_second(max_del_rate);
400  flow_rate.set_min_flow_deletes_per_second(min_del_rate);
401  agent_->stats()->ResetFlowMinMaxStats(created);
403  flow_info.prev_time_ = cur_time;
404  flow_info.prev_flow_created_ = created.prev_flow_count;
405  flow_info.prev_flow_aged_ = aged.prev_flow_count;
406  flow_rate.set_hold_flows(agent_->stats()->hold_flow_count());
407  return true;
408  }
409  } else {
410  flow_info.prev_time_ = cur_time;
411  }
412  return false;
413 }
414 
416  InterfaceStatsTree::iterator it;
417  it = if_stats_tree_.begin();
418  while (it != if_stats_tree_.end()) {
419  InterfaceStats &s = it->second;
420  uint64_t created = 0, aged = 0;
421  uint32_t dummy; //not used
422  agent_->pkt()->get_flow_proto()->InterfaceFlowCount(it->first, &created,
423  &aged, &dummy);
424  agent_->stats()->UpdateFlowMinMaxStats(created, s.added);
426  ++it;
427  }
428  return true;
429 }
430 
433  boost::bind(&StatsManager::FlowStatsUpdate, this));
434 }
435 
436 void StatsManager::BuildDropStats(const vr_drop_stats_req &req,
437  AgentDropStats &ds) const {
438  ds.set_ds_discard(req.get_vds_discard());
439  uint64_t drop_pkts = ds.get_ds_discard();
440 
441  ds.set_ds_pull(req.get_vds_pull());
442  drop_pkts += ds.get_ds_pull();
443 
444  ds.set_ds_invalid_if(req.get_vds_invalid_if());
445  drop_pkts += ds.get_ds_invalid_if();
446 
447  ds.set_ds_invalid_arp(req.get_vds_invalid_arp());
448  drop_pkts += ds.get_ds_invalid_arp();
449 
450  ds.set_ds_trap_no_if(req.get_vds_trap_no_if());
451  drop_pkts += ds.get_ds_trap_no_if();
452 
453  ds.set_ds_nowhere_to_go(req.get_vds_nowhere_to_go());
454  drop_pkts += ds.get_ds_nowhere_to_go();
455 
456  ds.set_ds_flow_queue_limit_exceeded(req.get_vds_flow_queue_limit_exceeded());
457  drop_pkts += ds.get_ds_flow_queue_limit_exceeded();
458 
459  ds.set_ds_flow_no_memory(req.get_vds_flow_no_memory());
460  drop_pkts += ds.get_ds_flow_no_memory();
461 
462  ds.set_ds_flow_invalid_protocol(req.get_vds_flow_invalid_protocol());
463  drop_pkts += ds.get_ds_flow_invalid_protocol();
464 
465  ds.set_ds_flow_nat_no_rflow(req.get_vds_flow_nat_no_rflow());
466  drop_pkts += ds.get_ds_flow_nat_no_rflow();
467 
468  ds.set_ds_flow_action_drop(req.get_vds_flow_action_drop());
469  drop_pkts += ds.get_ds_flow_action_drop();
470 
471  ds.set_ds_flow_action_invalid(req.get_vds_flow_action_invalid());
472  drop_pkts += ds.get_ds_flow_action_invalid();
473 
474  ds.set_ds_flow_unusable(req.get_vds_flow_unusable());
475  drop_pkts += ds.get_ds_flow_unusable();
476 
477  ds.set_ds_flow_table_full(req.get_vds_flow_table_full());
478  drop_pkts += ds.get_ds_flow_table_full();
479 
480  ds.set_ds_interface_tx_discard(req.get_vds_interface_tx_discard());
481  drop_pkts += ds.get_ds_interface_tx_discard();
482 
483  ds.set_ds_interface_drop(req.get_vds_interface_drop());
484  drop_pkts += ds.get_ds_interface_drop();
485 
486  ds.set_ds_duplicated(req.get_vds_duplicated());
487  drop_pkts += ds.get_ds_duplicated();
488 
489  ds.set_ds_push(req.get_vds_push());
490  drop_pkts += ds.get_ds_push();
491 
492  ds.set_ds_ttl_exceeded(req.get_vds_ttl_exceeded());
493  drop_pkts += ds.get_ds_ttl_exceeded();
494 
495  ds.set_ds_invalid_nh(req.get_vds_invalid_nh());
496  drop_pkts += ds.get_ds_invalid_nh();
497 
498  ds.set_ds_invalid_label(req.get_vds_invalid_label());
499  drop_pkts += ds.get_ds_invalid_label();
500 
501  ds.set_ds_invalid_protocol(req.get_vds_invalid_protocol());
502  drop_pkts += ds.get_ds_invalid_protocol();
503 
504  ds.set_ds_interface_rx_discard(req.get_vds_interface_rx_discard());
505  drop_pkts += ds.get_ds_interface_rx_discard();
506 
507  ds.set_ds_invalid_mcast_source(req.get_vds_invalid_mcast_source());
508  drop_pkts += ds.get_ds_invalid_mcast_source();
509 
510  ds.set_ds_head_alloc_fail(req.get_vds_head_alloc_fail());
511  drop_pkts += ds.get_ds_head_alloc_fail();
512 
513  ds.set_ds_pcow_fail(req.get_vds_pcow_fail());
514  drop_pkts += ds.get_ds_pcow_fail();
515 
516  ds.set_ds_mcast_clone_fail(req.get_vds_mcast_clone_fail());
517  drop_pkts += ds.get_ds_mcast_clone_fail();
518 
519  ds.set_ds_mcast_df_bit(req.get_vds_mcast_df_bit());
520  drop_pkts += ds.get_ds_mcast_df_bit();
521 
522  ds.set_ds_no_memory(req.get_vds_no_memory());
523  drop_pkts += ds.get_ds_no_memory();
524 
525  ds.set_ds_rewrite_fail(req.get_vds_rewrite_fail());
526  drop_pkts += ds.get_ds_rewrite_fail();
527 
528  ds.set_ds_misc(req.get_vds_misc());
529  drop_pkts += ds.get_ds_misc();
530 
531  ds.set_ds_invalid_packet(req.get_vds_invalid_packet());
532  drop_pkts += ds.get_ds_invalid_packet();
533 
534  ds.set_ds_cksum_err(req.get_vds_cksum_err());
535  drop_pkts += ds.get_ds_cksum_err();
536 
537  ds.set_ds_no_fmd(req.get_vds_no_fmd());
538  drop_pkts += ds.get_ds_no_fmd();
539 
540  ds.set_ds_invalid_vnid(req.get_vds_invalid_vnid());
541  drop_pkts += ds.get_ds_invalid_vnid();
542 
543  ds.set_ds_frag_err(req.get_vds_frag_err());
544  drop_pkts += ds.get_ds_frag_err();
545 
546  ds.set_ds_invalid_source(req.get_vds_invalid_source());
547  drop_pkts += ds.get_ds_invalid_source();
548 
549  ds.set_ds_l2_no_route(req.get_vds_l2_no_route());
550  drop_pkts += ds.get_ds_l2_no_route();
551 
552  ds.set_ds_fragment_queue_fail(req.get_vds_fragment_queue_fail());
553  drop_pkts += ds.get_ds_fragment_queue_fail();
554 
555  ds.set_ds_vlan_fwd_tx(req.get_vds_vlan_fwd_tx());
556  drop_pkts += ds.get_ds_vlan_fwd_tx();
557 
558  ds.set_ds_vlan_fwd_enq(req.get_vds_vlan_fwd_enq());
559  drop_pkts += ds.get_ds_vlan_fwd_enq();
560 
561  ds.set_ds_drop_new_flow(req.get_vds_drop_new_flow());
562  drop_pkts += ds.get_ds_drop_new_flow();
563 
564  ds.set_ds_flow_evict(req.get_vds_flow_evict());
565  drop_pkts += ds.get_ds_flow_evict();
566 
567  ds.set_ds_trap_original(req.get_vds_trap_original());
568  drop_pkts += ds.get_ds_trap_original();
569 
570  ds.set_ds_no_frag_entry(req.get_vds_no_frag_entry());
571  drop_pkts += ds.get_ds_no_frag_entry();
572 
573  ds.set_ds_icmp_error(req.get_vds_icmp_error());
574  drop_pkts += ds.get_ds_icmp_error();
575 
576  ds.set_ds_clone_fail(req.get_vds_clone_fail());
577  drop_pkts += ds.get_ds_clone_fail();
578 
579  ds.set_ds_drop_pkts(drop_pkts);
580 }
const std::string & sg_rule_uuid() const
void AddNamelessVrfStatsEntry()
void SetBounded(bool bounded)
Definition: queue_task.h:200
VnUveTableBase * vn_uve_table() const
VrfStats * GetVrfStats(int vrf_id)
void IncrVnAceStats(const FlowUveVnAcePolicyInfo &info)
Type type() const
Definition: interface.h:112
uint64_t prev_l2_mcast_composites
Definition: stats_manager.h:98
FlowUveFwPolicyInfo fw_policy_info
The TaskScheduler keeps track of what tasks are currently schedulable. When a task is enqueued it is ...
Definition: task.h:178
Definition: vrf.h:86
WorkQueue< boost::shared_ptr< FlowUveStatsRequest > > request_queue_
void Shutdown(bool delete_entries=true)
Definition: queue_task.h:152
uint64_t prev_gre_mpls_tunnels
Definition: stats_manager.h:96
FlowAceTree flow_ace_tree_
DBState * GetState(DBTableBase *tbl_base, ListenerId listener) const
Definition: db_entry.cc:37
Definition: vrf.h:268
static const uint32_t kInvalidFlowCount
Definition: agent_stats.h:16
StatsManager(Agent *agent)
std::pair< const boost::uuids::uuid, FlowRuleMatchInfo > FlowAcePair
AgentUveBase * uve() const
Definition: agent.cc:909
InterfaceStatsTree if_stats_tree_
Agent * agent_
bool IsDeleted() const
Definition: db_entry.h:49
void SetState(DBTableBase *tbl_base, ListenerId listener, DBState *state)
Definition: db_entry.cc:22
uint64_t prev_fabric_composites
Definition: stats_manager.h:99
AgentStats * stats() const
Definition: agent.cc:881
const FlowUveFwPolicyInfo & fw_policy_info() const
uint64_t prev_arp_physical_flood
DBTableBase * parent()
InterfaceTable * interface_table() const
Definition: agent.h:465
void BuildDropStats(const vr_drop_stats_req &r, AgentDropStats &ds) const
bool IncrInterfaceEndpointHits(const std::string &itf, const FlowUveFwPolicyInfo &info)
const string & GetName() const
Definition: vrf.h:100
const FlowUveVnAcePolicyInfo & vn_ace_info() const
void RegisterDBClients()
void Shutdown(void)
uint64_t prev_flow_created_
Definition: stats_manager.h:22
void DelVrfStatsEntry(const VrfEntry *intf)
void Unregister(ListenerId listener)
Definition: db_table.cc:186
void ResetFlowMinMaxStats(FlowCounters &stat) const
Definition: agent_stats.cc:153
ListenerId Register(ChangeCallback callback, const std::string &name="unspecified")
Definition: db_table.cc:181
bool RequestHandler(boost::shared_ptr< FlowUveStatsRequest > req)
void DeleteFlow(const FlowUveStatsRequest *req)
uint32_t hold_flow_count() const
Definition: agent_stats.h:104
virtual ~StatsManager()
Definition: agent.h:358
void AddInterfaceStatsEntry(const Interface *intf)
VrfIdToVrfStatsTree vrf_stats_tree_
void EnqueueEvent(const boost::shared_ptr< FlowUveStatsRequest > &req)
const std::string & interface() const
void UpdateFlowMinMaxStats(uint64_t total_flows, FlowCounters &stat) const
Definition: agent_stats.cc:139
uint64_t prev_udp_mpls_tunnels
Definition: stats_manager.h:95
bool IsFwPolicyInfoEqual(const FlowUveFwPolicyInfo &info) const
#define kTaskFlowStatsUpdate
Definition: agent.h:331
AgentStats::FlowCounters deleted
Definition: stats_manager.h:58
const uint32_t vrf_id() const
Definition: vrf.h:99
void ClearState(DBTableBase *tbl_base, ListenerId listener)
Definition: db_entry.cc:73
std::pair< const Interface *, InterfaceStats > InterfaceStatsPair
bool BuildFlowRate(AgentStats::FlowCounters &created, AgentStats::FlowCounters &aged, FlowRateComputeInfo &flow_info, VrouterFlowRate &flow_rate) const
FlowProto * get_flow_proto() const
Definition: pkt_init.h:43
bool Cancel()
Definition: timer.cc:150
VrfTable * vrf_table() const
Definition: agent.h:485
void AddFlow(const FlowUveStatsRequest *req)
InterfaceUveTable * interface_uve_table() const
bool IsVnAceInfoEqual(const FlowUveVnAcePolicyInfo &info) const
void InterfaceNotify(DBTablePartBase *part, DBEntryBase *e)
AgentStats::FlowCounters added
Definition: stats_manager.h:57
bool FlowStatsUpdate()
bool IsUveActive() const
Definition: interface.cc:1486
static uint64_t UTCTimestampUsec()
Definition: time_util.h:13
uint64_t prev_arp_virtual_stitch
#define DEFAULT_FUVE_REQUEST_QUEUE_SIZE
Definition: stats_manager.h:30
bool Start(int time, Handler handler, ErrorHandler error_handler=NULL)
Definition: timer.cc:108
uint64_t prev_arp_physical_stitch
std::string GetNamelessVrf()
void AddUpdateVrfStatsEntry(const VrfEntry *intf)
Timer * timer_
#define LOG(_Level, _Msg)
Definition: logging.h:33
void DelInterfaceStatsEntry(const Interface *intf)
const std::string & name() const
Definition: interface.h:114
void IncrInterfaceAceStats(const FlowUveStatsRequest *req)
uint64_t prev_flow_aged_
Definition: stats_manager.h:23
PktModule * pkt() const
Definition: agent.cc:965
DBTableBase::ListenerId vrf_listener_id_
void GetDiffStats(uint64_t *in_b, uint64_t *out_b) const
bool Enqueue(QueueEntryT entry)
Definition: queue_task.h:248
void InterfaceFlowCount(const Interface *intf, uint64_t *created, uint64_t *aged, uint32_t *active_flows) const
Definition: flow_proto.cc:925
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)
int flow_stats_update_timeout() const
Definition: agent_stats.h:109
const boost::uuids::uuid & uuid() const
FlowUveVnAcePolicyInfo vn_ace_info
static bool DeleteTimer(Timer *Timer)
Definition: timer.cc:222
DBTableBase::ListenerId intf_listener_id_