Stackpole, Chris wrote:

I have been wondering if it would be possible to use some kind of metric to pass information from the “nodes” back to the Ganglia frontend and have them displayed on a sub webpage.



I did not find anything in the archives so I figured I would ask for pointers before I began on my own. Does anyone have any ideas on how feasible this may be and where I might begin?

I would think this would be feasible. You can use gmetric to add your own "metrics". A metric can be a string.

For example we use Nagios for alerting and to avoid having to use Nagios' nsca daemon to pass information like diskfree I simply use Ganglia to get that info (since it already runs on the Nagios box). If you can get the ganglia python client running use that. Otherwise I wrote a command line PHP script that uses Ganglia's web frontend scripts to parse Ganglia's XML. Here is my code that simply

Hope this helps.

#!/usr/bin/php
<?php

######################################################################################
$GANGLIA_DIR='/srv/www/htdocs/ganglia';
######################################################################################

if ( $argc != 2 ) {
echo "Not enough arguments. Please supply Fully Qualified name for the host
Usage:  $argv[0] <hostname>  ie.
       $argv[0] server.domain.net
Exiting ....\n";
  exit (1);
}

include_once $GANGLIA_DIR .  "/conf.php";
include_once $GANGLIA_DIR . "/get_context.php";
$context = "cluster";
include_once $GANGLIA_DIR . "/functions.php";
include_once $GANGLIA_DIR . "/ganglia.php";
include_once $GANGLIA_DIR . "/get_ganglia.php";

# Make sure it is FQDN
if ( strpos($argv[1], ".") != FALSE )
       $hostname = substr($argv[1], 0, strpos($argv[1], "."));
else
       $hostname = $argv[1];

######################################################################################
# Get list of hosts in Ganglia
######################################################################################
$ganglia_hosts = array_keys($metrics);

######################################################################################
# Because we have multiple interfaces on machines we need to find the exact name
# of the machine that the Ganglia is using otherwise this script blows up
######################################################################################
for ( $i = 0 ; $i < sizeof($ganglia_hosts) ; $i++ ) {
       if ( eregi ( $hostname, $ganglia_hosts[$i] ) ) {
               $fqdn = $ganglia_hosts[$i];
               break;
       }
}

######################################################################################
# $metrics is an array of [Metrics][Hostname][NAME|VAL|TYPE|UNITS|SOURCE].
# Make sure that hostname actually has metrics available. If not report UNKNOWN state
######################################################################################
if ( ! is_array($metrics[$fqdn])) {
echo("DISKFREE UNKNOWN - Hostname info not available. Likely invalid hostname");
  exit(3);
}

# Make sure that host is providing disk_free and disk_total to the cluster
if ( isset($metrics[$fqdn]['disk_free']['VAL']) && isset($metrics[$fqdn]['disk_total']['VAL']) ) { $disk_free_percent = $metrics[$fqdn]['disk_free']['VAL']/$metrics[$fqdn]['disk_total']['VAL'];
} else {
echo("DISKFREE UNKNOWN - Disk free or disk total not available for this host.");
  exit(3);
}

######################################################################################
# If disk available is less then 8% mark it critical
######################################################################################
if ( $disk_free_percent > 0.08 ) {
echo(sprintf("DISKFREE OK - %01.2f%% free\n", $disk_free_percent * 100));
       exit (0);
} else {
echo(sprintf("DISKFREE CRITICAL - %01.2f%% free\n", $disk_free_percent * 100));
       exit (2);
}
?>


Reply via email to