]> granicus.if.org Git - sysstat/commitdiff
SVG: Add "skipempty" option
authorSebastien GODARD <sysstat@users.noreply.github.com>
Sun, 1 May 2016 08:54:51 +0000 (10:54 +0200)
committerSebastien GODARD <sysstat@users.noreply.github.com>
Sun, 1 May 2016 08:54:51 +0000 (10:54 +0200)
Add a new switch (-O) to sadf to enable the user to pass additional
options to control SVG output.
This first option is "skipempty" which tells sadf to not display views
where all graphs have only zero values.

Example: sadf -g -O skipempty -- -A > out.svg

Signed-off-by: Sebastien GODARD <sysstat@users.noreply.github.com>
sa.h
sadf.c
svg_stats.c

diff --git a/sa.h b/sa.h
index 4ea27a017d72a5649c7b90ba767e5a845d54ee99..ef0aa31f27a7205bb21cfeb15c2665b79f97ec1f 100644 (file)
--- a/sa.h
+++ b/sa.h
@@ -97,6 +97,7 @@
 #define S_F_PERSIST_NAME       0x00002000
 #define S_F_LOCAL_TIME         0x00004000
 #define S_F_PREFD_TIME_OUTPUT  0x00008000
+#define S_F_SVG_SKIP           0x00010000
 
 #define WANT_SINCE_BOOT(m)             (((m) & S_F_SINCE_BOOT)   == S_F_SINCE_BOOT)
 #define WANT_SA_ROTAT(m)               (((m) & S_F_SA_ROTAT)     == S_F_SA_ROTAT)
 #define DISPLAY_PERSIST_NAME_S(m)      (((m) & S_F_PERSIST_NAME) == S_F_PERSIST_NAME)
 #define PRINT_LOCAL_TIME(m)            (((m) & S_F_LOCAL_TIME)   == S_F_LOCAL_TIME)
 #define USE_PREFD_TIME_OUTPUT(m)       (((m) & S_F_PREFD_TIME_OUTPUT)   == S_F_PREFD_TIME_OUTPUT)
+#define SKIP_EMPTY_VIEWS(m)            (((m) & S_F_SVG_SKIP)     == S_F_SVG_SKIP)
 
 #define AO_F_NULL              0x00000000
 
 #define K_POWER                "POWER"
 #define K_USB          "USB"
 
+#define K_SKIP_EMPTY   "skipempty"
+
 /* Groups of activities */
 #define G_DEFAULT      0x00
 #define G_INT          0x01
diff --git a/sadf.c b/sadf.c
index 41e4f40c4b7c1ef63f4fff435dde4e9decfedb40..49d77d57ee1789141cc871afd16cc0f790f83eda 100644 (file)
--- a/sadf.c
+++ b/sadf.c
@@ -1436,6 +1436,7 @@ int main(int argc, char **argv)
        int day_offset = 0;
        int i, rc;
        char dfile[MAX_FILE_LEN];
+       char *t;
 
        /* Get HZ */
        get_HZ();
@@ -1492,6 +1493,22 @@ int main(int argc, char **argv)
                        }
                }
 
+               else if (!strcmp(argv[opt], "-O")) {
+                       /* Parse SVG options */
+                       if (!argv[++opt] || sar_options) {
+                               usage(argv[0]);
+                       }
+                       for (t = strtok(argv[opt], ","); t; t = strtok(NULL, ",")) {
+                               if (!strcmp(t, K_SKIP_EMPTY)) {
+                                       flags |= S_F_SVG_SKIP;
+                               }
+                               else {
+                                       usage(argv[0]);
+                               }
+                       }
+                       opt++;
+               }
+
                else if ((strlen(argv[opt]) > 1) &&
                         (strlen(argv[opt]) < 4) &&
                         !strncmp(argv[opt], "-", 1) &&
index d361c9ba79dc37f8413cc3bbef6644c64de66f76..5f162c114a15c0305d639e93bbcd44baaf21a21a 100644 (file)
@@ -157,7 +157,7 @@ void save_extrema(int llu_nr, int lu_nr, int u_nr, void *cs, void *ps,
 /*
  ***************************************************************************
  * Find the min and max values of all the graphs that will be drawn in the
- * same window. The graphs have their own min and max values in
+ * same view. The graphs have their own min and max values in
  * minv[pos...pos+n-1] and maxv[pos...pos+n-1]. 
  *
  * IN:
@@ -167,20 +167,23 @@ void save_extrema(int llu_nr, int lu_nr, int u_nr, void *cs, void *ps,
  * @maxv       Array containing max values for graphs.
  *
  * OUT:
- * @minv       minv[pos] is modified and contains the global min value found.
- * @maxv       maxv[pos] is modified and contains the global max value found.
+ * @gmin       Global min value found.
+ * @gmax       Global max value found.
  ***************************************************************************
  */
-void get_global_extrema(int pos, int n, double minv[], double maxv[])
+void get_global_extrema(int pos, int n, double minv[], double maxv[], double *gmin, double *gmax)
 {
        int i;
 
+       *gmin = minv[pos];
+       *gmax = maxv[pos];
+
        for (i = 1; i < n; i++) {
-               if (minv[pos + i] < minv[pos]) {
-                       minv[pos] = minv[pos + i];
+               if (minv[pos + i] < *gmin) {
+                       *gmin = minv[pos + i];
                }
-               if (maxv[pos + i] > maxv[pos]) {
-                       maxv[pos] = maxv[pos + i];
+               if (maxv[pos + i] > *gmax) {
+                       *gmax = maxv[pos + i];
                }
        }
 }
@@ -589,7 +592,7 @@ void free_graphs(char **out, int *outsize, double *spmin, double *spmax)
  * Display all graphs for current activity.
  *
  * IN:
- * @g_nr       Number of graphs to display.
+ * @g_nr       Number of sets of graphs (views) to display.
  * @g_type     Type of graph (SVG_LINE_GRAPH, SVG_BAR_GRAPH).
  * @title      Titles for each set of graphs.
  * @g_title    Titles for each graph.
@@ -612,9 +615,9 @@ void draw_activity_graphs(int g_nr, int g_type, char *title[], char *g_title[],
        struct record_header stamp;
        struct tm rectime;
        char *out_p;
-       int i, j, dp, pos = 0;
+       int i, j, dp, pos = 0, views_nr = 0;
        long int k;
-       double lmax, xfactor, yfactor, ypos;
+       double lmax, xfactor, yfactor, ypos, gmin, gmax;
        char cur_time[32];
 
        /* Translate to proper position for current activity */
@@ -625,6 +628,15 @@ void draw_activity_graphs(int g_nr, int g_type, char *title[], char *g_title[],
        /* For each set of graphs which are part of current activity */
        for (i = 0; i < g_nr; i++) {
 
+               /* Get global min and max value for current set of graphs */
+               get_global_extrema(pos, group[i], spmin, spmax, &gmin, &gmax);
+
+               /* Don't display empty views if requested */
+               if (SKIP_EMPTY_VIEWS(flags) && !gmax)
+                       continue;
+               /* Increment number of views actually displayed */
+               views_nr++;
+
                /* Graph background */
                printf("<rect x=\"0\" y=\"%d\" height=\"%d\" width=\"%d\"/>\n",
                       i * SVG_T_YSIZE,
@@ -671,9 +683,6 @@ void draw_activity_graphs(int g_nr, int g_type, char *title[], char *g_title[],
                               !dp * 2, *(spmin + pos + j), !dp * 2, *(spmax + pos + j));
                }
 
-               /* Get global min and max value for current set of graphs */
-               get_global_extrema(pos, group[i], spmin, spmax);
-
                /* Translate to proper position for current graph within current activity */
                printf("<g transform=\"translate(%d,%d)\">\n",
                       SVG_M_XSIZE, SVG_M_YSIZE + SVG_G_YSIZE + i * SVG_T_YSIZE);
@@ -681,12 +690,12 @@ void draw_activity_graphs(int g_nr, int g_type, char *title[], char *g_title[],
                /* Grid */
                if (g_type == SVG_LINE_GRAPH) {
                        /* For line graphs */
-                       if (*(spmax + pos) == 0) {
+                       if (!gmax) {
                                /* If all values are zero then set current max value to 1 */
                                lmax = 1.0;
                        }
                        else {
-                               lmax = *(spmax + pos);
+                               lmax = gmax;
                        }
                        /* Max value cannot be too small, else Y graduations will be meaningless */
                        if (lmax < SVG_H_GRIDNR * 0.01) {
@@ -700,8 +709,8 @@ void draw_activity_graphs(int g_nr, int g_type, char *title[], char *g_title[],
                        dp = 0;         /* No decimals */
 
                        /* Max should be always 100% except for percentage values greater than 100% */
-                       if (*(spmax + pos) > 100.0) {
-                               lmax = *(spmax + pos);
+                       if (gmax > 100.0) {
+                               lmax = gmax;
                        }
                        else {
                                lmax = 100.0;
@@ -773,7 +782,7 @@ void draw_activity_graphs(int g_nr, int g_type, char *title[], char *g_title[],
        printf("</g>\n");
 
        /* Next graph */
-       (svg_p->graph_no) += g_nr;
+       (svg_p->graph_no) += views_nr;
 }
 
 /*