I use the following code but because of the director I need to use a dummy check plugin to reflect the calculated data back into Icinga2:
Plugin: monitoring-plugins/check-plugins/dummy at main · Linuxfabrik/monitoring-plugins · GitHub
Value Type: Icinga DSL
– message:
function get_perfdata(service){
var perf_value = service.last_check_result.performance_data[0].split("=")[1]
var perf_value = perf_value.split("c;")[0]
return perf_value
}
var output = ""
var hosts_to_compare = macro("$116_comparison_hosts$")
var service_pattern = macro("$116_comparison_service_pattern$")
var tolerance = macro("$116_comparison_tolerance$")
var values = []
var servcies = []
for (host in hosts_to_compare) {
var service_names = get_services(host).map(s => s.name)
for (service_name in service_names) {
if (match(service_pattern, service_name)) {
if (match("Compare Services*", service_name)){
continue
}
servcies.add(host + "!" + service_name)
service = get_service(host, service_name)
if (len(service.last_check_result.performance_data) < 1){
return "[UNKNOWN] '" + host + "!" + service_name + "' has no performance data value in last_check_result!"
}
values.add(get_perfdata(service))
}
}
}
if (len(values) < 2) {
return "[UNKNOWN] less then 2 values collected!"
}
output = "[OK] all values in allowed tolerance |"
for (value in values) {
if (number(value) + number(tolerance) < number(values[0]) || number(value) - number(tolerance) > number(values[0])) {
output = "[CRITICAL] value " + value + " not in allowed tolerance " + tolerance + " from first value " + values[0] + " |"
}
}
for (service in servcies) {
var host = service.split("!")[0]
var service_name = service.split("!")[1]
var service = get_service(host, service_name)
var value = get_perfdata(service)
var value_min = number(values[0]) - number(tolerance)
var value_max = number(values[0]) + number(tolerance)
output += " '" + host + "!" + service_name + "'=" + value + ";;" + value_min + ":" + value_max + ";"
}
return output
Value Type: Icinga DSL
– state:
function get_perfdata(service){
var perf_value = service.last_check_result.performance_data[0].split("=")[1]
var perf_value = perf_value.split("c;")[0]
return perf_value
}
var hosts_to_compare = macro("$116_comparison_hosts$")
var service_pattern = macro("$116_comparison_service_pattern$")
var tolerance = macro("$116_comparison_tolerance$")
var values = []
for (host in hosts_to_compare) {
var service_names = get_services(host).map(s => s.name)
for (service_name in service_names) {
if (match(service_pattern, service_name)) {
if (match("Compare Services*", service_name)){
continue
}
var service = get_service(host,service_name)
if (len(service.last_check_result.performance_data) < 1){
return "unk"
}
values.add(get_perfdata(service))
}
}
}
if (len(values) < 2) {
return "unk"
}
for (value in values) {
if (number(value) + number(tolerance) < number(values[0]) || number(value) - number(tolerance) > number(values[0])) {
return "crit" //at least one service is not OK
}
}
return "ok" //all is well