5 #include <boost/uuid/uuid_io.hpp>
11 #include <boost/functional/factory.hpp>
30 #include <vrouter/flow_stats/flow_stats_types.h>
35 "FlowExportStats", 3000));
50 void SetFlowStatsInterval_InSeconds::HandleRequest()
const {
52 if (get_interval() > 0) {
58 resp =
new FlowStatsCfgResp();
60 resp =
new FlowStatsCfgErrResp();
68 void GetFlowStatsInterval::HandleRequest()
const {
69 FlowStatsIntervalResp_InSeconds *resp =
70 new FlowStatsIntervalResp_InSeconds();
72 default_flow_stats_collector_obj()->GetExpiryTime())/1000);
74 resp->set_context(context());
80 request_queue_(agent_->task_scheduler()->GetTaskId(
"Agent::FlowStatsManager"),
83 prev_flow_export_rate_compute_time_(0),
84 threshold_(kDefaultFlowSamplingThreshold),
85 prev_cfg_flow_export_rate_(0), session_export_rate_(0),
86 session_export_count_(), session_sample_exports_(), session_msg_exports_(),
87 session_exports_(), session_export_disable_drops_(),
88 session_export_sampling_drops_(), session_export_without_sampling_(),
89 session_export_drops_(), session_global_slo_logging_drops_(),
90 session_slo_logging_drops_(),
91 timer_(
TimerManager::CreateTimer(*(agent_->event_manager())->io_service(),
93 TaskScheduler::GetInstance()->GetTaskId(
"Agent::FlowStatsManager"), 0)),
94 delete_short_flow_(true) {
122 switch (req->event) {
150 it->second->SetFlowAgeTime(
151 1000000L * (uint64_t)req->flow_cache_timeout);
152 it->second->ClearDelete();
164 if (req->key.port == 0) {
177 flow_aging_table_ptr->MarkDelete();
179 if (flow_aging_table_ptr->CanDelete()) {
193 if (flow_aging_table_ptr->IsDeleted() ==
false) {
196 assert(flow_aging_table_ptr->CanDelete());
197 flow_aging_table_ptr->Shutdown();
203 uint64_t flow_stats_interval,
204 uint64_t flow_cache_timeout) {
205 boost::shared_ptr<FlowStatsCollectorReq>
208 key, flow_stats_interval, flow_cache_timeout));
216 boost::shared_ptr<FlowStatsCollectorReq>
224 boost::shared_ptr<FlowStatsCollectorReq>
241 return key1_it->second.get();
250 FlowAgingTableMap::const_iterator key1_it =
254 col = key1_it->second.get();
260 FlowAgingTableMap::const_iterator key2_it =
263 col = key2_it->second.get();
282 if (rflow && rflow->
fsc()) {
296 if (flow->fsc() == NULL) {
332 uint32_t bytes, uint32_t packets,
333 uint32_t oflow_bytes,
364 uint32_t protocol, uint32_t port, uint64_t timeout) {
382 uint64_t flow_cache_timeout) {
384 flow_stats_interval, flow_cache_timeout);
417 void ShowAgingConfig::HandleRequest()
const {
421 resp =
new AgingConfigResponse();
423 FlowStatsManager::FlowAgingTableMap::const_iterator it = fam->
begin();
424 while (it != fam->
end()) {
426 cfg.set_protocol(it->first.proto);
427 cfg.set_port(it->first.port);
428 cfg.set_cache_timeout(it->second->GetAgeTimeInSeconds());
429 cfg.set_stats_interval(0);
430 std::vector<AgingConfig> &list =
431 const_cast<std::vector<AgingConfig>&
>(
432 ((AgingConfigResponse *)resp)->get_aging_config_list());
442 void AddAgingConfig::HandleRequest()
const {
445 get_stats_interval(), get_cache_timeout());
452 void DeleteAgingConfig::HandleRequest()
const {
static const int kMaxCollectors
boost::shared_ptr< SessionStatsCollectorObject > SessionStatsCollectorPtr
uint32_t task_starts() const
tbb::atomic< uint64_t > session_exports_
tbb::atomic< bool > sessions_sampled_atleast_once_
tbb::atomic< uint64_t > session_slo_logging_drops_
FlowAgingTableMap flow_aging_table_map_
static Agent * GetInstance()
FlowStatsCollector * FlowToCollector(const FlowEntry *flow)
The TaskScheduler keeps track of what tasks are currently schedulable. When a task is enqueued it is ...
FlowStatsManager * flow_stats_manager() const
void Shutdown(bool delete_entries=true)
void Free(const FlowAgingTableKey &key)
size_t max_queue_len() const
void UpdateStatsEvent(const FlowEntryPtr &flow, uint32_t bytes, uint32_t packets, uint32_t oflow_bytes, const boost::uuids::uuid &u)
void DeleteEvent(const FlowEntryPtr &flow, const RevFlowDepParams ¶ms)
size_t NumDequeues() const
void AddEvent(const FlowEntryPtr &flow)
void UpdateSessionStatsEvent(const FlowEntryPtr &flow, uint32_t bytes, uint32_t packets, uint32_t oflow_bytes, const boost::uuids::uuid &u)
void RegisterFlowStatsCb(ProfileCb cb)
boost::shared_ptr< FlowStatsCollectorObject > FlowAgingTablePtr
const Queue * queue() const
FlowAgingTableMap::iterator begin()
static void SetQueueStats(Agent *agent, FlowStatsCollector *fsc, ProfileData::WorkQueueStats *stats)
std::pair< const FlowAgingTableKey, FlowAgingTablePtr > FlowAgingTableEntry
tbb::atomic< uint64_t > session_export_disable_drops_
tbb::atomic< uint64_t > session_global_slo_logging_drops_
void Add(const FlowAgingTableKey &key, uint64_t flow_stats_interval, uint64_t flow_cache_timeout)
tbb::atomic< uint64_t > session_export_drops_
boost::shared_ptr< TraceBuffer< SandeshTrace > > SandeshTraceBufferPtr
FlowStatsCollector * GetCollector(uint8_t idx) const
uint64_t max_queue_count_
void Init(uint64_t flow_stats_interval, uint64_t flow_cache_timeout)
SessionStatsCollectorPtr session_stats_collector_obj_
FlowAgingTableMap::iterator end()
void AddReqHandler(boost::shared_ptr< FlowStatsCollectorReq > req)
const FlowKey & key() const
void Remove(size_t index)
size_t Insert(EntryType entry)
FlowAgingTablePtr default_flow_stats_collector_obj_
bool UpdateSessionThreshold(void)
void DeleteEvent(const FlowEntryPtr &flow, const RevFlowDepParams ¶ms)
static const uint32_t kMinFlowSamplingThreshold
void FreeReqHandler(boost::shared_ptr< FlowStatsCollectorReq > req)
bool RequestHandler(boost::shared_ptr< FlowStatsCollectorReq > req)
static void FlowStatsReqHandler(Agent *agent, uint32_t proto, uint32_t port, uint64_t protocol)
void UpdateSessionMsgExportStats(uint32_t count)
void UpdateSessionExportStats(uint32_t count, bool first_export, bool sampled)
static const uint8_t kCatchAllProto
void set_measure_busy_time(bool val) const
WorkQueue< boost::shared_ptr< FlowStatsCollectorReq > > request_queue_
void Delete(const FlowAgingTableKey &key)
void AddEvent(FlowEntryPtr &flow)
void SetProfileData(ProfileData *data)
AgentParam * params() const
SandeshTraceBufferPtr FlowExportStatsTraceBuf
void UpdateStatsEvent(const FlowEntryPtr &flow, uint32_t bytes, uint32_t packets, uint32_t oflow_bytes, const boost::uuids::uuid &u)
void AddEvent(const FlowEntryPtr &flow)
std::string Description() const
FlowStatsCollector * GetFlowStatsCollector(const FlowEntry *p) const
void DeleteEvent(const FlowEntryPtr &flow, const RevFlowDepParams ¶ms)
tbb::atomic< uint64_t > session_msg_exports_
IndexVector< FlowStatsCollector * > instance_table_
FlowStatsManager(Agent *agent)
void set_context(std::string context)
bool Start(int time, Handler handler, ErrorHandler error_handler=NULL)
void UpdateThreshold(uint64_t new_value, bool check_oflow)
FlowEntry * reverse_flow_entry()
tbb::atomic< uint64_t > session_export_sampling_drops_
friend struct FlowStatsCollectorReq
FlowStatsCollectorObject * protocol_list_[256]
uint64_t busy_time() const
size_t NumEnqueues() const
tbb::atomic< uint64_t > session_sample_exports_
int flow_stats_interval() const
tbb::atomic< uint32_t > session_export_count_
std::vector< WorkQueueStats > flow_stats_queue_
tbb::atomic< uint32_t > session_export_without_sampling_
FlowStatsCollectorObject * GetFlowStatsCollectorObject(const FlowEntry *flow) const
void SetExpiryTime(int time)
bool Enqueue(QueueEntryT entry)
static const uint64_t FlowThresoldUpdateTime
void set_flow_stats_req_handler(FlowStatsReqHandler req)
AgentProfile * agent_profile() const
void DeleteReqHandler(boost::shared_ptr< FlowStatsCollectorReq > req)
void UpdateSessionSampleExportStats(uint32_t count)
const FlowStatsCollectorObject * Find(uint32_t proto, uint32_t port) const
void FreeIndex(uint32_t idx)
SandeshTraceBufferPtr SandeshTraceBufferCreate(const std::string &buf_name, size_t buf_size, bool trace_enable=true)
FlowStatsCollector * fsc() const
FlowStatsCollectorObject * default_flow_stats_collector_obj()
static bool DeleteTimer(Timer *Timer)
boost::intrusive_ptr< FlowEntry > FlowEntryPtr