Module: check_mk
Branch: master
Commit: e2152aefd782e53bd17f08e35c107ec121584e0e
URL:
http://git.mathias-kettner.de/git/?p=check_mk.git;a=commit;h=e2152aefd782e5…
Author: Lars Michelsen <lm(a)mathias-kettner.de>
Date: Wed Nov 25 13:59:37 2015 +0100
Initial steps for Real-Time Checks
---
agents/check_mk_agent.linux | 70 +++++++++++++++++++++++++++++++++++++------
checks/cpu | 12 ++++----
checks/mem | 4 +++
modules/automation.py | 22 ++++++++++++++
modules/check_mk_base.py | 2 ++
5 files changed, 96 insertions(+), 14 deletions(-)
diff --git a/agents/check_mk_agent.linux b/agents/check_mk_agent.linux
index f0f9f15..dfd39fb 100755
--- a/agents/check_mk_agent.linux
+++ b/agents/check_mk_agent.linux
@@ -75,6 +75,27 @@ if type timeout >/dev/null 2>&1 ; then
export -f waitmax
fi
+#
+# CHECK SECTIONS
+#
+
+function section_mem()
+{
+ echo '<<<mem>>>'
+ egrep -v '^Swap:|^Mem:|total:' < /proc/meminfo
+}
+
+function section_cpu()
+{
+ echo '<<<cpu>>>'
+ if [ $(uname -m) = "armv7l" ]; then
+ CPU_REGEX='^processor'
+ else
+ CPU_REGEX='^CPU|^processor'
+ fi
+ echo "$(cat /proc/loadavg) $(grep -E $CPU_REGEX < /proc/cpuinfo | wc
-l)"
+}
+
# Runs a command asynchronous by use of a cache file. Usage:
# run_cached [-s] NAME MAXAGE
@@ -125,6 +146,37 @@ function run_cached () {
# Make run_cached available for subshells (plugins, local checks, etc.)
export -f run_cached
+# Implements Real-Time Check feature of the Check_MK agent which can send
+# some section data in 1 second resolution. Useful for fast notifications and
+# detailed graphing (if you configure your RRDs to this resolution).
+function run_real_time_checks()
+{
+ PIDFILE=$MK_VARDIR/real_time_checks.pid
+ echo $$ > $PIDFILE
+
+ . $MK_CONFDIR/real_time_checks.cfg
+
+ while true; do
+ # terminate when pidfile is gone or other Real-Time Check process started or
configured timeout
+ if [ ! -e $PIDFILE ] || [ $(<$PIDFILE) -ne $$ ] || [ $RTC_TIMEOUT -eq 0 ];
then
+ exit 1
+ fi
+
+ for SECTION in $RTC_SECTIONS; do
+ # Be aware of maximum packet size. Maybe we need to check the size of the
section
+ # output and do some kind of nicer error handling
+ #
+ # Example for encryption:
+ # export RTC_SECRET=xxx ; echo xxx | openssl enc -aes-256-cbc -pass
env:RTC_SECRET -nosalt > x
+ # export RTC_SECRET=xxx ; cat x | openssl enc -aes-256-cbc -d -pass
env:RTC_SECRET -nosalt
+ section_$SECTION >/dev/udp/$REMOTE/$RTC_PORT
+ done
+
+ sleep 1
+ RTC_TIMEOUT=$((RTC_TIMEOUT-1))
+ done
+}
+
echo '<<<check_mk>>>'
echo Version: 1.2.7i4
echo AgentOS: linux
@@ -217,17 +269,10 @@ echo '<<<ps>>>'
ps ax -o user:32,vsz,rss,cputime,etime,pid,command --columns 10000 | sed -e 1d -e 's/
*\([^ ]*\) *\([^ ]*\) *\([^ ]*\) *\([^ ]*\) *\([^ ]*\) *\([^ ]*\) */(\1,\2,\3,\4\/\5,\6)
/'
# Memory usage
-echo '<<<mem>>>'
-egrep -v '^Swap:|^Mem:|total:' < /proc/meminfo
+section_mem
# Load and number of processes
-echo '<<<cpu>>>'
-if [ $(uname -m) = "armv7l" ]; then
- CPU_REGEX='^processor'
-else
- CPU_REGEX='^CPU|^processor'
-fi
-echo "$(cat /proc/loadavg) $(grep -E $CPU_REGEX < /proc/cpuinfo | wc -l)"
+section_cpu
# Uptime
echo '<<<uptime>>>'
@@ -658,6 +703,13 @@ if type trd >/dev/null; then
trd -s
fi
+# Start new liveupdate process in background on each agent execution. Starting
+# a new live update process will terminate the old one automatically after
+# max. 1 sec.
+if [ -e $MK_CONFDIR/real_time_checks.cfg -a -n $REMOTE ]; then
+ run_real_time_checks &
+fi
+
# MK's Remote Plugin Executor
if [ -e "$MK_CONFDIR/mrpe.cfg" ]
then
diff --git a/checks/cpu b/checks/cpu
index 8a822d4..0d67753 100644
--- a/checks/cpu
+++ b/checks/cpu
@@ -62,6 +62,7 @@ check_info["cpu.loads"] = {
"has_perfdata" : True,
"group" : "cpu_load",
"includes" : ["cpu_load.include"],
+ "handle_real_time_checks" : True,
}
@@ -97,10 +98,11 @@ def check_cpu_threads(item, params, info):
check_info["cpu.threads"] = {
- "check_function" : check_cpu_threads,
- "inventory_function" : inventory_cpu_threads,
- "service_description" : "Number of threads",
- "has_perfdata" : True,
- "group" : "threads",
+ "check_function" : check_cpu_threads,
+ "inventory_function" : inventory_cpu_threads,
+ "service_description" : "Number of threads",
+ "has_perfdata" : True,
+ "group" : "threads",
+ "handle_real_time_checks" : True,
}
diff --git a/checks/mem b/checks/mem
index 6df525f..cb35047 100644
--- a/checks/mem
+++ b/checks/mem
@@ -365,6 +365,7 @@ check_info["mem.linux"] = {
'default_levels_variable': 'mem_linux_default_levels',
'has_perfdata': True,
'group': 'memory_linux',
+ "handle_real_time_checks" : True,
}
#.
@@ -406,6 +407,7 @@ check_info['mem.used'] = {
"group" : "memory",
"default_levels_variable" : "memory_default_levels",
"includes" : [ "mem.include" ],
+ "handle_real_time_checks" : True,
}
#.
@@ -515,6 +517,7 @@ check_info["mem.win"] = {
'has_perfdata': True,
'group': 'memory_pagefile_win',
'default_levels_variable': 'memory_win_default_levels',
+ "handle_real_time_checks" : True,
}
#.
@@ -592,4 +595,5 @@ check_info["mem.vmalloc"] = {
'check_function': check_mem_vmalloc,
'service_description': 'Vmalloc address space',
'has_perfdata': True,
+ "handle_real_time_checks" : True,
}
diff --git a/modules/automation.py b/modules/automation.py
index d43c575..c335d6b 100644
--- a/modules/automation.py
+++ b/modules/automation.py
@@ -38,6 +38,8 @@ def do_automation(cmd, args):
result = automation_get_configuration()
elif cmd == "get-check-information":
result = automation_get_check_information()
+ elif cmd == "get-real-time-checks":
+ result = automation_get_real_time_checks()
elif cmd == "get-check-manpage":
result = automation_get_check_manpage(args)
elif cmd == "get-check-catalog":
@@ -543,6 +545,26 @@ def automation_get_check_information():
return checks
+def automation_get_real_time_checks():
+ manuals = all_manuals()
+
+ checks = []
+ for check_type, check in check_info.items():
+ if check["handle_real_time_checks"]:
+ title = check_type
+ try:
+ manfile = manuals.get(check_type)
+ if manfile:
+ title = file(manfile).readline().strip().split(":",
1)[1].strip()
+ except Exception, e:
+ if opt_debug:
+ raise
+
+ checks.append((check_type, "%s - %s" % (check_type, title)))
+
+ return checks
+
+
def automation_get_check_manpage(args):
if len(args) != 1:
raise MKAutomationError("Need exactly one argument.")
diff --git a/modules/check_mk_base.py b/modules/check_mk_base.py
index 0fb0f06..41ac1ed 100644
--- a/modules/check_mk_base.py
+++ b/modules/check_mk_base.py
@@ -1642,6 +1642,7 @@ def convert_check_info():
snmp_scan_functions.get(check_type,
snmp_scan_functions.get(basename)),
"handle_empty_info" : False,
+ "handle_real_time_checks" : False,
"default_levels_variable" :
check_default_levels.get(check_type),
"node_info" : False,
"parse_function" : None,
@@ -1656,6 +1657,7 @@ def convert_check_info():
info.setdefault("snmp_info", None)
info.setdefault("snmp_scan_function", None)
info.setdefault("handle_empty_info", False)
+ info.setdefault("handle_real_time_checks", False)
info.setdefault("default_levels_variable", None)
info.setdefault("node_info", False)
info.setdefault("extra_sections", [])