void set_data_metrics (GMetrics * ometrics, GMetrics ** nmetrics, int processed) { GMetrics *metrics; float percent = get_percentage (processed, ometrics->hits); metrics = new_gmetrics (); metrics->bw.nbw = ometrics->bw.nbw; metrics->id = ometrics->id; metrics->data = ometrics->data; metrics->hits = ometrics->hits; metrics->percent = percent < 0 ? 0 : percent; metrics->visitors = ometrics->visitors; if (conf.serve_usecs && ometrics->hits > 0) { metrics->avgts.nts = ometrics->avgts.nts; metrics->cumts.nts = ometrics->cumts.nts; metrics->maxts.nts = ometrics->maxts.nts; } if (conf.append_method && ometrics->method) metrics->method = ometrics->method; if (conf.append_method && ometrics->protocol) metrics->protocol = ometrics->protocol; *nmetrics = metrics; }
static int set_root_metrics (int data_nkey, GDataMap * map, GModule module, GMetrics ** nmetrics) { GMetrics *metrics; char *data = NULL; uint64_t bw = 0, cumts = 0, maxts = 0; int visitors = 0; if (!(data = get_node_from_key (data_nkey, module, MTRC_DATAMAP))) return 1; bw = get_cumulative_from_key (data_nkey, module, MTRC_BW); cumts = get_cumulative_from_key (data_nkey, module, MTRC_CUMTS); maxts = get_cumulative_from_key (data_nkey, module, MTRC_MAXTS); visitors = get_num_from_key (data_nkey, module, MTRC_VISITORS); metrics = new_gmetrics (); metrics->avgts.nts = cumts / map->data; metrics->cumts.nts = cumts; metrics->maxts.nts = maxts; metrics->bw.nbw = bw; metrics->data = data; metrics->hits = map->data; metrics->visitors = visitors; *nmetrics = metrics; return 0; }
/* add a first level item to dashboard */ static void add_item_to_dash (GDash ** dash, GHolderItem item, GModule module) { GDashData *idata; int *idx = &(*dash)->module[module].idx_data; idata = &(*dash)->module[module].data[(*idx)]; idata->metrics = new_gmetrics (); idata->metrics->bw.sbw = filesize_str (item.metrics->bw.nbw); idata->metrics->data = xstrdup (item.metrics->data); idata->metrics->hits = item.metrics->hits; idata->metrics->visitors = item.metrics->visitors; if (conf.append_method && item.metrics->method) idata->metrics->method = item.metrics->method; if (conf.append_protocol && item.metrics->protocol) idata->metrics->protocol = item.metrics->protocol; if (conf.serve_usecs) { idata->metrics->avgts.sts = usecs_to_str (item.metrics->avgts.nts); idata->metrics->cumts.sts = usecs_to_str (item.metrics->cumts.nts); idata->metrics->maxts.sts = usecs_to_str (item.metrics->maxts.nts); } (*idx)++; }
static int set_root_metrics (int key, int hits, GModule module, GMetrics ** nmetrics) { GMetrics *metrics; char *data = NULL; uint64_t bw = 0, cumts = 0, maxts = 0; int visitors = 0; if (!(data = ht_get_datamap (module, key))) return 1; bw = ht_get_bw (module, key); cumts = ht_get_cumts (module, key); maxts = ht_get_maxts (module, key); visitors = ht_get_visitors (module, key); metrics = new_gmetrics (); metrics->avgts.nts = cumts / hits; metrics->cumts.nts = cumts; metrics->maxts.nts = maxts; metrics->bw.nbw = bw; metrics->data = data; metrics->hits = hits; metrics->visitors = visitors; *nmetrics = metrics; return 0; }
static int set_host_child_metrics (char *data, uint8_t id, GMetrics ** nmetrics) { GMetrics *metrics; metrics = new_gmetrics (); metrics->data = xstrdup (data); metrics->id = id; *nmetrics = metrics; return 0; }
static void add_root_to_holder (GRawDataItem item, GHolder * h, GO_UNUSED const GPanel * panel) { GDataMap *map; GSubList *sub_list; GMetrics *metrics, *nmetrics; char *root = NULL; int data_nkey = 0, root_idx = KEY_NOT_FOUND, idx = 0; data_nkey = (*(int *) item.key); map = (GDataMap *) item.value; if (map == NULL) return; if (set_root_metrics (data_nkey, map, h->module, &nmetrics) == 1) return; if (!(root = (get_root_from_key (map->root, h->module)))) return; /* add data as a child node into holder */ if (KEY_NOT_FOUND == (root_idx = get_item_idx_in_holder (h, root))) { idx = h->idx; sub_list = new_gsublist (); metrics = new_gmetrics (); h->items[idx].metrics = metrics; h->items[idx].metrics->data = root; h->idx++; } else { sub_list = h->items[root_idx].sub_list; metrics = h->items[root_idx].metrics; idx = root_idx; free (root); } add_sub_item_back (sub_list, h->module, nmetrics); h->items[idx].sub_list = sub_list; h->items[idx].metrics = metrics; h->items[idx].metrics->avgts.nts += nmetrics->avgts.nts; h->items[idx].metrics->cumts.nts += nmetrics->cumts.nts; h->items[idx].metrics->maxts.nts += nmetrics->maxts.nts; h->items[idx].metrics->bw.nbw += nmetrics->bw.nbw; h->items[idx].metrics->hits += nmetrics->hits; h->items[idx].metrics->visitors += nmetrics->visitors; h->sub_items_size++; }
static void add_data_to_holder (GRawDataItem item, GHolder * h, const GPanel * panel) { GDataMap *map; char *data = NULL, *method = NULL, *protocol = NULL; int data_nkey = 0, visitors = 0; uint64_t bw = 0, cumts = 0, maxts = 0; data_nkey = (*(int *) item.key); map = (GDataMap *) item.value; if (map == NULL) return; if (!(data = get_node_from_key (data_nkey, h->module, MTRC_DATAMAP))) return; bw = get_cumulative_from_key (data_nkey, h->module, MTRC_BW); cumts = get_cumulative_from_key (data_nkey, h->module, MTRC_CUMTS); maxts = get_cumulative_from_key (data_nkey, h->module, MTRC_MAXTS); visitors = get_num_from_key (data_nkey, h->module, MTRC_VISITORS); h->items[h->idx].metrics = new_gmetrics (); h->items[h->idx].metrics->hits = map->data; h->items[h->idx].metrics->visitors = visitors; h->items[h->idx].metrics->data = data; h->items[h->idx].metrics->bw.nbw = bw; h->items[h->idx].metrics->avgts.nts = cumts / map->data;; h->items[h->idx].metrics->cumts.nts = cumts; h->items[h->idx].metrics->maxts.nts = maxts; if (conf.append_method) { method = get_node_from_key (data_nkey, h->module, MTRC_METHODS); h->items[h->idx].metrics->method = method; } if (conf.append_protocol) { protocol = get_node_from_key (data_nkey, h->module, MTRC_PROTOCOLS); h->items[h->idx].metrics->protocol = protocol; } if (panel->holder_callback) panel->holder_callback (h); h->idx++; }
/* Copy linked-list items to an array, sort, and move them back * to the list. Should be faster than sorting the list */ static void sort_sub_list (GHolder * h, GSort sort) { GHolderItem *arr; GSubItem *iter; GSubList *sub_list; int i, j, k; /* iterate over root-level nodes */ for (i = 0; i < h->idx; i++) { sub_list = h->items[i].sub_list; if (sub_list == NULL) continue; arr = new_gholder_item (sub_list->size); /* copy items from the linked-list into an array */ for (j = 0, iter = sub_list->head; iter; iter = iter->next, j++) { arr[j].metrics = new_gmetrics (); arr[j].metrics->bw.nbw = iter->metrics->bw.nbw; arr[j].metrics->data = xstrdup (iter->metrics->data); arr[j].metrics->hits = iter->metrics->hits; arr[j].metrics->id = iter->metrics->id; arr[j].metrics->visitors = iter->metrics->visitors; if (conf.serve_usecs) { arr[j].metrics->avgts.nts = iter->metrics->avgts.nts; arr[j].metrics->cumts.nts = iter->metrics->cumts.nts; arr[j].metrics->maxts.nts = iter->metrics->maxts.nts; } } sort_holder_items (arr, j, sort); delete_sub_list (sub_list); sub_list = new_gsublist (); for (k = 0; k < j; k++) { if (k > 0) sub_list = h->items[i].sub_list; add_sub_item_back (sub_list, h->module, arr[k].metrics); h->items[i].sub_list = sub_list; } free (arr); } }
static void add_data_to_holder (GRawDataItem item, GHolder * h, const GPanel * panel) { char *data = NULL, *method = NULL, *protocol = NULL; int visitors = 0; uint64_t bw = 0, cumts = 0, maxts = 0; if (!(data = ht_get_datamap (h->module, item.key))) return; bw = ht_get_bw (h->module, item.key); cumts = ht_get_cumts (h->module, item.key); maxts = ht_get_maxts (h->module, item.key); visitors = ht_get_visitors (h->module, item.key); h->items[h->idx].metrics = new_gmetrics (); h->items[h->idx].metrics->hits = item.value; h->items[h->idx].metrics->visitors = visitors; h->items[h->idx].metrics->data = data; h->items[h->idx].metrics->bw.nbw = bw; h->items[h->idx].metrics->avgts.nts = cumts / item.value; h->items[h->idx].metrics->cumts.nts = cumts; h->items[h->idx].metrics->maxts.nts = maxts; if (conf.append_method) { method = ht_get_method (h->module, item.key); h->items[h->idx].metrics->method = method; } if (conf.append_protocol) { protocol = ht_get_protocol (h->module, item.key); h->items[h->idx].metrics->protocol = protocol; } if (panel->holder_callback) panel->holder_callback (h); h->idx++; }
/* add an item from a sub_list to the dashboard */ static void add_sub_item_to_dash (GDash ** dash, GHolderItem item, GModule module, int *i) { GSubList *sub_list = item.sub_list; GSubItem *iter; GDashData *idata; char *entry; int *idx; idx = &(*dash)->module[module].idx_data; if (sub_list == NULL) return; for (iter = sub_list->head; iter; iter = iter->next, (*i)++) { entry = render_child_node (iter->metrics->data); if (!entry) continue; idata = &(*dash)->module[module].data[(*idx)]; idata->metrics = new_gmetrics (); idata->metrics->visitors = iter->metrics->visitors; idata->metrics->bw.sbw = filesize_str (iter->metrics->bw.nbw); idata->metrics->data = xstrdup (entry); idata->metrics->hits = iter->metrics->hits; if (conf.serve_usecs) { idata->metrics->avgts.sts = usecs_to_str (iter->metrics->avgts.nts); idata->metrics->cumts.sts = usecs_to_str (iter->metrics->cumts.nts); idata->metrics->maxts.sts = usecs_to_str (iter->metrics->maxts.nts); } idata->is_subitem = 1; (*idx)++; free (entry); } }