]> arthur.barton.de Git - netdata.git/commitdiff
Now there are 2 kinds of plugins:
authorCosta Tsaousis (ktsaou) <costa@tsaousis.gr>
Sat, 3 May 2014 17:08:06 +0000 (20:08 +0300)
committerCosta Tsaousis (ktsaou) <costa@tsaousis.gr>
Sat, 3 May 2014 17:08:06 +0000 (20:08 +0300)
 - 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)

charts.d/example-chart.sh [deleted file]
charts.d/example.chart.sh [new file with mode: 0755]
charts.d/load_average.chart.sh [new file with mode: 0755]
charts.d/squid-chart.sh [deleted file]
charts.d/squid.chart.sh [new file with mode: 0755]
conf.d/charts.d.conf [new file with mode: 0644]
conf.d/squid.conf [new file with mode: 0644]
plugins.d/charts.d.dryrun-helper.sh [new file with mode: 0755]
plugins.d/charts.d.plugin [new file with mode: 0755]

diff --git a/charts.d/example-chart.sh b/charts.d/example-chart.sh
deleted file mode 100755 (executable)
index 60607fd..0000000
+++ /dev/null
@@ -1,74 +0,0 @@
-#!/bin/sh
-
-# report our PID back to netdata
-# this is required for netdata to kill this process when it exits
-echo "MYPID $$"
-
-# 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
-
-
-# create the 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
-
-CHART example.random '' "Random Numbers Stacked Chart" "% of random numbers" random random stacked 5000 $update_every
-DIMENSION random1 '' percentage-of-absolute-row 1 1
-DIMENSION random2 '' percentage-of-absolute-row 1 1
-DIMENSION random3 '' percentage-of-absolute-row 1 1
-EOF
-
-# You can create more charts if you like.
-# Just add more chart definitions.
-
-# work forever
-while [ 1 ]
-do
-       # do all the work to collect / calculate the values
-       # for each dimension
-
-       # 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`
-
-       value1=$RANDOM
-       value2=$RANDOM
-       value3=$RANDOM
-
-       # write the result of the work.
-       cat <<VALUESEOF
-BEGIN example.load
-SET load1 = $load1
-SET load5 = $load5
-SET load15 = $load15
-END
-
-BEGIN example.random
-SET random1 = $value1
-SET random2 = $value2
-SET random3 = $value3
-END
-VALUESEOF
-
-       # if you have more charts, add BEGIN->END statements here
-
-       # wait the time you are required to
-       loopsleepms $update_every
-done
diff --git a/charts.d/example.chart.sh b/charts.d/example.chart.sh
new file mode 100755 (executable)
index 0000000..60607fd
--- /dev/null
@@ -0,0 +1,74 @@
+#!/bin/sh
+
+# report our PID back to netdata
+# this is required for netdata to kill this process when it exits
+echo "MYPID $$"
+
+# 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
+
+
+# create the 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
+
+CHART example.random '' "Random Numbers Stacked Chart" "% of random numbers" random random stacked 5000 $update_every
+DIMENSION random1 '' percentage-of-absolute-row 1 1
+DIMENSION random2 '' percentage-of-absolute-row 1 1
+DIMENSION random3 '' percentage-of-absolute-row 1 1
+EOF
+
+# You can create more charts if you like.
+# Just add more chart definitions.
+
+# work forever
+while [ 1 ]
+do
+       # do all the work to collect / calculate the values
+       # for each dimension
+
+       # 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`
+
+       value1=$RANDOM
+       value2=$RANDOM
+       value3=$RANDOM
+
+       # write the result of the work.
+       cat <<VALUESEOF
+BEGIN example.load
+SET load1 = $load1
+SET load5 = $load5
+SET load15 = $load15
+END
+
+BEGIN example.random
+SET random1 = $value1
+SET random2 = $value2
+SET random3 = $value3
+END
+VALUESEOF
+
+       # if you have more charts, add BEGIN->END statements here
+
+       # wait the time you are required to
+       loopsleepms $update_every
+done
diff --git a/charts.d/load_average.chart.sh b/charts.d/load_average.chart.sh
new file mode 100755 (executable)
index 0000000..e2c7249
--- /dev/null
@@ -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
deleted file mode 100755 (executable)
index 54a545a..0000000
+++ /dev/null
@@ -1,97 +0,0 @@
-#!/bin/sh
-
-url="http://127.0.0.1:8080/squid-internal-mgr/counters"
-
-# report our PID back to netdata
-# this is required for netdata to kill this process when it exits
-echo "MYPID $$"
-
-# 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
-
-# we accept a url as the second argument
-if [ ! -z "$2" ]
-then
-       url="$2"
-fi
-
-# check once if the url works
-wget 2>/dev/null -O /dev/null "$url"
-if [ ! $? -eq 0 ]
-then
-       # it does not work - disable the plugin
-       echo "DISABLE"
-       exit 1
-fi
-
-# create the charts
-cat <<EOF
-CHART squid.client_bandwidth '' "Squid Client Bandwidth" "kilobits/s" squid squid area 1 $update_every
-DIMENSION client_http_kbytes_in in incremental 8 1
-DIMENSION client_http_kbytes_out out incremental -8 1
-DIMENSION client_http_hit_kbytes_out hits incremental -8 1
-
-CHART squid.client_requests '' "Squid Client Requests" "requests/s" squid squid line 3 $update_every
-DIMENSION client_http_requests requests incremental 1 1
-DIMENSION client_http_hits hits incremental 1 1
-DIMENSION client_http_errors errors incremental -1 1
-
-CHART squid.server_bandwidth '' "Squid Server Bandwidth" "kilobits/s" squid squid area 2 $update_every
-DIMENSION server_all_kbytes_in in incremental 8 1
-DIMENSION server_all_kbytes_out out incremental -8 1
-
-CHART squid.server_requests '' "Squid Server Requests" "requests/s" squid squid line 4 $update_every
-DIMENSION server_all_requests requests incremental 1 1
-DIMENSION server_all_errors errors incremental -1 1
-EOF
-
-# You can create more charts if you like.
-# Just add more chart definitions.
-
-# work forever
-while [ 1 ]
-do
-       # do all the work to collect / calculate the values
-       # for each dimension
-
-       # get the values from squid
-       eval `wget 2>/dev/null -O - "$url" | sed -e "s/\./_/g" -e "s/ = /=/g" | egrep "(^client_http_|^server_all_)"`
-
-       # write the result of the work.
-       cat <<VALUESEOF
-BEGIN squid.client_bandwidth
-SET client_http_kbytes_in = $client_http_kbytes_in
-SET client_http_kbytes_out = $client_http_kbytes_out
-SET client_http_hit_kbytes_out = $client_http_hit_kbytes_out
-END
-
-BEGIN squid.client_requests
-SET client_http_requests = $client_http_requests
-SET client_http_hits = $client_http_hits
-SET client_http_errors = $client_http_errors
-END
-
-BEGIN squid.server_bandwidth
-SET server_all_kbytes_in = $server_all_kbytes_in
-SET server_all_kbytes_out = $server_all_kbytes_out
-END
-
-BEGIN squid.server_requests
-SET server_all_requests = $server_all_requests
-SET server_all_errors = $server_all_errors
-END
-VALUESEOF
-
-       # wait the time you are required to
-       loopsleepms $update_every
-done
diff --git a/charts.d/squid.chart.sh b/charts.d/squid.chart.sh
new file mode 100755 (executable)
index 0000000..54a545a
--- /dev/null
@@ -0,0 +1,97 @@
+#!/bin/sh
+
+url="http://127.0.0.1:8080/squid-internal-mgr/counters"
+
+# report our PID back to netdata
+# this is required for netdata to kill this process when it exits
+echo "MYPID $$"
+
+# 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
+
+# we accept a url as the second argument
+if [ ! -z "$2" ]
+then
+       url="$2"
+fi
+
+# check once if the url works
+wget 2>/dev/null -O /dev/null "$url"
+if [ ! $? -eq 0 ]
+then
+       # it does not work - disable the plugin
+       echo "DISABLE"
+       exit 1
+fi
+
+# create the charts
+cat <<EOF
+CHART squid.client_bandwidth '' "Squid Client Bandwidth" "kilobits/s" squid squid area 1 $update_every
+DIMENSION client_http_kbytes_in in incremental 8 1
+DIMENSION client_http_kbytes_out out incremental -8 1
+DIMENSION client_http_hit_kbytes_out hits incremental -8 1
+
+CHART squid.client_requests '' "Squid Client Requests" "requests/s" squid squid line 3 $update_every
+DIMENSION client_http_requests requests incremental 1 1
+DIMENSION client_http_hits hits incremental 1 1
+DIMENSION client_http_errors errors incremental -1 1
+
+CHART squid.server_bandwidth '' "Squid Server Bandwidth" "kilobits/s" squid squid area 2 $update_every
+DIMENSION server_all_kbytes_in in incremental 8 1
+DIMENSION server_all_kbytes_out out incremental -8 1
+
+CHART squid.server_requests '' "Squid Server Requests" "requests/s" squid squid line 4 $update_every
+DIMENSION server_all_requests requests incremental 1 1
+DIMENSION server_all_errors errors incremental -1 1
+EOF
+
+# You can create more charts if you like.
+# Just add more chart definitions.
+
+# work forever
+while [ 1 ]
+do
+       # do all the work to collect / calculate the values
+       # for each dimension
+
+       # get the values from squid
+       eval `wget 2>/dev/null -O - "$url" | sed -e "s/\./_/g" -e "s/ = /=/g" | egrep "(^client_http_|^server_all_)"`
+
+       # write the result of the work.
+       cat <<VALUESEOF
+BEGIN squid.client_bandwidth
+SET client_http_kbytes_in = $client_http_kbytes_in
+SET client_http_kbytes_out = $client_http_kbytes_out
+SET client_http_hit_kbytes_out = $client_http_hit_kbytes_out
+END
+
+BEGIN squid.client_requests
+SET client_http_requests = $client_http_requests
+SET client_http_hits = $client_http_hits
+SET client_http_errors = $client_http_errors
+END
+
+BEGIN squid.server_bandwidth
+SET server_all_kbytes_in = $server_all_kbytes_in
+SET server_all_kbytes_out = $server_all_kbytes_out
+END
+
+BEGIN squid.server_requests
+SET server_all_requests = $server_all_requests
+SET server_all_errors = $server_all_errors
+END
+VALUESEOF
+
+       # wait the time you are required to
+       loopsleepms $update_every
+done
diff --git a/conf.d/charts.d.conf b/conf.d/charts.d.conf
new file mode 100644 (file)
index 0000000..e05d2ab
--- /dev/null
@@ -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 (file)
index 0000000..dede4db
--- /dev/null
@@ -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 (executable)
index 0000000..3d0bcb3
--- /dev/null
@@ -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 (executable)
index 0000000..e10384c
--- /dev/null
@@ -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