5 #include <boost/uuid/uuid_io.hpp>
6 #include <boost/date_time/posix_time/posix_time.hpp>
7 #include <boost/date_time/posix_time/posix_time_io.hpp>
9 #include <vnc_cfg_types.h>
12 #include <oper/agent_profile_types.h>
29 agent_(agent), timer_(NULL), enable_(enable) {
71 str << setw(16) << name
72 <<
" Size " << setw(6) << table->
Size()
103 db_entry_count_ = table->
Size();
111 db_entry_count_ += table->
Size();
122 max_queue_count_ = 0;
135 update_failures_ = 0;
136 update_restarts_ = 0;
148 recompute_count_ = 0;
149 pkt_handler_queue_.Reset();
150 flow_mgmt_queue_.Reset();
151 flow_update_queue_.Reset();
152 for (uint16_t i = 0; i < flow_event_queue_.size(); i++) {
153 flow_event_queue_[i].Reset();
155 for (uint16_t i = 0; i < flow_tokenless_queue_.size(); i++) {
156 flow_tokenless_queue_[i].Reset();
158 for (uint16_t i = 0; i < flow_delete_queue_.size(); i++) {
159 flow_delete_queue_[i].Reset();
162 for (uint16_t i = 0; i < flow_ksync_queue_.size(); i++) {
163 flow_ksync_queue_[i].Reset();
166 for (uint16_t i = 0; i < flow_stats_queue_.size(); i++) {
167 flow_stats_queue_[i].Reset();
169 token_stats_.Reset();
179 inet4_add_count_ = 0;
180 inet4_del_count_ = 0;
181 inet6_add_count_ = 0;
182 inet6_del_count_ = 0;
183 mcast_add_count_ = 0;
184 mcast_del_count_ = 0;
185 bridge_add_count_ = 0;
186 bridge_del_count_ = 0;
204 std::ostringstream str;
205 str << boost::posix_time::second_clock::local_time();
207 DB::TableMap::const_iterator itr =
209 DB::TableMap::const_iterator itrend =
213 for ( ;itr != itrend; ++itr) {
231 stats.
Get(dynamic_cast<DBTable*>(itr->second));
252 stats->set_table(table);
262 stats->set_index(index);
263 stats->set_time_str(data->
time_);
264 std::vector<SandeshDBTableStats> db_stats_list;
265 SandeshDBTableStats db_stats;
266 std::map<std::string, ProfileData::DBTableStats >::iterator itr =
270 db_stats_list.push_back(db_stats);
272 db_stats_list.push_back(db_stats);
274 db_stats_list.push_back(db_stats);
276 db_stats_list.push_back(db_stats);
278 db_stats_list.push_back(db_stats);
282 db_stats_list.push_back(db_stats);
285 db_stats_list.push_back(db_stats);
288 db_stats_list.push_back(db_stats);
291 db_stats_list.push_back(db_stats);
294 db_stats_list.push_back(db_stats);
297 db_stats_list.push_back(db_stats);
301 stats->set_stats(db_stats_list);
304 void SandeshDBTableStatsRequest::HandleRequest()
const {
305 SandeshDBTableStatsList *resp =
new SandeshDBTableStatsList();
306 resp->set_context(context());
315 std::vector<SandeshDBTableStatsInfo> stats_list;
316 for (uint16_t i = start; i < end; i++) {
319 SandeshDBTableStatsInfo stats;
321 stats_list.push_back(stats);
323 resp->set_stats(stats_list);
330 stats->set_index(index);
331 stats->set_time_str(data->
time_);
342 void SandeshFlowStatsRequest::HandleRequest()
const {
343 SandeshFlowStatsList *resp =
new SandeshFlowStatsList();
344 resp->set_context(context());
350 if (end > AgentProfile::kSecondsHistoryCount)
353 std::vector<SandeshFlowStats> stats_list;
354 for (uint16_t i = start; i < end; i++) {
357 SandeshFlowStats stats;
359 stats_list.push_back(stats);
361 resp->set_stats(stats_list);
367 stats->set_index(index);
396 stats->set_flow_resp_wait(task_stats->
wait_count_);
401 stats->set_sandesh_rcv_wait(task_stats->
wait_count_);
416 void SandeshTaskStatsRequest::HandleRequest()
const {
417 SandeshTaskStatsList *resp =
new SandeshTaskStatsList();
418 resp->set_context(context());
424 if (end > AgentProfile::kSecondsHistoryCount)
427 std::vector<TaskProfileStats> stats_list;
428 for (uint16_t i = start; i < end; i++) {
431 TaskProfileStats stats;
433 stats_list.push_back(stats);
435 resp->set_stats(stats_list);
453 info->set_index(index);
454 info->set_time_str(data->
time_);
457 uint64_t enqueues = 0;
458 uint64_t dequeues = 0;
459 uint64_t max_qlen = 0;
460 uint64_t busy_time = 0;
462 std::vector<ProfileData::WorkQueueStats>::const_iterator it =
465 qcount += it->queue_count_;
466 enqueues += it->enqueue_count_;
467 dequeues += it->dequeue_count_;
468 busy_time += it->busy_time_;
469 starts += it->start_count_;
470 if (it->max_queue_count_ > max_qlen) {
471 max_qlen = it->max_queue_count_;
475 SandeshFlowQueueSummaryOneInfo one;
476 one.set_qcount(qcount);
477 one.set_enqueues(enqueues);
478 one.set_dequeues(dequeues);
479 one.set_max_qlen(max_qlen);
480 one.set_starts(starts);
481 one.set_busy_msec(busy_time);
482 info->set_flow_event_queue(one);
493 qcount += it->queue_count_;
494 enqueues += it->enqueue_count_;
495 dequeues += it->dequeue_count_;
496 busy_time += it->busy_time_;
497 starts += it->start_count_;
498 if (it->max_queue_count_ > max_qlen) {
499 max_qlen = it->max_queue_count_;
503 one.set_qcount(qcount);
504 one.set_enqueues(enqueues);
505 one.set_dequeues(dequeues);
506 one.set_max_qlen(max_qlen);
507 one.set_starts(starts);
508 one.set_busy_msec(busy_time);
509 info->set_flow_tokenless_queue(one);
520 qcount += it->queue_count_;
521 enqueues += it->enqueue_count_;
522 dequeues += it->dequeue_count_;
523 busy_time += it->busy_time_;
524 starts += it->start_count_;
525 if (it->max_queue_count_ > max_qlen) {
526 max_qlen = it->max_queue_count_;
530 one.set_qcount(qcount);
531 one.set_enqueues(enqueues);
532 one.set_dequeues(dequeues);
533 one.set_max_qlen(max_qlen);
534 one.set_starts(starts);
535 one.set_busy_msec(busy_time);
536 info->set_flow_delete_queue(one);
547 qcount += it->queue_count_;
548 enqueues += it->enqueue_count_;
549 dequeues += it->dequeue_count_;
550 busy_time += it->busy_time_;
551 starts += it->start_count_;
552 if (it->max_queue_count_ > max_qlen) {
553 max_qlen = it->max_queue_count_;
557 one.set_qcount(qcount);
558 one.set_enqueues(enqueues);
559 one.set_dequeues(dequeues);
560 one.set_max_qlen(max_qlen);
561 one.set_starts(starts);
562 one.set_busy_msec(busy_time);
563 info->set_flow_ksync_queue(one);
567 info->set_flow_mgmt_queue(one);
571 info->set_flow_update_queue(one);
582 qcount += it->queue_count_;
583 enqueues += it->enqueue_count_;
584 dequeues += it->dequeue_count_;
585 busy_time += it->busy_time_;
586 starts += it->start_count_;
587 if (it->max_queue_count_ > max_qlen) {
588 max_qlen = it->max_queue_count_;
592 one.set_qcount(qcount);
593 one.set_enqueues(enqueues);
594 one.set_dequeues(dequeues);
595 one.set_max_qlen(max_qlen);
596 one.set_starts(starts);
597 one.set_busy_msec(busy_time);
598 info->set_flow_stats_queue(one);
602 info->set_pkt_handler_queue(one);
606 info->set_ksync_tx_queue(one);
610 info->set_ksync_rx_queue(one);
612 SandeshFlowTokenInfo token_info;
614 token_info.set_add_tokens(token_stats->
add_tokens_);
616 token_info.set_add_token_restarts(token_stats->
add_restarts_);
623 token_info.set_delete_tokens(token_stats->
del_tokens_);
624 token_info.set_delete_token_full(token_stats->
del_failures_);
625 token_info.set_delete_token_restarts(token_stats->
del_restarts_);
626 info->set_token_stats(token_info);
629 void SandeshFlowQueueSummaryRequest::HandleRequest()
const {
630 SandeshFlowQueueSummaryResp *resp =
new SandeshFlowQueueSummaryResp();
636 if (end > AgentProfile::kSecondsHistoryCount)
639 std::vector<SandeshFlowQueueSummaryInfo> info_list;
640 for (uint16_t i = start; i < end; i++) {
643 SandeshFlowQueueSummaryInfo info;
645 info_list.push_back(info);
648 resp->set_summary(info_list);
649 resp->set_context(context());
653 void SandeshSetProfileParams::HandleRequest()
const {
654 SandeshProfileParams *resp =
new SandeshProfileParams();
659 get_task_schedule_threshold() * 1000);
662 resp->set_task_exec_threshold(scheduler->
execute_delay()/1000);
663 resp->set_task_schedule_threshold(scheduler->
schedule_delay()/1000);
665 resp->set_context(context());
WorkQueueStats flow_update_queue_
std::vector< WorkQueueStats > flow_delete_queue_
int wait_count_
Number of entries in waitq.
const_iterator const_end()
static Agent * GetInstance()
The TaskScheduler keeps track of what tasks are currently schedulable. When a task is enqueued it is ...
uint64_t enqueue_count() const
uint16_t seconds_history_index() const
ProfileCb ksync_stats_cb_
void Get(const DBTable *table)
std::map< std::string, DBTableStats > profile_stats_table_
uint64_t input_count() const
WorkQueueStats ksync_rx_queue_count_
AgentProfile(Agent *agent, bool enable)
uint32_t execute_delay() const
WorkQueueStats pkt_handler_queue_
virtual size_t Size() const
DBTableStats evpn_routes_
#define kVrfDbTablePrefix
TaskStats * GetTaskGroupStats(int task_id)
ProfileData * GetProfileData(uint16_t index)
uint64_t vrouter_responses_
static const uint32_t kProfileTimeout
std::vector< WorkQueueStats > flow_ksync_queue_
ProfileData seconds_history_data_[kSecondsHistoryCount]
static void GetFlowStats(SandeshFlowStats *stats, int index, ProfileData *data)
uint64_t max_queue_count_
#define kEvpnRouteDbTableSuffix
void SetMeasureQueueDelay(bool val)
int GetTaskId(const std::string &name)
void EnableLatencyThresholds(uint32_t execute, uint32_t schedule)
Enable logging of tasks exceeding configured latency.
uint64_t notify_count() const
uint16_t seconds_history_index_
#define kMcastRouteDbTableSuffix
virtual size_t Size() const
TaskScheduler * task_scheduler() const
#define kV4UnicastRouteDbTableSuffix
static TaskScheduler * GetInstance()
const_iterator const_begin()
uint64_t update_restarts_
static const uint16_t kSecondsHistoryCount
WorkQueueStats flow_mgmt_queue_
EventManager * event_manager() const
DBTableStats inet6_routes_
static void DBStatsToSandesh(SandeshDBTableStats *stats, const string &table, const ProfileData::DBTableStats &db_stats)
std::vector< WorkQueueStats > flow_event_queue_
static void GetDBTableStats(SandeshDBTableStatsInfo *stats, int index, ProfileData *data)
static void GetTaskStats(TaskProfileStats *stats, int index, ProfileData *data)
int defer_count_
Number of entries in deferq.
#define kL2RouteDbTableSuffix
static Timer * CreateTimer(boost::asio::io_context &service, const std::string &name, int task_id=Timer::GetTimerTaskId(), int task_instance=Timer::GetTimerInstanceId(), bool delete_on_completion=false)
FlowTokenStats token_stats_
string GetProfileString(DBTable *table, const char *name)
ProfileData * GetLastProfileData()
#define kV6UnicastRouteDbTableSuffix
#define kMplsDbTablePrefix
uint64_t enqueue_count_
Number of tasks enqueued.
DBTableStats bridge_routes_
void Accumulate(const DBTableBase *table)
uint64_t update_failures_
bool Start(int time, Handler handler, ErrorHandler error_handler=NULL)
#define kAclDbTablePrefix
uint64_t walker_count() const
WorkQueueStats ksync_tx_queue_count_
DBTableStats multicast_routes_
TaskStats task_stats_[24]
std::vector< WorkQueueStats > flow_stats_queue_
uint64_t recompute_count_
DBTableStats inet4_routes_
#define kInterfaceDbTablePrefix
std::vector< WorkQueueStats > flow_tokenless_queue_
AgentProfile * agent_profile() const
ProfileCb pkt_flow_stats_cb_
uint32_t schedule_delay() const
static void GetOneQueueSummary(SandeshFlowQueueSummaryOneInfo *one, ProfileData::WorkQueueStats *stats)
static void GetQueueSummaryInfo(SandeshFlowQueueSummaryInfo *info, int index, ProfileData *data)
static bool DeleteTimer(Timer *Timer)