#!/usr/bin/perl -w # # byprojects_bandwidth # # Perl script to monitor total bandwidth *byprojects* (e.g. vhost) from multiple files and/or regex. # # Danny Fullerton # Mantor Organization # # You need logtail (https://www.fourmilab.ch/webtools/logtail/) and # # Your nginx configuration should look like this (i.e. $request_length $body_bytes_sent at the end): # log_format main '$remote_addr - $remote_user $time_local "$request" ' # '$status $body_bytes_sent "$http_referer" ' # '"$http_user_agent" $request_length $body_bytes_sent'; # # Log can be gather from multiple sources by simply specifying multiple log filename and/or an array with two # elements: log filename and a regex. # - 'prod' => array('/home/prod/log/access.log'), # Prod graph will be using everything in /home/prod/log/access.log # - 'test' => array(array('/var/log/httpd/access.log', '"[A-Z]+ /test/'), '/home/test/log/access.log') # Test graph will be using eveything in /home/test/log/access.log and stuff that match '"[A-Z] /test/' in # /var/log/httpd/access.log such as '"GET /test/' $statepath = '/usr/local/var/munin/plugin-state'; # directory where logtail will save the state $logtail = '/usr/local/bin/logtail'; $server = 'Nginx'; %logs = ( 'prod' => ('/home/prod/log/access.log'), 'test' => ( ('/var/log/httpd/access.log', '"[A-Z]+ /test/'), '/home/test/log/access.log' ) ); ########### if(defined($ARGV[0])) { if ($ARGV[0] eq 'autoconf') { print "yes\n"; exit(0); } elsif ($ARGV[0] eq 'config') { $order = ''; while (($client, $files) = each(%logs)) { $order .= $client.' ' } print "graph_order $order\n"; print "graph_title $server total bandwidth byprojects\n"; print "graph_total Total\n"; print "graph_vlabel Bits\n"; print "graph_category $server\n"; print "graph_info This graph show $server total bandwidth used by various projects.\n"; while (($client, $files) = each(%logs)) { print $client.".label $client\n"; print $client.".type GAUGE\n"; } exit(0); } } while (($client, $files) = each(%logs)) { $i = $o = $x = 0; foreach $file ($files) { $regex = ''; $state = $statepath.'/'.$client.$x.'_totalbandwidth.state'; if(ref($file) eq 'ARRAY') { ($file, $regex) = @file } open(my $lt, "$logtail -f $file -o $state |") or die "Can't open $logtail : $!"; while (<$lt>) { $buf = $_; if($buf eq '') { next } if(!defined($regex) || $buf =~ m/$regex/) { if($buf =~ m/(\d+) (\d+)$/) { $i += $1; $o += $2; } } } close($lt); $x++; } $x = $i + $o; print $client.".value $x\n"; }