diff options
author | Costa Tsaousis (ktsaou) <costa@tsaousis.gr> | 2014-05-03 20:08:06 +0300 |
---|---|---|
committer | Costa Tsaousis (ktsaou) <costa@tsaousis.gr> | 2014-05-03 20:08:06 +0300 |
commit | 648e4ae9540b2b6bed15839b319d456e8ba01674 (patch) | |
tree | f75dda86778c307878fda330fb3a13220e268f96 /plugins.d | |
parent | ec97cc2a4bfaa7c775a3b39cdada6e4124f1ba43 (diff) |
Now there are 2 kinds of plugins:
- plugins.d plugins that are expected to always be in memory and execute
continiously
- charts.d scripts that are sourced by the charts.d plugin
and are all executed together, lowering significantly the resources
they require (compared to plugins)
Diffstat (limited to 'plugins.d')
-rwxr-xr-x | plugins.d/charts.d.dryrun-helper.sh | 73 | ||||
-rwxr-xr-x | plugins.d/charts.d.plugin | 174 |
2 files changed, 247 insertions, 0 deletions
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 |