void stats_aggregate_force(struct stats *st) { pthread_mutex_lock(&st->stats_mutex); st->aggregate = 1; stats_aggregate(st); st->updated = 1; stats_swap(st); stats_aggregate(st); stats_pool_reset(&st->shadow); stats_pool_reset(&st->current); pthread_mutex_unlock(&st->stats_mutex); }
static void * stats_loop(void *arg) { struct stats *st = arg; int n; for (;;) { n = epoll_wait(st->ep, &st->event, 1, st->interval); if (n < 0) { if (errno == EINTR) { continue; } log_error("epoll wait on e %d with event m %d failed: %s", st->ep, st->sd, strerror(errno)); break; } /* aggregate stats from shadow (b) -> sum (c) */ stats_aggregate(st); if (n == 0) { continue; } /* send aggregate stats sum (c) to collector */ stats_send_rsp(st); } return NULL; }
void m_stats_threadstat_aggregate(m_stats_threadstat_t *threadstat, m_stats_statset_t *source_statset) { m_stats_statset_t *statset_all; m_result_t result; result = stats_get_statset(threadstat->stats_table, source_statset->name, &statset_all); if (result != M_R_SUCCESS) { m_stats_statset_create(&statset_all); m_stats_statset_init(statset_all, source_statset->name); m_chhash_add(threadstat->stats_table, source_statset->name, (m_chhash_value_t) (statset_all)); } stats_aggregate(statset_all, source_statset); stats_aggregate(&threadstat->summary_statset, source_statset); }
/** Aggregate stats from all lines */ static bool _stats_aggregate_lines(struct mg *mg, stats *stats, void *arg) { int i; for (i = 1; i < TRAFFIC_LINE_MAX; i++) { if (!mg->lines[i]) continue; stats_aggregate(stats, mg->lines[i]->stats); } return true; }
/* * Aggregator thread event loop */ static void thread_aggregate_stats(int fd, short ev, void *arg) { if (settings.stats_agg_intvl.tv_sec >= 0) { evtimer_add(&aggregator.ev, &settings.stats_agg_intvl); stats_aggregate(); } else { /* if aggregation is turned off, come back & check in 5 seconds */ struct timeval sleep; sleep.tv_sec = 5; sleep.tv_usec = 0; evtimer_add(&aggregator.ev, &sleep); } }
//合并stats信息,并接收客户端连接 通过epoll接收到客户端连接触发走到该函数 static void //可以通过客户端telnet 127.0.0.1 22222来获取 stats_loop_callback(void *arg1, void *arg2) {//interval超时时间调用stats_loop_callback一次,或者客户端请求获取stats也会调用stats_loop_callback struct stats *st = arg1; int n = *((int *)arg2); /* aggregate stats from shadow (b) -> sum (c) */ stats_aggregate(st); if (n == 0) { return; } /* send aggregate stats sum (c) to collector */ stats_send_rsp(st); }
static void stats_loop_callback(void *arg1, void *arg2) { struct stats *st = arg1; int n = *((int *)arg2); /* aggregate stats from shadow (b) -> sum (c) */ stats_aggregate(st); if (n == 0) { return; } /* send aggregate stats sum (c) to collector */ stats_send_rsp(st); }
static void * stats_loop(void *arg) { struct stats *st = arg; int n; for (;;) { n = event_wait(st->st_evb, st->interval); /* aggregate stats from shadow (b) -> sum (c) */ stats_aggregate(st); if (n == 0) { continue; } /* send aggregate stats sum (c) to collector */ stats_send_rsp(st); } return NULL; }
/** Global stats */ static bool _stats_global(struct mg *mg, stats *stats, void *arg) { stats_aggregate(stats, mg->stats); return true; }
static bool _stats_write_link(struct mg *mg, stats *dst, void *arg) { stats_aggregate(dst, (stats *) arg); return true; }
static bool _stats_write_interface(struct mg *mg, stats *dst, void *arg) { stats_aggregate(dst, ((struct interface *) arg)->stats); return true; }