/*
- * svg_stats.c: Funtions used by sadf to display statistics in SVG format.
- * (C) 2016-2020 by Sebastien GODARD (sysstat <at> orange.fr)
+ * svg_stats.c: Functions used by sadf to display statistics in SVG format.
+ * (C) 2016-2021 by Sebastien GODARD (sysstat <at> orange.fr)
*
***************************************************************************
* This program is free software; you can redistribute it and/or modify it *
#define _(string) (string)
#endif
-extern unsigned int flags;
+extern uint64_t flags;
extern int palette;
unsigned int svg_colors[SVG_COL_PALETTE_NR][SVG_COL_PALETTE_SIZE] =
* the fields in the statistics structure.
*
* OUT:
- * @spmin Array containg the possible new min values for current activity.
- * @spmax Array containg the possible new max values for current activity.
+ * @spmin Array containing the possible new min values for current activity.
+ * @spmax Array containing the possible new max values for current activity.
***************************************************************************
*/
void save_extrema(unsigned int types_nr[], void *cs, void *ps, unsigned long long itv,
int j = 0;
char stmp[32];
+ /* Print marker in debug mode */
+ if (DISPLAY_DEBUG_MODE(flags)) {
+ printf("<!-- Hgrid -->\n");
+ }
+
do {
/* Display horizontal lines (except on X axis) */
if (j > 0) {
stamp.ust_time = svg_p->ust_time_ref; /* Only ust_time field needs to be set. TRUE_TIME not allowed */
+ /* Print marker in debug mode */
+ if (DISPLAY_DEBUG_MODE(flags)) {
+ printf("<!-- Vgrid -->\n");
+ }
+
/*
* What really matters to know when we should stop drawing vertical lines
* is the time end. v_gridnr is only informative and used to calculate
for (j = 0; (j <= (2 * v_gridnr)) && (stamp.ust_time <= svg_p->ust_time_end); j++) {
/* Display vertical lines */
- sa_get_record_timestamp_struct(flags, &stamp, &rectime);
+ if (sa_get_record_timestamp_struct(flags, &stamp, &rectime)) {
+#ifdef DEBUG
+ fprintf(stderr, "%s: ust_time: %llu\n", __FUNCTION__, stamp.ust_time);
+#endif
+ exit(1);
+ }
set_record_timestamp_string(flags, &stamp, NULL, cur_time, TIMESTAMP_LEN, &rectime);
printf("<polyline points=\"%ld,0 %ld,%d\" style=\"vector-effect: non-scaling-stroke; "
"stroke: #%06x\" transform=\"scale(%f,1)\"/>\n",
* @skip_void Set to <> 0 if graphs with no data should be skipped.
* This is typicallly used to not display CPU offline on the
* whole period.
- * @id Current activity id.
+ * @a Current activity structure.
* @xid Current activity extra id number.
*
* RETURNS:
int draw_activity_graphs(int g_nr, int g_type[], char *title[], char *g_title[], char *item_name,
int group[], double *spmin, double *spmax, char **out, int *outsize,
struct svg_parm *svg_p, struct record_header *record_hdr, int skip_void,
- unsigned int id, unsigned int xid)
+ struct activity *a, unsigned int xid)
{
char *out_p;
int i, j, dp, pos = 0, views_nr = 0, displayed = FALSE, palpos;
char val[32], cur_date[TIMESTAMP_LEN];
struct tm rectime;
+ /* Print activity name in debug mode */
+ if (DISPLAY_DEBUG_MODE(flags)) {
+ printf("<!-- Name: %s -->\n", a->name);
+ }
+
/* For each view which is part of current activity */
for (i = 0; i < g_nr; i++) {
+ /* Print view number in debug mode */
+ if (DISPLAY_DEBUG_MODE(flags)) {
+ printf("<!-- View %d -->\n", i + 1);
+ }
+
/* Used as index in color palette */
palpos = (palette == SVG_BW_COL_PALETTE ? 0 : pos);
if (!displayed) {
/* Translate to proper position for current activity */
printf("<g id=\"g%d-%d\" transform=\"translate(0,%d)\">\n",
- id, xid,
+ a->id, xid,
SVG_H_YSIZE +
SVG_C_YSIZE * (DISPLAY_TOC(flags) ? svg_p->nr_act_dispd : 0) +
SVG_T_YSIZE * svg_p->graph_no);
/* Display vertical lines and graduations */
display_vgrid(xpos, xfactor, v_gridnr, svg_p);
+ /* Print marker in debug mode */
+ if (DISPLAY_DEBUG_MODE(flags)) {
+ printf("<!-- Graphs -->\n");
+ }
+
/* Draw current graphs set */
for (j = 0; j < group[i]; j++) {
out_p = *(out + pos + j);
displayed = draw_activity_graphs(a->g_nr, g_type,
title, g_title1, item_name, group1,
spmin + pos, spmax + pos, out + pos, outsize + pos,
- svg_p, record_hdr, i, a->id, xid);
+ svg_p, record_hdr, i, a, xid);
}
else {
displayed = draw_activity_graphs(a->g_nr, g_type,
title, g_title2, item_name, group2,
spmin + pos, spmax + pos, out + pos, outsize + pos,
- svg_p, record_hdr, i, a->id, xid);
+ svg_p, record_hdr, i, a, xid);
}
if (displayed) {
xid++;
if (action & F_END) {
draw_activity_graphs(a->g_nr, g_type, title, g_title, NULL, group,
- spmin, spmax, out, outsize, svg_p, record_hdr, FALSE, a->id, 0);
+ spmin, spmax, out, outsize, svg_p, record_hdr, FALSE, a, 0);
/* Free remaining structures */
free_graphs(out, outsize, spmin, spmax);
if (action & F_END) {
draw_activity_graphs(a->g_nr, g_type, title, g_title, NULL, group,
- spmin, spmax, out, outsize, svg_p, record_hdr, FALSE, a->id, 0);
+ spmin, spmax, out, outsize, svg_p, record_hdr, FALSE, a, 0);
/* Free remaining structures */
free_graphs(out, outsize, spmin, spmax);
if (action & F_END) {
draw_activity_graphs(a->g_nr, g_type, title, g_title, NULL, group,
- spmin, spmax, out, outsize, svg_p, record_hdr, FALSE, a->id, 0);
+ spmin, spmax, out, outsize, svg_p, record_hdr, FALSE, a, 0);
/* Free remaining structures */
free_graphs(out, outsize, spmin, spmax);
if (action & F_END) {
draw_activity_graphs(a->g_nr, g_type, title, g_title, NULL, group,
- spmin, spmax, out, outsize, svg_p, record_hdr, FALSE, a->id, 0);
+ spmin, spmax, out, outsize, svg_p, record_hdr, FALSE, a, 0);
/* Free remaining structures */
free_graphs(out, outsize, spmin, spmax);
if (draw_activity_graphs(DISPLAY_MEM_ALL(a->opt_flags) ? 6 : 5,
g_type1, title1, g_title1, NULL, group1,
spmin, spmax, out, outsize, svg_p, record_hdr,
- FALSE, a->id, xid)) {
+ FALSE, a, xid)) {
xid++;
}
}
if (DISPLAY_SWAP(a->opt_flags)) {
draw_activity_graphs(3, g_type2, title2, g_title2, NULL, group2,
spmin + 16, spmax + 16, out + 16, outsize + 16,
- svg_p, record_hdr, FALSE, a->id, xid);
+ svg_p, record_hdr, FALSE, a, xid);
}
/* Free remaining structures */
if (action & F_END) {
draw_activity_graphs(a->g_nr, g_type, title, g_title, NULL, group,
- spmin, spmax, out, outsize, svg_p, record_hdr, FALSE, a->id, 0);
+ spmin, spmax, out, outsize, svg_p, record_hdr, FALSE, a, 0);
/* Free remaining structures */
free_graphs(out, outsize, spmin, spmax);
*(spmin + 5) /= 100; *(spmax + 5) /= 100;
draw_activity_graphs(a->g_nr, g_type, title, g_title, NULL, group,
- spmin, spmax, out, outsize, svg_p, record_hdr, FALSE, a->id, 0);
+ spmin, spmax, out, outsize, svg_p, record_hdr, FALSE, a, 0);
/* Free remaining structures */
free_graphs(out, outsize, spmin, spmax);
if (draw_activity_graphs(a->g_nr, g_type,
title, g_title, item_name, group,
spmin + pos, spmax + pos, out + pos, outsize + pos,
- svg_p, record_hdr, FALSE, a->id, xid)) {
+ svg_p, record_hdr, FALSE, a, xid)) {
xid++;
}
}
if (draw_activity_graphs(a->g_nr, g_type,
title, g_title, item_name, group,
spmin + pos, spmax + pos, out + pos, outsize + pos,
- svg_p, record_hdr, FALSE, a->id, xid)) {
+ svg_p, record_hdr, FALSE, a, xid)) {
xid++;
}
}
snedc = (struct stats_net_edev *) ((char *) a->buf[curr] + i * a->msize);
restart = svg_p->restart;
- if (!strcmp(snedc->interface, ""))
- /* Empty structure: This is the end of the list */
- break;
-
if (a->item_list != NULL) {
/* A list of devices has been entered on the command line */
if (!search_list_item(a->item_list, snedc->interface))
if (draw_activity_graphs(a->g_nr, g_type,
title, g_title, item_name, group,
spmin + pos, spmax + pos, out + pos, outsize + pos,
- svg_p, record_hdr, FALSE, a->id, xid)) {
+ svg_p, record_hdr, FALSE, a, xid)) {
xid++;
}
}
if (action & F_END) {
draw_activity_graphs(a->g_nr, g_type, title, g_title, NULL, group,
- spmin, spmax, out, outsize, svg_p, record_hdr, FALSE, a->id, 0);
+ spmin, spmax, out, outsize, svg_p, record_hdr, FALSE, a, 0);
/* Free remaining structures */
free_graphs(out, outsize, spmin, spmax);
if (action & F_END) {
draw_activity_graphs(a->g_nr, g_type, title, g_title, NULL, group,
- spmin, spmax, out, outsize, svg_p, record_hdr, FALSE, a->id, 0);
+ spmin, spmax, out, outsize, svg_p, record_hdr, FALSE, a, 0);
/* Free remaining structures */
free_graphs(out, outsize, spmin, spmax);
if (action & F_END) {
draw_activity_graphs(a->g_nr, g_type, title, g_title, NULL, group,
- spmin, spmax, out, outsize, svg_p, record_hdr, FALSE, a->id, 0);
+ spmin, spmax, out, outsize, svg_p, record_hdr, FALSE, a, 0);
/* Free remaining structures */
free_graphs(out, outsize, spmin, spmax);
if (action & F_END) {
draw_activity_graphs(a->g_nr, g_type, title, g_title, NULL, group,
- spmin, spmax, out, outsize, svg_p, record_hdr, FALSE, a->id, 0);
+ spmin, spmax, out, outsize, svg_p, record_hdr, FALSE, a, 0);
/* Free remaining structures */
free_graphs(out, outsize, spmin, spmax);
if (action & F_END) {
draw_activity_graphs(a->g_nr, g_type, title, g_title, NULL, group,
- spmin, spmax, out, outsize, svg_p, record_hdr, FALSE, a->id, 0);
+ spmin, spmax, out, outsize, svg_p, record_hdr, FALSE, a, 0);
/* Free remaining structures */
free_graphs(out, outsize, spmin, spmax);
if (action & F_END) {
draw_activity_graphs(a->g_nr, g_type, title, g_title, NULL, group,
- spmin, spmax, out, outsize, svg_p, record_hdr, FALSE, a->id, 0);
+ spmin, spmax, out, outsize, svg_p, record_hdr, FALSE, a, 0);
/* Free remaining structures */
free_graphs(out, outsize, spmin, spmax);
if (action & F_END) {
draw_activity_graphs(a->g_nr, g_type, title, g_title, NULL, group,
- spmin, spmax, out, outsize, svg_p, record_hdr, FALSE, a->id, 0);
+ spmin, spmax, out, outsize, svg_p, record_hdr, FALSE, a, 0);
/* Free remaining structures */
free_graphs(out, outsize, spmin, spmax);
if (action & F_END) {
draw_activity_graphs(a->g_nr, g_type, title, g_title, NULL, group,
- spmin, spmax, out, outsize, svg_p, record_hdr, FALSE, a->id, 0);
+ spmin, spmax, out, outsize, svg_p, record_hdr, FALSE, a, 0);
/* Free remaining structures */
free_graphs(out, outsize, spmin, spmax);
if (action & F_END) {
draw_activity_graphs(a->g_nr, g_type, title, g_title, NULL, group,
- spmin, spmax, out, outsize, svg_p, record_hdr, FALSE, a->id, 0);
+ spmin, spmax, out, outsize, svg_p, record_hdr, FALSE, a, 0);
/* Free remaining structures */
free_graphs(out, outsize, spmin, spmax);
if (action & F_END) {
draw_activity_graphs(a->g_nr, g_type, title, g_title, NULL, group,
- spmin, spmax, out, outsize, svg_p, record_hdr, FALSE, a->id, 0);
+ spmin, spmax, out, outsize, svg_p, record_hdr, FALSE, a, 0);
/* Free remaining structures */
free_graphs(out, outsize, spmin, spmax);
if (action & F_END) {
draw_activity_graphs(a->g_nr, g_type, title, g_title, NULL, group,
- spmin, spmax, out, outsize, svg_p, record_hdr, FALSE, a->id, 0);
+ spmin, spmax, out, outsize, svg_p, record_hdr, FALSE, a, 0);
/* Free remaining structures */
free_graphs(out, outsize, spmin, spmax);
if (action & F_END) {
draw_activity_graphs(a->g_nr, g_type, title, g_title, NULL, group,
- spmin, spmax, out, outsize, svg_p, record_hdr, FALSE, a->id, 0);
+ spmin, spmax, out, outsize, svg_p, record_hdr, FALSE, a, 0);
/* Free remaining structures */
free_graphs(out, outsize, spmin, spmax);
if (action & F_END) {
draw_activity_graphs(a->g_nr, g_type, title, g_title, NULL, group,
- spmin, spmax, out, outsize, svg_p, record_hdr, FALSE, a->id, 0);
+ spmin, spmax, out, outsize, svg_p, record_hdr, FALSE, a, 0);
/* Free remaining structures */
free_graphs(out, outsize, spmin, spmax);
if (action & F_END) {
draw_activity_graphs(a->g_nr, g_type, title, g_title, NULL, group,
- spmin, spmax, out, outsize, svg_p, record_hdr, FALSE, a->id, 0);
+ spmin, spmax, out, outsize, svg_p, record_hdr, FALSE, a, 0);
/* Free remaining structures */
free_graphs(out, outsize, spmin, spmax);
if (action & F_END) {
draw_activity_graphs(a->g_nr, g_type, title, g_title, NULL, group,
- spmin, spmax, out, outsize, svg_p, record_hdr, FALSE, a->id, 0);
+ spmin, spmax, out, outsize, svg_p, record_hdr, FALSE, a, 0);
/* Free remaining structures */
free_graphs(out, outsize, spmin, spmax);
if (action & F_END) {
draw_activity_graphs(a->g_nr, g_type, title, g_title, NULL, group,
- spmin, spmax, out, outsize, svg_p, record_hdr, FALSE, a->id, 0);
+ spmin, spmax, out, outsize, svg_p, record_hdr, FALSE, a, 0);
/* Free remaining structures */
free_graphs(out, outsize, spmin, spmax);
if (draw_activity_graphs(a->g_nr, g_type,
title, g_title, item_name, group,
spmin + i, spmax + i, out + i, outsize + i,
- svg_p, record_hdr, i, a->id, xid)) {
+ svg_p, record_hdr, i, a, xid)) {
xid++;
}
}
if (draw_activity_graphs(a->g_nr, g_type,
title, g_title, item_name, group,
spmin + i, spmax + i, out + i, outsize + i,
- svg_p, record_hdr, FALSE, a->id, xid)) {
+ svg_p, record_hdr, FALSE, a, xid)) {
xid++;
}
}
title, g_title, item_name, group,
spmin + TEMP_ARRAY_SZ * i, spmax + TEMP_ARRAY_SZ * i,
out + TEMP_ARRAY_SZ * i, outsize + TEMP_ARRAY_SZ * i,
- svg_p, record_hdr, FALSE, a->id, xid)) {
+ svg_p, record_hdr, FALSE, a, xid)) {
xid++;
}
}
title, g_title, item_name, group,
spmin + IN_ARRAY_SZ * i, spmax + IN_ARRAY_SZ * i,
out + IN_ARRAY_SZ * i, outsize + IN_ARRAY_SZ * i,
- svg_p, record_hdr, FALSE, a->id, xid)) {
+ svg_p, record_hdr, FALSE, a, xid)) {
xid++;
}
}
if (action & F_END) {
draw_activity_graphs(a->g_nr, g_type,
title, g_title, NULL, group,
- spmin, spmax, out, outsize, svg_p, record_hdr, FALSE, a->id, 0);
+ spmin, spmax, out, outsize, svg_p, record_hdr, FALSE, a, 0);
/* Free remaining structures */
free_graphs(out, outsize, spmin, spmax);
if (draw_activity_graphs(a->g_nr, g_type, title, g_title, item_name, group,
spmin + pos, spmax + pos, out + pos, outsize + pos,
- svg_p, record_hdr, FALSE, a->id, xid)) {
+ svg_p, record_hdr, FALSE, a, xid)) {
xid++;
}
}
draw_activity_graphs(a->g_nr, g_type,
title, g_title, item_name, group,
spmin + pos, spmax + pos, out + pos, outsize + pos,
- svg_p, record_hdr, FALSE, a->id, i);
+ svg_p, record_hdr, FALSE, a, i);
}
/* Free remaining structures */
draw_activity_graphs(a->g_nr, g_type,
title, g_title, item_name, group,
spmin + pos, spmax + pos, out + pos, outsize + pos,
- svg_p, record_hdr, FALSE, a->id, i);
+ svg_p, record_hdr, FALSE, a, i);
}
/* Free remaining structures */
*(spmin + 2) /= 100; *(spmax + 2) /= 100;
draw_activity_graphs(a->g_nr, g_type, title, g_title, NULL, group,
- spmin, spmax, out, outsize, svg_p, record_hdr, FALSE, a->id, 0);
+ spmin, spmax, out, outsize, svg_p, record_hdr, FALSE, a, 0);
/* Free remaining structures */
free_graphs(out, outsize, spmin, spmax);
*(spmin + 6) /= 100; *(spmax + 6) /= 100;
draw_activity_graphs(a->g_nr, g_type, title, g_title, NULL, group,
- spmin, spmax, out, outsize, svg_p, record_hdr, FALSE, a->id, 0);
+ spmin, spmax, out, outsize, svg_p, record_hdr, FALSE, a, 0);
/* Free remaining structures */
free_graphs(out, outsize, spmin, spmax);
*(spmin + 6) /= 100; *(spmax + 6) /= 100;
draw_activity_graphs(a->g_nr, g_type, title, g_title, NULL, group,
- spmin, spmax, out, outsize, svg_p, record_hdr, FALSE, a->id, 0);
+ spmin, spmax, out, outsize, svg_p, record_hdr, FALSE, a, 0);
/* Free remaining structures */
free_graphs(out, outsize, spmin, spmax);