/* Output a sublist (double linked-list) items for a particular parent node. * * On error, it exits early. * On success, outputs item value. */ static void print_csv_sub_items (FILE * fp, GHolder * h, int idx, int valid) { GSubList *sub_list = h->items[idx].sub_list; GSubItem *iter; float percent; int i = 0; if (sub_list == NULL) return; for (iter = sub_list->head; iter; iter = iter->next, i++) { percent = get_percentage (valid, iter->metrics->hits); percent = percent < 0 ? 0 : percent; fprintf (fp, "\"%d\",", i); /* idx */ fprintf (fp, "\"%d\",", idx); /* parent idx */ fprintf (fp, "\"%s\",", module_to_id (h->module)); fprintf (fp, "\"%d\",", iter->metrics->hits); fprintf (fp, "\"%d\",", iter->metrics->visitors); fprintf (fp, "\"%4.2f%%\",", percent); if (conf.bandwidth) fprintf (fp, "\"%lld\",", (long long) iter->metrics->bw.nbw); if (conf.serve_usecs) { fprintf (fp, "\"%lld\",", (long long) iter->metrics->avgts.nts); fprintf (fp, "\"%lld\",", (long long) iter->metrics->cumts.nts); fprintf (fp, "\"%lld\",", (long long) iter->metrics->maxts.nts); } if (conf.append_method && iter->metrics->method) fprintf (fp, "\"%s\"", iter->metrics->method); fprintf (fp, ","); if (conf.append_protocol && iter->metrics->protocol) fprintf (fp, "\"%s\"", iter->metrics->protocol); fprintf (fp, ","); fprintf (fp, "\""); escape_cvs_output (fp, iter->metrics->data); fprintf (fp, "\","); fprintf (fp, "\r\n"); /* parent idx */ } }
/* Entry point to ouput data metrics per panel. */ static void print_json_data (GJSON * json, GHolder * h, GPercTotals totals, const struct GPanel_ *panel) { int sp = 0; /* use tabs to prettify output */ if (conf.json_pretty_print) sp = 1; /* output open panel attribute */ popen_obj_attr (json, module_to_id (h->module), sp); /* output panel metadata */ print_meta_data (json, h, sp); /* output panel data */ print_data_metrics (json, h, totals, sp, panel); /* output close panel attribute */ pclose_obj (json, sp, 1); }
/* Entry point to ouput data metrics per panel. */ static void print_json_data (FILE * fp, GHolder * h, GPercTotals totals, const struct GPanel_ *panel) { int sp = 0; /* use tabs to prettify output */ if (conf.json_pretty_print) sp = 1; /* output open panel attribute */ print_open_panel_attr (fp, module_to_id (h->module), sp); /* output panel metadata */ print_meta_data (fp, h, sp); /* output panel data */ print_data_metrics (fp, h, totals, sp, panel); /* output close panel attribute */ print_close_panel_attr (fp, sp); }
/* Output first-level items. */ static void print_csv_data (FILE * fp, GHolder * h, int valid) { GMetrics *nmetrics; int i; for (i = 0; i < h->idx; i++) { set_data_metrics (h->items[i].metrics, &nmetrics, valid); fprintf (fp, "\"%d\",", i); /* idx */ fprintf (fp, ","); /* no parent */ fprintf (fp, "\"%s\",", module_to_id (h->module)); fprintf (fp, "\"%d\",", nmetrics->hits); fprintf (fp, "\"%d\",", nmetrics->visitors); fprintf (fp, "\"%4.2f%%\",", nmetrics->percent); if (conf.bandwidth) fprintf (fp, "\"%lld\",", (long long) nmetrics->bw.nbw); if (conf.serve_usecs) { fprintf (fp, "\"%lld\",", (long long) nmetrics->avgts.nts); fprintf (fp, "\"%lld\",", (long long) nmetrics->cumts.nts); fprintf (fp, "\"%lld\",", (long long) nmetrics->maxts.nts); } if (conf.append_method && nmetrics->method) fprintf (fp, "\"%s\"", nmetrics->method); fprintf (fp, ","); if (conf.append_protocol && nmetrics->protocol) fprintf (fp, "\"%s\"", nmetrics->protocol); fprintf (fp, ","); fprintf (fp, "\""); escape_cvs_output (fp, nmetrics->data); fprintf (fp, "\"\r\n"); if (h->sub_items_size) print_csv_sub_items (fp, h, i, valid); free (nmetrics); } }
/* Output first-level items. * * On success, outputs item value. */ static void print_csv_data (FILE * fp, GHolder * h, GPercTotals totals) { GMetrics *nmetrics; int i; for (i = 0; i < h->idx; i++) { set_data_metrics (h->items[i].metrics, &nmetrics, totals); fprintf (fp, "\"%d\",", i); /* idx */ fprintf (fp, ","); /* no parent */ fprintf (fp, "\"%s\",", module_to_id (h->module)); /* output metrics */ print_csv_metric_block (fp, nmetrics); if (h->sub_items_size) print_csv_sub_items (fp, h, i, totals); free (nmetrics); } }
static void print_json_host_data (FILE * fp, GHolder * h, int processed) { GMetrics *nmetrics; char *sep = char_repeat (2, '\t'); int i; fprintf (fp, "\t\"%s\": [\n", module_to_id (h->module)); for (i = 0; i < h->idx; i++) { set_data_metrics (h->items[i].metrics, &nmetrics, processed); fprintf (fp, "%s{\n", sep); print_json_block (fp, nmetrics, sep); print_json_host_geo (fp, h->items[i].sub_list, sep); fprintf (fp, (i != h->idx - 1) ? "\n%s},\n" : "\n%s}\n", sep); free (nmetrics); } fprintf (fp, "\t]"); free (sep); }
/* Output a sublist (double linked-list) items for a particular parent node. * * On error, it exits early. * On success, outputs item value. */ static void print_csv_sub_items (FILE * fp, GHolder * h, int idx, GPercTotals totals) { GMetrics *nmetrics; GSubList *sub_list = h->items[idx].sub_list; GSubItem *iter; int i = 0; if (sub_list == NULL) return; for (iter = sub_list->head; iter; iter = iter->next, i++) { set_data_metrics (iter->metrics, &nmetrics, totals); fprintf (fp, "\"%d\",", i); /* idx */ fprintf (fp, "\"%d\",", idx); /* parent idx */ fprintf (fp, "\"%s\",", module_to_id (h->module)); /* output metrics */ print_csv_metric_block (fp, nmetrics); free (nmetrics); } }