#!/usr/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/php-fpm.sock env.path /status =head1 MAGIC MARKERS #%# family=auto #%# capabilities=autoconf =head1 VERSION v2.0.0 =head1 AUTHOR Minitux Olivier Mehani =head1 LICENSE SPDX-License-Identifier: GPL-3.0 =cut use File::Basename; use FCGI::Client; my $ish = 1; my $header = ""; my $body = ""; my $IDLE = 0; my $ACTIVE = 0; my $TOTAL = 0; my $LISTEN = 0; my $MAX = 0; my $LEN = 0; my $CONNECTIONS = 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, }, '' ); # # Example output: # # pool: www # process manager: dynamic # start time: 23/Jun/2019:12:13:50 +0200 # start since: 577793 # accepted conn: 37211 # listen queue: 0 # max listen queue: 0 # listen queue len: 0 # idle processes: 6 # active processes: 1 # total processes: 7 # max active processes: 13 # max children reached: 0 # slow requests: 0 # # ...with ?full added to the query string, each child is also described: # # ************************ # pid: 56027 # state: Running # start time: 18/Jul/2019:01:02:15 +0200 # start since: 45279 # requests: 776 # request duration: 1043 # request method: GET # request URI: /fpm-status?full # content length: 0 # user: - # script: - # last request cpu: 0.00 # last request memory: 0 # $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 php-fpm processes for $pool graph_args --base 1000 -l 0 graph_vlabel Processes graph_scale yes graph_category appserver graph_info This graph shows the php-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 max.label Max processes max.type GAUGE max.draw LINE max.info The maximum number of active processes since FPM has started multigraph ${PLUGIN_NAME}_queues graph_title php-fpm queues for $pool graph_args --base 1000 -l 0 graph_vlabel Queue graph_scale yes graph_category appserver graph_info This graph shows the php-fpm queue from pool $pool listen.label Listen queue listen.type GAUGE listen.draw LINE listen.info The number of pending requests in the queue max.label Max listen queue max.type GAUGE max.draw LINE max.info The maximum number of pending requests in the queue len.label Queue len len.type GAUGE len.draw LINE len.info The number of pending connections in the queue multigraph ${PLUGIN_NAME}_requests graph_title php-fpm requests for $pool graph_args --base 1000 -l 0 graph_vlabel Requests graph_scale yes graph_category appserver graph_info This graph shows the php-fpm request rate from pool $pool connections.label Connections connections.type DERIVE connections.draw LINE connections.min 0 connections.info evolution of connections slow.label Slow requests slow.type DERIVE slow.draw LINE slow.min 0 slow.info evolution of slow requests (longer than request_slowlog_timeout) 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/max active processes: (.*?)\n/) { $MAX = $1; print "max.value ".$MAX."\n"; } if($body =~ m/listen queue: (.*?)\n/) { $LISTEN= $1; print "multigraph ${PLUGIN_NAME}_queues\n"; print "listen.value ".$LISTEN."\n"; if($body =~ m/max listen queue: (.*?)\n/) { $MAX = $1; print "max.value ".$MAX."\n"; } if($body =~ m/listen queue len: (.*?)\n/) { $LEN = $1; print "len.value ".$LEN."\n"; } } print "multigraph ${PLUGIN_NAME}_requests\n"; if($body =~ m/accepted conn: (.*?)\n/) { $CONNECTIONS = $1; print "connections.value ".$CONNECTIONS."\n"; } if($body =~ m/slow requests: (.*?)\n/) { $SLOW_REQUESTS = $1; print "slow.value ".$SLOW_REQUESTS."\n"; }