]> granicus.if.org Git - sysstat/commitdiff
Introduce sargraph2 - a sadf plotter
authorDimitrios Apostolou <jimis@gmx.net>
Fri, 3 Apr 2015 01:41:16 +0000 (03:41 +0200)
committerDimitrios Apostolou <jimis@gmx.net>
Fri, 3 Apr 2015 01:41:16 +0000 (03:41 +0200)
Reimplemented most of the functionality of "sargraph" without any XML
transformations. Tweaked the graphs to be more meaningful and more beautiful,
and enabled optional output to file.

contrib/sargraph/sargraph2 [new file with mode: 0755]

diff --git a/contrib/sargraph/sargraph2 b/contrib/sargraph/sargraph2
new file mode 100755 (executable)
index 0000000..c06497c
--- /dev/null
@@ -0,0 +1,294 @@
+#!/bin/bash
+
+
+set -e
+
+
+# Our dependencies - bail out if they are not found
+SADF=`which sadf`
+GNUPLOT=`which gnuplot`
+
+
+# Default for --sa-file is today's file
+# (by default sadf will show today's logs)
+SA_FILE=""
+
+# Default for --sa-dir
+SA_DIR="/var/log/sa"
+
+# Default for --type
+GRAPH_TYPE=CPU
+
+
+GNUPLOT_TERMINAL="pngcairo font \"Sans,8\" size 640,320"
+SAFILES_REGEX='/sar?[0-9]{2,8}(\.(Z|gz|bz2|xz|lz|lzo))?$'
+GRAPH_TYPES="cpu,mem,io"
+
+
+print_usage()
+{
+    echo "
+Usage
+       sargraph2 [--type $GRAPH_TYPES] [--sa-file INFILE] [--output OUTFILE]
+
+Examples
+
+To plot CPU for today no arguments are needed:
+       sargraph2
+To plot MEM for 20150330:
+       sargraph2 --type mem --sa-file /var/log/sa/sa20150330.gz
+To plot I/O for 20150330 to a PNG file:
+       sargraph2 --type mem --sa-file /var/log/sa/sa20150330.gz --output io.png
+
+"
+}
+
+
+######### OPTION PARSING ###########
+parsed_opts=`getopt -o "h" \
+    -l help,sa-dir:,sa-file:,output:,type: \
+    -- "$@"`
+eval set -- "$parsed_opts"
+
+DONE=no
+while [ $DONE != yes ]
+do
+    case $1 in
+    -h|--help)
+        print_usage
+        exit
+        shift
+        ;;
+    --sa-dir)
+        shift
+        SA_DIR="$1"
+        ;;
+    --sa-file)
+        shift
+        SA_FILE="$1"
+        ;;
+    --output)
+        shift
+        OUT_FILE="$1"
+        ;;
+    --type)
+        shift
+        GRAPH_TYPE=`echo $1 | tr a-z A-Z`
+        ;;
+    --)
+        # End of options
+        DONE=yes
+        ;;
+    *)
+        echo Unexpected argument: $1
+        exit 1
+        ;;
+    esac
+
+    shift                      # should shift the last arg or '--' if DONE=yes
+done
+####################################
+
+
+# Decompress a file to another, or just copy it if not compressed
+decompress_copy()
+{
+    if [ x$# != x2 ]
+    then
+        echo "Function decompress_copy requires 2 arguments but got $#: $*"
+        return 1
+    fi
+
+    if [ -f "$1" ]
+    then
+        case "$1" in
+
+        *.Z) uncompress -c "$1" > "$2" ;;
+        *.gz)  gzip    -dc "$1" > "$2" ;;
+        *.bz2) bzip2   -dc "$1" > "$2" ;;
+        *.xz)  xz      -dc "$1" > "$2" ;;
+        *.lz)  lzip    -dc "$1" > "$2" ;;
+        *.lzo) lzop    -dc "$1" > "$2" ;;
+
+        *) cp "$1" "$2"        ;;
+
+        esac
+    else
+        echo "$1: file not found" 1>&2
+        return 1
+    fi
+}
+
+
+
+
+# TODO send systemd patch
+#soupermouf;60;2015-04-01 04:24:00;-1;5.77;0.00;2.10;0.63;0.00;91.50
+#soupermouf;26846;2015-04-01 11:51:26;-1;0.00;0.00;0.00;0.00;0.00;0.00
+#soupermouf;60;2015-04-01 11:52:26;-1;7.11;0.01;2.69;68.44;0.00;21.75
+
+cpu_gnuplot()                             # %iowait,%user,%nice,%system,%steal
+{
+    # First make sure that the columns are where we expect them to be
+    HEADER=`head -1 $2 | cut -d ';' -f 5-10`
+    EXPECTED="%user;%nice;%system;%iowait;%steal;%idle"
+    if [ "$HEADER" != "$EXPECTED" ]
+    then
+        echo "Headers not in right order: $HEADER" 1>&2
+        exit 1
+    fi
+
+    cat > $1 <<EOF
+set title "sar -u"
+set xdata time
+set format x "%H:%M"
+set ylabel "Percentage"
+set yrange [0:100]
+set timefmt "%Y-%m-%d %H:%M:%S"
+set datafile separator ";"
+plot \
+    "$2" using 3:(\$9+\$7+\$6+\$5+\$8) title "%iowait" with filledcurves x1 linecolor rgb "light-gray", \
+    "$2" using 3:(\$9+\$7+\$6+\$5)     title "%user"   with filledcurves x1 linecolor rgb "dark-green", \
+    "$2" using 3:(\$9+\$7+\$6)         title "%nice"   with filledcurves x1 linecolor rgb "greenyellow", \
+    "$2" using 3:(\$9+\$7)             title "%system" with filledcurves x1 linecolor rgb "red", \
+    "$2" using 3:(\$9)                 title "%steal"  with filledcurves x1 linecolor rgb "purple"
+EOF
+}
+
+
+mem_gnuplot()                    # free,used,buffers,cached / %commit,%swpused
+{
+    # First make sure that the columns are where we expect them to be
+    HEADER=`head -1 $2 | cut -d ';' -f 4-10`
+    EXPECTED="kbmemfree;kbmemused;%memused;kbbuffers;kbcached;kbcommit;%commit"
+    if [ "$HEADER" != "$EXPECTED" ]
+    then
+        echo "Headers not in right order: $HEADER" 1>&2
+        exit 1
+    fi
+    HEADER=`head -1 $3 | cut -d ';' -f 4-6`
+    EXPECTED="kbswpfree;kbswpused;%swpused"
+    if [ "$HEADER" != "$EXPECTED" ]
+    then
+        echo "Headers not in right order: $HEADER" 1>&2
+        exit 1
+    fi
+
+    cat > $1 <<EOF
+set title "sar -r"
+set xdata time
+set format x "%H:%M"
+set ylabel "Memory Usage in MB"
+set yrange [0:]
+set y2label "Percentage"
+set y2range [0:]
+set y2tics
+set timefmt "%Y-%m-%d %H:%M:%S"
+set datafile separator ";"
+set key on bottom center opaque
+plot \
+    "$2" using 3:((\$5+\$4)/1024)     title "free"    with filledcurves x1 linecolor rgb "light-gray", \
+    "$2" using 3:((\$5)/1024)         title "cached"  with filledcurves x1 linecolor rgb "dark-green", \
+    "$2" using 3:((\$5-\$8)/1024)     title "buffers" with filledcurves x1 linecolor rgb "greenyellow", \
+    "$2" using 3:((\$5-\$8-\$7)/1024) title "used"    with filledcurves x1 linecolor rgb "red", \
+    \
+    "$2" using 3:(\$10)    title "%commit"  with lines linecolor rgb "blue"   linewidth 2 axes x1y2, \
+    "$3" using 3:(\$6)     title "%swpused" with lines linecolor rgb "dark-magenta" linewidth 2 axes x1y2
+EOF
+}
+
+
+io_gnuplot()                                      # %KBr/s,KBw/s / rIOPS,wIOPS
+{
+    # First make sure that the columns are where we expect them to be
+    HEADER=`head -1 $2 | cut -d ';' -f 4-8`
+    EXPECTED="tps;rtps;wtps;bread/s;bwrtn/s"
+    if [ "$HEADER" != "$EXPECTED" ]
+    then
+        echo "Headers not in right order: $HEADER" 1>&2
+        exit 1
+    fi
+
+    cat > $1 <<EOF
+set title "sar -b"
+set xdata time
+set format x "%H:%M"
+set ylabel "MB/s"
+set yrange [0:]
+set y2label "IOPS"
+set y2range [0:]
+set y2tics
+set timefmt "%Y-%m-%d %H:%M:%S"
+set datafile separator ";"
+plot \
+    "$2" using 3:((\$8+\$7)*2/1024) title "rMB/s" with filledcurves x1 linecolor rgb "dark-green", \
+    "$2" using 3:((\$8)*2/1024)     title "wMB/s" with filledcurves x1 linecolor rgb "dark-red", \
+    \
+    "$2" using 3:(\$4) title "rIOPS"  with lines linecolor rgb "light-green"   linewidth 2 axes x1y2, \
+    "$2" using 3:(\$6) title "wIOPS"  with lines linecolor rgb "light-red" linewidth 2 axes x1y2
+EOF
+}
+
+
+
+
+if [ x"$OUT_FILE" = x ]
+then
+    # no --output passed, INTERACTIVE mode
+    GNUPLOT_OPTS="-persist"
+else
+    GNUPLOT_OPTS="-e 'set terminal $GNUPLOT_TERMINAL; set output \"$OUT_FILE\"'"
+fi
+
+if [ x"$SA_FILE" != x ]
+then
+    # Decompress the SA file if it's compressed
+    PLAIN_SA_FILE=`mktemp`
+    decompress_copy "$SA_FILE" $PLAIN_SA_FILE
+else
+    # If the user passed no parameter
+    PLAIN_SA_FILE=""
+fi
+unset SA_FILE
+
+DATAFILE=`mktemp`
+DATAFILE2=`mktemp`
+GNUPLOTFILE=`mktemp`
+
+case "$GRAPH_TYPE" in
+"CPU")
+    $SADF -t -d -C $PLAIN_SA_FILE -- -u   > $DATAFILE
+    cpu_gnuplot $GNUPLOTFILE $DATAFILE
+    ;;
+"MEM")
+    $SADF -t -d -C $PLAIN_SA_FILE -- -r   > $DATAFILE
+    $SADF -t -d -C $PLAIN_SA_FILE -- -S   > $DATAFILE2
+    mem_gnuplot $GNUPLOTFILE $DATAFILE $DATAFILE2
+    ;;
+"IO")
+    $SADF -t -d -C $PLAIN_SA_FILE -- -b   > $DATAFILE
+    io_gnuplot $GNUPLOTFILE $DATAFILE
+    ;;
+*)
+    echo "Unknown graph type, supported types are: $GRAPH_TYPES" 1>&2
+    exit 1
+esac
+
+eval $GNUPLOT $GNUPLOT_OPTS $GNUPLOTFILE
+
+
+[ -f "$PLAIN_SA_FILE" ]        && rm $PLAIN_SA_FILE
+[ -f "$GNUPLOTFILE" ]          && rm $GNUPLOTFILE
+[ -f "$DATAFILE" ]             && rm $DATAFILE
+[ -f "$DATAFILE2" ]            && rm $DATAFILE2
+
+
+exit
+
+
+# Local Variables:
+# sh-basic-offset: 4
+# indent-tabs-mode: nil
+# sh-indent-for-case-label: 0
+# sh-indent-for-case-alt: +
+# End: