- Repository
- Munin (contrib)
- Last change
- 2020-10-24
- Graph Categories
- Family
- auto
- Capabilities
- Keywords
- Language
- Perl
- License
- GPL-3.0
- Authors
php_fpm_process
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
Applicable Systems
Any php-fpm host You will need the perl fastcgi::client on your host
Configuration
You have to put this in your plugin.conf.d folder
In case your php process is listening on TCP:
[php_fpm_process]
env.serveraddr 127.0.0.1
env.port 9000
env.path /status
In case your php process is listening on a Unix Socket:
[php_fpm_process]
env.sock /var/run/php-fpm.sock
env.path /status
Magic Markers
#%# family=auto
#%# capabilities=autoconf
Version
v2.0.0
Author
Minitux
Olivier Mehani <shtrom+munin@ssji.net>
License
SPDX-License-Identifier: GPL-3.0
#!/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
In case your php process is listening on TCP:
[php_fpm_process]
env.serveraddr 127.0.0.1
env.port 9000
env.path /status
In case your php process is listening on a 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 <shtrom+munin@ssji.net>
=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";
}