DTA-CAB

 view release on metacpan or  search on metacpan

dta-cab-http-check.perl  view on Meta::CPAN



##-- setup user agent
my $ua = LWP::UserAgent->new(
			     ssl_opts => {SSL_verify_mode=>'SSL_VERIFY_NONE'}, ##-- avoid "certificate verify failed" errors
			    )
  or die("$prog: failed to create user agent for URL $url: $!");

$ua->timeout($timeout);
my $t0  = [gettimeofday];
my ($rsp);
if ($geturi->path =~ m{[^/]//}) {
  ##-- http-over-unix; adapated from CAB::Client::HTTP::urequest_unix()

  ##-- setup LWP::Protocol::http::SocketUnixAlt handlers
  require LWP::Protocol::http::SocketUnixAlt;
  my $http_impl = LWP::Protocol::implementor("http");
  LWP::Protocol::implementor('http' => 'LWP::Protocol::http::SocketUnixAlt');

  ##-- suppress irritating warnings from LWP::Protocol::http via LWP::Protocol::http::SocketUnixAlt
  my $sigwarn  = $SIG{__WARN__};
  local $SIG{__WARN__} = sub {
    return if ($_[0] =~ m{Use of uninitialized value \$hhost.*LWP/Protocol/http\.pm});
    $sigwarn ? $sigwarn->(@_) : warn(@_);
  };

  ##-- UNIX-sockets don't like 'timeout' parameter: use alarm()
  $SIG{ALRM} = sub {
    die("timeout exceeded");
  };
  alarm($timeout);

  ##-- guts
  eval {
    $rsp = $ua->get($geturl)
      or die("failed to retrieve http-over-UNIX URL $geturl");
  };

  ##-- check for timeouts
  my $err = $@ // '';
  alarm(0);
  if (!$rsp && $err =~ /\btimeout exceeded\b/) {
    $rsp = HTTP::Response->new(500, "UNIX socket timeout");
  }

  ##-- reset handlers
  LWP::Protocol::implementor('http' => $http_impl);
} else {
  $rsp = $ua->get($geturl)
    or die("failed to retrieve URL $geturl");
}

my $time  = sprintf("%.3f", tv_interval($t0));

##-- parse response & add perforamance data
$mp->add_perfdata(label=>'time', value=>$time, uom=>'s');
my $status = {};
my $rc  = OK;
my $msg = '';
if ($rsp->is_success) {
  my $data = $rsp->decoded_content;
  vmsg($vl_trace, "got response = ", $data);

  if ($qmode eq 'status') {
    ##-- status check
    eval { $status = from_json($data); };
    die("$prog: failed to parse status response: $@") if (!$status);

    ##-- get status perfdata
    my $memMB = sprintf("%.2f", ($status->{memSize}//0) / 1024);
    my $rssMB = sprintf("%.2f", ($status->{memRSS}//0) / 1024);
    $mp->add_perfdata(label=>'mem', value=>$memMB, uom=>'MB');
    $mp->add_perfdata(label=>'nreq', value=>($status->{nRequests}//0), uom=>'c');
    $mp->add_perfdata(label=>'nerr', value=>($status->{nErrors}//0), uom=>'c');
    {
      no warnings 'numeric';
      $mp->add_perfdata(label=>'ncached', value=>($status->{nCacheHits}+0), uom=>'c');
    };

    ##-- new perfdata for DTA::CAB v1.101 (2018-03-22 14:10:24+0100)
    $mp->add_perfdata(label=>'rss', value=>$rssMB, uom=>'MB');
    foreach (1,5,15) {
      $mp->add_perfdata(label=>"qtavg$_", value=>sprintf("%.4f",1000*($status->{"qtAvg$_"}//0)), uom=>'ms');
    }

    ##-- get return message
    my $st_ver = $status->{version}//'?';
    $st_ver   =~ s/\|.*$//;
    $msg = "$url - ${time}s ${memMB}MB $st_ver";
  }
  elsif ($qmode eq 'query') {
    ##-- query check
    $msg = "$url - ${time}s";
    if ($expect) {
      if ($data !~ /$expect/o) {
	$rc = CRITICAL;
	$msg = "$url - ERROR - pattern not found";
      }
    }
  }
  else {
    ##-- unknown query mode
    $msg = "$url - ${time}s";
  }
}
elsif ($time_crit<=0 && $rsp->message =~ /\b(?:timeout|resource temporarily unavailable)\b/i) {
  ##-- treat timeouts as warnings
  $rc = WARNING;
  $msg = "$url - TIMEOUT - ".$rsp->status_line." - ${time}s";
}
else {
  ##-- anything else is CRITICAL
  $rc = CRITICAL;
  $msg = "$url - ERROR - ".$rsp->status_line." - ${time}s";
}

##-- check threshholds
my $thresh_crit = $time_crit > 0 ? $time_crit : undef;
my $time_rc     = $mp->check_threshold(check=>$time, warning=>$time_warn, critical=>$thresh_crit);
$rc             = $time_rc if ($time_rc > $rc);



( run in 0.874 second using v1.01-cache-2.11-cpan-39bf76dae61 )