[Nagiosplug-devel] Nagios::Plugin api

Gavin Carr gavin at openfusion.com.au
Wed Aug 30 02:40:26 CEST 2006

Ton asked me to kick off a discussion of the current Nagios::Plugin
api, so here it is.

Here's the current api:

  use Nagios::Plugin qw(%ERRORS);
  $p = Nagios::Plugin->new( shortname => "PAGESIZE" );

  $threshold = $p->set_thresholds( warning => "10:25", critical => "25:" );

  # ... collect current metric into $value
  if ($trouble_getting_metric) {
    $p->die( return_code => $ERRORS{UNKNOWN}, message => "Could not retrieve page");
    # Output: PAGESIZE UNKNOWN Could not retrieve page
    # Return code: 3

  $p->die( return_code => $threshold->get_status($value), message => "page size at http://... was ${value}kB" );
  # Output: PAGESIZE OK: page size at http://... was 36kB | size=36kB;10:25;25: time=...
  # Return code: 0

(I've omitted the perfdata bits, as I haven't get my head around that
 yet, and it seems largely orthogonal to the rest.)

So base functionality is:

  $p = Nagios::Plugin->new();
  $p->die( return_code => $ERRORS{UNKNOWN}, message => $msg ); 

Comments and questions:

- using %ERRORS like that seems a bit weird. Why don't we just export
  a set of constants ( OK, WARNING, CRITICAL, UNKNOWN ) and use them
  directly? That gives better compile time checking and seems cleaner:

  $p->die( return_code => UNKNOWN, message => $msg );

  We can keep %ERRORS for backwards compatibility, of course.

- what do people think about support a positional variant of die too,
  given that we only really have two arguments? e.g.

  $p->die( OK, $msg )
  $p->die( CRITICAL, $msg )
  $p->die( UNKNOWN, $msg )

- Also, $p->die( OK, $msg ) looks a bit weird too - should you die
  if everything is okay? I think we keep it for completeness, but 
  what about supporting something like:

  $p->exit( $msg )
  $p->exit( message => $msg )

  specifically for the OK case? (which exits rather than dies)

- can we make shortname default to something like:

  unless ($shortname) {
    $shortname = uc( $ENV{NAGIOS_PLUGIN} || basename($0) );
    $shortname =~ s/^CHECK_//;

  so that in lots of cases it becomes effectively optional?

- With thresholds, returning an object from set_thresholds seems 
  strange to me:

    $threshold = $p->set_thresholds( warning => "10:25", critical => "25:" );

  I think that if you're going to return an object, you should just
  use Nagios::Plugin::Threshold directly:

    $threshold = Nagios::Plugin::Threshold->new( warning => "10:25", critical => "25:" );

  Or if you want to use composition, you shouldn't return the object 
  at all - just

    $p->set_thresholds( warning => "10:25", critical => "25:" );

  or perhaps:

     $p = Nagios::Plugin->new( warning => "10:25", critical => "25:" );
  (In practice, I guess thresholds are most often going to come in as
   arguments anyway, so we would presumably most often want to get them
   via Nagios::Plugin::Getopt arguments somehow ...)

  If you're going with composition, then you'd call the threshold 
  get_status implicitly rather than explicitly e.g. instead of:

    $p->die( return_code => $threshold->get_status($value), message => $msg )

  perhaps something like:

    $p->exit_check_threshold(check => $value);

- Implementation detail: Nagios::Plugin does a 'use 5.008004' - is that 
  deliberate? If not, how backwards compatible do we want to be? The 
  code uses lots of 'our's and 'use warnings', both of which are 5.6-isms,
  I think. Do we want to be able to work with older perls? There are still
  lots of 5.005003 installs out there, for instance.



Gavin Carr
Open Fusion - Open Source Business Solutions [ Linux - Perl - Apache ]
- Fashion is a variable, but style is a constant - Programming Perl

More information about the Devel mailing list