summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rwxr-xr-xcharts.d/example.chart.sh (renamed from charts.d/example-chart.sh)0
-rwxr-xr-xcharts.d/load_average.chart.sh47
-rwxr-xr-xcharts.d/squid.chart.sh (renamed from charts.d/squid-chart.sh)0
-rw-r--r--conf.d/charts.d.conf4
-rw-r--r--conf.d/squid.conf1
-rwxr-xr-xplugins.d/charts.d.dryrun-helper.sh73
-rwxr-xr-xplugins.d/charts.d.plugin174
7 files changed, 299 insertions, 0 deletions
diff --git a/charts.d/example-chart.sh b/charts.d/example.chart.sh
index 60607fd53d..60607fd53d 100755
--- a/charts.d/example-chart.sh
+++ b/charts.d/example.chart.sh
diff --git a/charts.d/load_average.chart.sh b/charts.d/load_average.chart.sh
new file mode 100755
index 0000000000..e2c72494a9
--- /dev/null
+++ b/charts.d/load_average.chart.sh
@@ -0,0 +1,47 @@
+#!/bin/sh
+
+load_average_check() {
+ # this should return:
+ # - 0 to enable the chart
+ # - 1 to disable the chart
+
+ return 0
+}
+
+load_average_create() {
+ # create a chart with 3 dimensions
+cat <<EOF
+CHART example.load '' "System Load Average" "load" load load line 500 $update_every
+DIMENSION load1 '1 min' absolute 1 100
+DIMENSION load5 '5 mins' absolute 1 100
+DIMENSION load15 '15 mins' absolute 1 100
+EOF
+
+ return 0
+}
+
+load_average_update() {
+ # do all the work to collect / calculate the values
+ # for each dimension
+ # remember: KEEP IT SIMPLE AND SHORT
+
+ # here we parse the system average load
+ # it is decimal (with 2 decimal digits), so we remove the dot and
+ # at the definition we have divisor = 100, to have the graph show the right value
+ loadavg="`cat /proc/loadavg | sed -e "s/\.//g"`"
+ load1=`echo $loadavg | cut -d ' ' -f 1`
+ load5=`echo $loadavg | cut -d ' ' -f 2`
+ load15=`echo $loadavg | cut -d ' ' -f 3`
+
+ # write the result of the work.
+ cat <<VALUESEOF
+BEGIN example.load
+SET load1 = $load1
+SET load5 = $load5
+SET load15 = $load15
+END
+VALUESEOF
+
+ return 0
+}
+
diff --git a/charts.d/squid-chart.sh b/charts.d/squid.chart.sh
index 54a545a5cc..54a545a5cc 100755
--- a/charts.d/squid-chart.sh
+++ b/charts.d/squid.chart.sh
diff --git a/conf.d/charts.d.conf b/conf.d/charts.d.conf
new file mode 100644
index 0000000000..e05d2ab3fe
--- /dev/null
+++ b/conf.d/charts.d.conf
@@ -0,0 +1,4 @@
+squid=yes
+test=yes
+example=yes
+load_average=yes
diff --git a/conf.d/squid.conf b/conf.d/squid.conf
new file mode 100644
index 0000000000..dede4db45f
--- /dev/null
+++ b/conf.d/squid.conf
@@ -0,0 +1 @@
+squid_url="http://127.0.0.1:3128/squid-internal-mgr/counters"
diff --git a/plugins.d/charts.d.dryrun-helper.sh b/plugins.d/charts.d.dryrun-helper.sh
new file mode 100755
index 0000000000..3d0bcb3732
--- /dev/null
+++ b/plugins.d/charts.d.dryrun-helper.sh
@@ -0,0 +1,73 @@
+#!/bin/sh
+
+# will stop the script for any error
+set -e
+
+me="$0"
+name="$1"
+chart="$2"
+conf="$3"
+
+can_diff=1
+
+tmp1=`mktemp`
+tmp2=`mktemp`
+
+myset() {
+ set | grep -v "^_=" | grep -v "^PIPESTATUS=" | grep -v "^BASH_LINENO="
+}
+
+# save 2 'set'
+myset >"$tmp1"
+myset >"$tmp2"
+
+# make sure they don't differ
+diff "$tmp1" "$tmp2" >/dev/null 2>&1
+if [ $? -ne 0 ]
+then
+ # they differ, we cannot do the check
+ echo >&2 "$me: cannot check with diff."
+ can_diff=0
+fi
+
+# do it again, now including the script
+myset >"$tmp1"
+
+# include the plugin and its config
+if [ -f "$conf" ]
+then
+ . "$conf"
+ if [ $? -ne 0 ]
+ then
+ echo >&2 "$me: cannot load config file $conf"
+ rm "$tmp1" "$tmp2"
+ exit 1
+ fi
+fi
+
+. "$chart"
+if [ $? -ne 0 ]
+then
+ echo >&2 "$me: cannot load chart file $chart"
+ rm "$tmp1" "$tmp2"
+ exit 1
+fi
+
+# remove all variables starting with the plugin name
+myset | grep -v "^$name" >"$tmp2"
+
+if [ $can_diff -eq 1 ]
+then
+ # check if they are different
+ # make sure they don't differ
+ diff "$tmp1" "$tmp2" >&2
+ if [ $? -ne 0 ]
+ then
+ # they differ
+ rm "$tmp1" "$tmp2"
+ exit 1
+ fi
+fi
+
+rm "$tmp1" "$tmp2"
+exit 0
diff --git a/plugins.d/charts.d.plugin b/plugins.d/charts.d.plugin
new file mode 100755
index 0000000000..e10384cb61
--- /dev/null
+++ b/plugins.d/charts.d.plugin
@@ -0,0 +1,174 @@
+#!/bin/sh
+
+check=0
+if [ "$1" = "check" ]
+then
+ check=1
+ shift
+fi
+
+# default sleep function
+loopsleepms() {
+ sleep $1
+}
+# if found and included, this file overwrites loopsleepms()
+# with a high resolution timer function for precise looping.
+. "`dirname $0`/loopsleepms.sh.inc"
+
+# netdata passes the requested update frequency as the first argument
+update_every=$1
+update_every=$(( update_every + 1 - 1)) # makes sure it is a number
+test $update_every -eq 0 && update_every=1 # if it is zero, make it 1
+
+pluginsd="plugins.d"
+confd="conf.d"
+chartsd="charts.d"
+myconfig="$confd/charts.d.conf"
+minimum_update_frequency=1
+
+# load the configuration
+if [ -f "$myconfig" ]
+ then
+ . "$myconfig"
+ if [ $? -ne 0 ]
+ then
+ echo >&2 "charts.d: cannot load $myconfig"
+ echo "DISABLE"
+ exit 1
+ fi
+fi
+
+if [ ! -d "$chartsd" ]
+ then
+ echo >&2 "charts.d: cannot find charts directory '$chartsd'"
+ echo "DISABLE"
+fi
+
+all_charts() {
+ cd "$chartsd"
+ ls *.chart.sh | sed "s/\.chart\.sh$//g"
+}
+
+all_enabled_charts() {
+ local charts=
+
+ # find all enabled charts
+
+ for x in `all_charts`
+ do
+ eval "enabled=\$$x"
+ if [ "$enabled" = "yes" ]
+ then
+ local charts="$charts $x"
+ else
+ echo >&2 "charts.d: chart '$x' is NOT enabled. Add a line with $x=yes in $myconfig to enable it."
+ fi
+ done
+
+ local charts2=
+ for x in $charts
+ do
+ # check the enabled charts
+ local check=`cat "$chartsd/$x.chart.sh" | sed "s/^ \+//g" | grep "^${x}_check()"`
+ if [ -z "$check" ]
+ then
+ echo >&2 "charts.d: chart '$x' does not seem to have a ${x}_check() function. Disabling it."
+ continue
+ fi
+
+ local create=`cat "$chartsd/$x.chart.sh" | sed "s/^ \+//g" | grep "^${x}_create()"`
+ if [ -z "$create" ]
+ then
+ echo >&2 "charts.d: chart '$x' does not seem to have a ${x}_create() function. Disabling it."
+ continue
+ fi
+
+ local update=`cat "$chartsd/$x.chart.sh" | sed "s/^ \+//g" | grep "^${x}_update()"`
+ if [ -z "$update" ]
+ then
+ echo >&2 "charts.d: chart '$x' does not seem to have a ${x}_update() function. Disabling it."
+ continue
+ fi
+
+ # check its config
+ if [ -f "$confd/$x.conf" ]
+ then
+ if [ ! -z "`cat "$confd/$x.conf" | sed "s/^ \+//g" | grep -v "^$" | grep -v "^#" | grep -v "^${x}_"`" ]
+ then
+ echo >&2 "charts.d: chart's $x config $confd/$x.conf should only have lines starting with ${x}_ . Disabling it."
+ continue
+ fi
+ fi
+
+ "$pluginsd/charts.d.dryrun-helper.sh" "$x" "$chartsd/$x.chart.sh" "$confd/$x.conf" >/dev/null
+ if [ $? -ne 0 ]
+ then
+ echo >&2 "charts.d: chart's $x did not pass the dry run check. This means it uses global variables not starting with $x. Disabling it."
+ continue
+ fi
+
+ local charts2="$charts2 $x"
+ done
+
+ echo $charts2
+}
+
+
+active_charts=
+for x in `all_enabled_charts`
+do
+ . "$chartsd/$x.chart.sh"
+
+ if [ -f "$confd/$x.conf" ]
+ then
+ . "$confd/$x.conf"
+ fi
+
+ ${x}_check
+ if [ $? -eq 0 ]
+ then
+ active_charts="$active_charts $x"
+ else
+ echo >&2 "charts.d: chart '$x' check() function reports failure."
+ fi
+done
+
+if [ $check -eq 1 ]
+then
+ echo "CHECK RESULT"
+ echo "Will run the charts: $active_charts"
+ exit 0
+fi
+
+run_charts=
+for x in $active_charts
+do
+ ${x}_create
+ if [ $? -eq 0 ]
+ then
+ run_charts="$run_charts $x"
+ else
+ echo >&2 "charts.d: chart '$x' create() function reports failure."
+ fi
+done
+
+# work forever
+while [ 1 ]
+do
+ now_charts=$run_charts
+ run_charts=
+
+ for x in $now_charts
+ do
+ ${x}_update
+ if [ $? -eq 0 ]
+ then
+ run_charts="$run_charts $x"
+ else
+ echo >&2 "charts.d: chart '$x' update() function reports failure. Disabling it."
+ fi
+ done
+
+ # wait the time you are required to
+ loopsleepms $update_every
+done