diff options
-rwxr-xr-x | charts.d/example.chart.sh (renamed from charts.d/example-chart.sh) | 0 | ||||
-rwxr-xr-x | charts.d/load_average.chart.sh | 47 | ||||
-rwxr-xr-x | charts.d/squid.chart.sh (renamed from charts.d/squid-chart.sh) | 0 | ||||
-rw-r--r-- | conf.d/charts.d.conf | 4 | ||||
-rw-r--r-- | conf.d/squid.conf | 1 | ||||
-rwxr-xr-x | plugins.d/charts.d.dryrun-helper.sh | 73 | ||||
-rwxr-xr-x | plugins.d/charts.d.plugin | 174 |
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 |