Munin (contrib)
Last change
Graph Categories


Sadly there is no documentation for this plugin.

use strict;

# HTTP response times for either entire page views
# or just the index, depending on configuration.
# Full or index resource pulling is determined by the suffix of the
# script name.  ie. http_response_full or http_response_index

# Parameters:
# 	config
# Configuration variables:
#	domain - domain of the server to measure (default
#   url[1..n] - url to measure against

my $domain = $ENV{'domain'} || '';

# determine the intended "action" of the script
# this is determined by the end of the script name
# http_response_full or http_response_index
my ($action) = ($0 =~ m/http_response_(\S+)$/);
$ENV{'action'} = $action;
if (! $ENV{'action'} =~ m/(full|index)/) {
    die "invalid action (determined by script suffix)";

my @urls;

#debug mode
#build urls manually
if ($ARGV[0] eq "debug") {
    push(@urls, ( "/",

#get the urls - build from configuration variables
my $i = 1;
while (defined ($ENV{"url$i"})) {
    push(@urls, $ENV{"url$i"});
if (! @urls) {
    die "No urls defined\n";

#output configuration and exit - required by Munin
if (exists $ARGV[0] and $ARGV[0] eq "config") {
    print "graph_title $domain Site Response Times - $ENV{'action'}\n";
    print "graph_category webserver\n";
    print "graph_vlabel request time (seconds)\n";
    print "graph_info Response times for public areas of $domain.\n";

    foreach my $url (@urls) {
        my $label = $url;
        #fix up our label name to be a valid variable name
        $label =~ s@[^A-Za-z0-9_]@_@g;
        print "$label.label $url\n";
        print "$label.type GAUGE\n";

    exit 0;


#function to make the request and get the response time
sub req_time {
    my $url = shift;
    my $time;
    my $outdir = '/tmp/munin/' . int(rand(32000));
    system("mkdir -p $outdir");
    if ($ENV{'action'} eq "full") {
        $time = `/usr/bin/time -f "%e" wget -pq -P $outdir --header "Accept-Encoding: gzip,deflate" "$url" 2>&1`;
    } elsif ($ENV{'action'} eq "index") {
        $time = `/usr/bin/time -f "%e" wget -q -P $outdir --header "Accept-Encoding: gzip,deflate" "$url" 2>&1`;
    system("rm -rf $outdir");
    return $time;

#loop over every url and output the responses
foreach my $url (@urls) {
    my $label = $url;
    #fix up our label name to be a valid name
    $label =~ s@[^A-Za-z0-9_]@_@g;
    print "$label.value " . req_time($domain.$url);

exit 0;