Changeset d710bcb9b19ab354fa6cbab08cbe91dcee175e86

Show
Ignore:
Timestamp:
05/20/10 02:21:17 (8 years ago)
Author:
Mark Harrison <mark@omniti.com>
git-committer:
Mark Harrison <mark@omniti.com> 1274322077 +0000
git-parent:

[24af467c88a036c69cdf6604e3b9984a139eff07]

git-author:
Mark Harrison <mark@omniti.com> 1274322077 +0000
Message:

Support wildcard modules (fixes #7)

This is done using a wildcard_handler method in addition to the normal handler
method. The wildcard_handler method is called if * is in the config file as
the check name, and the handler module is called for normal checks. By
default, both methods will die with "Not implemented", meaning modules can
implement one or both of the methods, depending on whether they support normal
checks, wildcard checks, or some combination of both.

git-svn-id: https://labs.omniti.com/resmon/branches/resmon2@386 8c0face9-b7db-6ec6-c4b3-d5f7145c7d55

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • lib/Resmon/Module.pm

    rf0df47b rd710bcb  
    1313 
    1414sub handler { 
    15     return { 
    16         'error_message' => ["Monitor not implemented", "s"] 
    17     } 
     15    die "Monitor not implemented.\n"; 
     16
     17 
     18sub wildcard_handler { 
     19    die "Monitor not implemented.\n"; 
    1820} 
    1921 
  • resmon

    r3c05c50 rd710bcb  
    9191    while(my($module_name, $mod_configs) = each %{$config->{Module}}) { 
    9292        while(my($check_name, $monitor_obj) = each %$mod_configs) { 
    93             my $check_metric = {}; 
     93            my $check_metrics = {}; 
    9494            my $starttime = [gettimeofday]; 
    9595            # Get old status if it hasn't expired 
    96             $check_metric = $monitor_obj->get_cached_metrics(); 
     96            $check_metrics = $monitor_obj->get_cached_metrics(); 
    9797            # Otherwise, run the check 
    98             if (!$check_metric) { 
     98            if (!$check_metrics) { 
    9999                my $timeout = $monitor_obj->{'check_timeout'} || 
    100100                    $config->{'timeout'}; 
    101101                alarm($timeout); 
     102                my $handler; 
    102103                eval { 
    103104                    local $SIG{ALRM} = sub { die "alarm\n" }; 
    104                     $check_metric = $monitor_obj->handler(); 
     105                    if ($check_name eq "*") { 
     106                        $check_metrics = $monitor_obj->wildcard_handler; 
     107                    } else { 
     108                        $check_metrics = { 
     109                            $check_name => $monitor_obj->handler 
     110                        }; 
     111                    } 
    105112                }; 
    106113                alarm 0; 
    107114                # Store the last metrics for use by fresh_status_msg later 
    108                 $monitor_obj->cache_metrics($check_metric); 
     115                $monitor_obj->cache_metrics($check_metrics); 
    109116            }; 
    110117            my $checkproblem = $@; 
    111             my $results = { 
    112                 last_runtime_seconds => sprintf("%.6f", 
    113                     tv_interval($starttime)), 
    114                 metric => $check_metric 
    115             }; 
    116118            if($checkproblem) { 
    117119                chomp $checkproblem; 
    118                 $results->{metric} = { "error" => ["$checkproblem", "s"]}; 
    119120                if ($checkproblem eq "alarm") { 
    120                     $results->{metric} = { "error" => ["Check timeout", "s"]}
     121                    $checkproblem = "Check timeout"
    121122                } 
     123                $check_metrics = { 
     124                    $check_name => {"error" => ["$checkproblem", "s"]} 
     125                }; 
    122126                Resmon::ExtComm::clean_up; 
    123127            } 
    124             $status->store($module_name,$monitor_obj->{'check_name'}, $results); 
    125             $status->write($module_name,$monitor_obj->{'check_name'}, 
    126                 $results->{'metric'}, $debug); 
     128            foreach my $name (keys %$check_metrics) { 
     129                my $results = { 
     130                    last_runtime_seconds => sprintf("%.6f", 
     131                        tv_interval($starttime)), 
     132                    metric => $check_metrics->{$name} 
     133                }; 
     134                $status->store($module_name,$name, $results); 
     135                $status->write($module_name,$name, $results->{'metric'}, 
     136                    $debug); 
     137            } 
    127138        } 
    128139    }