File: check_host_regex.php

package info (click to toggle)
ganglia-web 3.7.6%2Bdebian-1.1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 4,368 kB
  • sloc: javascript: 27,575; php: 17,272; sh: 346; makefile: 82; xml: 42
file content (161 lines) | stat: -rw-r--r-- 6,436 bytes parent folder | download | duplicates (4)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
<?php

##########################################################################################
# Author; Vladimir Vuksan
# This is a Ganglia Nagios plugins that alerts based on values extracted from Ganglia
# It is similar to check_metric however it allows you to check multiple values and
# generate a single result. For example if you have multiple disks on the system
# you want a single check that will alert whenever 
#
# You need to supply following GET values
#
#  hreg = "Hostname Regex"
#  checks = is a list of checks separated  with a colon. Check is defined by
#  comma delimiting following
#  metric_name e.g. load_one, bytes_out
#  operator for critical condition e.g. less, more, equal, notequal,totalmore,totalless
#  critical_value e.g. value for critical
#
#  Example would be
#
#  ?hreg=apache\tomcat&checks=disk_rootfs,totalmore,10:disk_tmp,more,20
#
##########################################################################################
$conf['gweb_root'] = dirname(dirname(__FILE__));

include_once $conf['gweb_root'] . "/eval_conf.php";
include_once $conf['gweb_root'] . "/functions.php";

# To turn on debug set to 1
$debug = $_GET['debug'];

if ( isset($_GET['hreg']) && isset($_GET['checks']) ) {
   $host_reg = sanitize($_GET['hreg']);
   # Checks are : delimited
   $ignore_unknowns = isset($_GET['ignore_unknowns']) && $_GET['ignore_unknowns'] == 1 ? 1 : 0;
   $checks = explode(":", sanitize($_GET['checks']));
} else {
   die("You need to supply hreg (host regex) and list of checks of format metrics,operator,critical value. Multiple checks can be supplied separated using a colon");
}
global $metrics;

if($conf['nagios_cache_enabled'] && file_exists($conf['nagios_cache_file'])){
    	// check for the cached file
    	// snag it and return it if it is still fresh
	$time_diff = time() - filemtime($conf['nagios_cache_file']);
	$expires_in = $conf['nagios_cache_time'] - $time_diff;
     	if( $time_diff < $conf['nagios_cache_time']){
		if ( $debug == 1 ) {
		  error_log("DEBUG: Fetching data from cache. Expires in " . $expires_in . " seconds.\n");
		}
     		$metrics = unserialize(file_get_contents($conf['nagios_cache_file']));
     	}
}

if ( ! is_array( $metrics ) ) {

  if ( $debug == 1 ) {
		  error_log("DEBUG: Querying GMond for new data\n");
  }
  $context = "cluster";
  include_once $conf['gweb_root'] . "/functions.php";
  include_once $conf['gweb_root'] . "/ganglia.php";
  include_once $conf['gweb_root'] . "/get_ganglia.php";
  # Massage the metrics to minimize the cache file by caching only attributes
  # we care about
  foreach ( $metrics as $mhost => $host_metrics ) {
    foreach ( $host_metrics as $name => $attributes ) {
    	$new_metrics[$mhost][$name]['VAL'] = $metrics[$mhost][$name]['VAL'];
	if ( isset($metrics[$mhost][$name]['UNITS']) ) 
    	$new_metrics[$mhost][$name]['UNITS'] = $metrics[$mhost][$name]['UNITS'];
    }
  }
  file_put_contents($conf['nagios_cache_file'], serialize($new_metrics));
  unset($metrics);
  $metrics = $new_metrics;
  unset($new_metrics);

}

# Get a list of all hosts
$ganglia_hosts_array = array_keys($metrics);

$results_ok = array();
$results_notok = array();
$metric_total_value = array();

# Loop through all hosts looking for matches
foreach ( $ganglia_hosts_array as $index => $hostname ) {

   # Find matching hosts and make sure they are alive
   if ( preg_match("/" . $host_reg  .  "/", $hostname) && ( time() - $metrics[$hostname]['last_reported_timestamp']['VAL']) < 60) {

      # Loop through all the checks
      foreach ( $checks as $index => $check ) {
   
	 # Separate check into it's pieces
	 $pieces = explode(",", $check);
	 $metric_name = $pieces[0];
	 $operator = $pieces[1];
	 $critical_value = $pieces[2];
	 unset($pieces);
	 
	 # Check for the existence of a metric
	 if ( isset($metrics[$hostname][$metric_name]['VAL'])  ) {
	   $metric_value = $metrics[$hostname][$metric_name]['VAL'];
	 } else {
	   if ( !$ignore_unknowns ) {
	    $results_notok[] =  "UNKNOWN " . $hostname . " " . $metric_name . " not found";
	   }
	   continue;
	 }
	 
	 $ganglia_units = $metrics[$hostname][$metric_name]['UNITS'];

     if ( $operator == "totalmore" || $operator == "totalless") {
         if ( isset($metric_total_value[$metric_name]) ){
             $metric_total_value[$metric_name]['VAL'] += $metric_value;
         }else{
             $metric_total_value[$metric_name]['VAL'] = $metric_value;
             $metric_total_value[$metric_name]['UNITS'] = $ganglia_units;
             $metric_total_value[$metric_name]['CRIT'] = $critical_value;
             $metric_total_value[$metric_name]['OPER'] = $operator;
         }
     }else{
	 
         if ( ($operator == "less" && $metric_value > $critical_value) || ( $operator == "more" && $metric_value < $critical_value ) || ( $operator == "equal" && trim($metric_value) != trim($critical_value) ) || ( $operator == "notequal" && trim($metric_value) == trim($critical_value) ) ) {
            $results_ok[] =  "OK " . $hostname . " " . $metric_name . " = " . $metric_value . " " . $ganglia_units;
         } else {
            $results_notok[] =  "CRITICAL " . $hostname . " " . $metric_name . " = ". $metric_value . " " . $ganglia_units;
         }
     }
     
      } // end of foreach ( $checks as $index => $check
     
   } //  end of if ( preg_match("/" . $host_reg 

} // end of foreach ( $ganglia_hosts_array as $index => $hostname ) {

# Check for total metric value
if( !empty($metric_total_value) ) {
    foreach ( $metric_total_value as $metric_name => $metric_total ) {
        if ( ( $metric_total['OPER'] == 'totalmore' && $metric_total['VAL'] < $metric_total['CRIT'] )
             || ( $metric_total['OPER'] == 'totalless' && $metric_total['VAL'] > $metric_total['CRIT'] ) ){
                 $results_ok[] = 'OK "' . $host_reg . '" Total of ' . $metric_name . ' = ' . $metric_total['VAL'] . ' ' . $metric_total['UNITS'];
             } else {
                 $results_notok[] = 'CRITICAL ' . $host_reg . ' Total of ' . $metric_name . ' = ' . $metric_total['VAL'] . ' ' . $metric_total['UNITS'];
             }
    } 
}

unset($metric_total_value);

if ( count( $results_notok ) == 0 ) {
	print "OK!# Services OK = " . count($results_ok) . " ; " . join(",", $results_ok);
	exit(0);
} else {
	print "CRITICAL!# Services OK = " . count($results_ok) . ", CRIT/UNK = " . count($results_notok) . " ; " . join(", ", $results_notok);
	exit(2);
}

?>