#!/usr/local/bin/perl
# -*- cperl -*-

=head1 NAME

php_fpm_process - Munin plugin to show number of number of use processes on php-fpm.


Inspirated by php5-fpm_status plugin by Daniel Caillibaud

=head1 APPLICABLE SYSTEMS

Any php-fpm host
You will need the perl fastcgi::client on your host

=head1 CONFIGURATION

You have to put this in your plugin.conf.d folder

# If your php process is listening on TCP
[php_fpm_process]
   env.serveraddr 127.0.0.1
   env.port 9000
   env.path /status

# If your php process is listening on Unix Socket
[php_fpm_process]
   env.sock /var/run/php5-fpm.sock
   env.path /status

=head1 MAGIC MARKERS

  #%# family=auto
  #%# capabilities=autoconf

=head1 VERSION

  v1.0

=head1 AUTHOR

Minitux

=head1 LICENSE

GNU General Public License, version 3

=cut

use File::Basename;
use FCGI::Client;

my $ish = 1;
my $header = "";
my $body = "";
my $IDLE = 0;
my $ACTIVE = 0;
my $TOTAL = 0;
my $SLOW_REQUESTS = 0;
my $PLUGIN_NAME = basename($0);

my $SERVERADDR = $ENV{'serveraddr'} || "127.0.0.1";
my $PORT = $ENV{'port'} || "9000";
my $PATH = $ENV{'path'} || "/status";
my $UNIX_SOCK = $ENV{'sock'};

my $sock;

if ($UNIX_SOCK) {
  use IO::Socket::UNIX;
  $sock = IO::Socket::UNIX->new(
    Peer =>  $UNIX_SOCK,
  );
  if (!$sock) {
    print "Server maybe down, unabled to connect to $UNIX_SOCK";
    exit 2;
  }
} else {
  use IO::Socket::INET;
  $sock = IO::Socket::INET->new(
    PeerAddr =>  $SERVERADDR,
    PeerPort =>  $PORT,
  );
  if (!$sock) {
    print "Server maybe down, unabled to connect to $SERVERADDR:$PORT";
    exit 2;
  }
}

my $client = FCGI::Client::Connection->new( sock => $sock );

my ( $stdout, $stderr, $appstatus )  = $client->request(
    +{
        REQUEST_METHOD => 'GET',
        SCRIPT_FILENAME => '',
        QUERY_STRING => '',
        SCRIPT_NAME    => $PATH,
    },
    ''
  );

$stdout =~ s/\r//g;

while($stdout =~ /([^\n]*)\n?/g) {
  if(!$1) {
    $ish = 0;
    next;
  }
  if($ish == 1) {
    $header .= $1."\n";
  } else {
    $body .= $1."\n";
  }
}

if ( defined $ARGV[0] and $ARGV[0] eq "config" )
{

  if($body =~ m/pool:\s+(.*?)\n/) {
    $pool = $1;
  }

  print <<"EOF";
multigraph ${PLUGIN_NAME}_process
graph_title php5-fpm processes for $pool
graph_args --base 1000 -l 0
graph_vlabel Processes
graph_scale yes
graph_category processes
graph_info This graph shows the php5-fpm process manager status from pool: $pool
active.label Active processes
active.type GAUGE
active.draw AREA
active.info The number of active processes
idle.label Idle processes
idle.type GAUGE
idle.draw STACK
idle.info The number of idle processes
total.label Total processes
total.type GAUGE
total.draw LINE2
total.info The number of idle + active processes

multigraph ${PLUGIN_NAME}_slowrequests
graph_title php5-fpm slow requests $pool
graph_args --base 1000 -l 0
graph_vlabel Slow requests
graph_scale yes
graph_category processes
graph_info This graph shows the php5-fpm slow request from pool: $pool
slow_requests.label Slow requests
slow_requests.type DERIVE
slow_requests.draw LINE2
slow_requests.min 0
slow_requests.info evolution of slow requests

EOF

  exit 0
}

# print $body;

print "multigraph ${PLUGIN_NAME}_process\n";

if($body =~ m/idle processes: (.*?)\n/) {
        $IDLE = $1;
  print "idle.value ".$IDLE."\n";
}
if($body =~ m/active processes: (.*?)\n/) {
        $ACTIVE = $1;
  print "active.value ".$ACTIVE."\n";
}
if($body =~ m/total processes: (.*?)\n/) {
        $TOTAL = $1;
  print "total.value ".$TOTAL."\n";
}

if($body =~ m/slow requests: (.*?)\n/) {
  $SLOW_REQUESTS = $1;
  print "\n";
  print "multigraph ${PLUGIN_NAME}_slowrequests\n";
  print "slow_requests.value ".$SLOW_REQUESTS."\n";
}
