Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP

Loading…

Improved HTTP plugin, new CPU and page fault plugins #206

Merged
merged 7 commits into from

2 participants

@qris

No description provided.

qris added some commits
@qris qris Improve the HTTP plugin by allowing configuring a proxy and friendly …
…name per URL.

Note that the configuration file syntax has changed. You need one "url"
variable per URL now, numbered starting with 1, e.g. url1, url2, url3.
Each one can be configured by suffixing its variable, e.g. url1_proxy,
url2_proxy, etc.
8b1e467
@qris qris Add our "all processes" monitoring plugin, cleaned up, and a page fau…
…lt plugin.
55aa46a
@qris qris These plugins should be executable. ddbc1c4
@qris qris Fix process labels. c00710c
@qris qris Fix string comparison. fcbc8ed
@qris qris Add a plugin for adding up any number column output by ps. ef86c46
@qris qris Improve the left-side label of the graph. 73239ed
@kenyon kenyon merged commit 29e6559 into from
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Commits on Nov 1, 2012
  1. @qris

    Improve the HTTP plugin by allowing configuring a proxy and friendly …

    qris authored
    …name per URL.
    
    Note that the configuration file syntax has changed. You need one "url"
    variable per URL now, numbered starting with 1, e.g. url1, url2, url3.
    Each one can be configured by suffixing its variable, e.g. url1_proxy,
    url2_proxy, etc.
  2. @qris
  3. @qris
  4. @qris

    Fix process labels.

    qris authored
  5. @qris

    Fix string comparison.

    qris authored
Commits on Nov 7, 2012
  1. @qris
  2. @qris
This page is out of date. Refresh to see the latest.
View
82 plugins/http/http_request_time
@@ -10,7 +10,12 @@
=head1 CONFIGURATION
[http_request_time]
- env.url http://127.0.0.1/1 http://127.0.0.1/2 http://127.0.0.1/3
+ env.url http://127.0.0.1/1
+ env.url2 http://127.0.0.1/2
+ env.url3 http://www.example.com
+ env.url3_name some_munin_internal_name
+ env.url3_label Some random page on our website
+ env.url3_proxy http://firewall:3128
=head1 MAGIC MARKERS
@@ -41,7 +46,6 @@ sub clean {
return $surl;
};
-
if (! eval "require LWP::UserAgent;")
{
$ret = "LWP::UserAgent not found";
@@ -50,12 +54,19 @@ if (! eval "require LWP::UserAgent;")
}
}
-my $URL = $ENV{'url'}?$ENV{'url'}:"http://127.0.0.1/";
my %URLS;
-foreach $_ (split(/ /,$URL)){
- $URLS{$_}={
- url=>$_,
- surl=>clean($_),
+
+for (my $i = 1; $ENV{"url$i"}; $i++)
+{
+ my $url = $ENV{"url$i"};
+ my $proxy = $ENV{"url${i}_proxy"};
+ my $name = $ENV{"url${i}_name"} || clean($url);
+ my $label = $ENV{"url${i}_label"} || $url;
+
+ $URLS{$name}={
+ url=>$url,
+ proxy=>$proxy,
+ label=>$label,
time=>'U'
};
}
@@ -94,50 +105,67 @@ if ( defined $ARGV[0] and $ARGV[0] eq "config" )
print "graph_category other\n";
my @go;
- foreach my $url (values %URLS) {
- print "$$url{'surl'}.label $$url{'url'}\n";
- print "$$url{'surl'}.info The response time of a single request\n";
- print "$$url{'surl'}.min 0\n";
- print "$$url{'surl'}.draw LINE1\n";
- push(@go,$$url{'surl'});
+ foreach my $name (keys %URLS) {
+ my $url = $URLS{$name};
+ print "$name.label $$url{'label'}\n";
+ print "$name.info The response time of a single request\n";
+ print "$name.min 0\n";
+ print "$name.draw LINE1\n";
+ push(@go, $name);
}
# multigraphs
- foreach my $url (values %URLS) {
- print "\nmultigraph http_request_time.$$url{'surl'}\n";
+ foreach my $name (keys %URLS) {
+ my $url = $URLS{$name};
+ print "\nmultigraph http_request_time.$name\n";
print "graph_title $$url{'url'}\n";
print "graph_args --base 1000\n";
print "graph_vlabel response time in ms\n";
print "graph_category other\n";
- print "$$url{'surl'}.label $$url{'url'}\n";
- print "$$url{'surl'}.info The response time of a single request\n";
- print "$$url{'surl'}.min 0\n";
- print "$$url{'surl'}.draw LINE1\n";
+ print "$name.label $$url{'label'}\n";
+ print "$name.info The response time of a single request\n";
+ print "$name.min 0\n";
+ print "$name.draw LINE1\n";
}
exit 0;
}
my $ua = LWP::UserAgent->new(timeout => 15);
+foreach my $name (keys %URLS) {
+ my $url = $URLS{$name};
-foreach my $url (values %URLS) {
- my $t1=[gettimeofday];
+ if ($url->{proxy}) {
+ $ua->proxy(['http', 'ftp'], $url->{proxy});
+ }
+ else {
+ $ua->proxy(['http', 'ftp'], undef);
+ }
+
+ # warm up
my $response = $ua->request(HTTP::Request->new('GET',$$url{'url'}));
+
+ # timed run
+ my $t1=[gettimeofday];
+ $response = $ua->request(HTTP::Request->new('GET',$$url{'url'}));
my $t2=[gettimeofday];
+
if ($response->is_success) {
$$url{'time'}=sprintf("%d",tv_interval($t1,$t2)*1000);
};
};
print("multigraph http_request_time\n");
-foreach my $url (values %URLS) {
- print("$$url{'surl'}.value $$url{'time'}\n");
-}
-foreach my $url (values %URLS) {
- print("\nmultigraph http_request_time.$$url{'surl'}\n");
- print("$$url{'surl'}.value $$url{'time'}\n");
+foreach my $name (keys %URLS) {
+ my $url = $URLS{$name};
+ print("$name.value $$url{'time'}\n");
}
+foreach my $name (keys %URLS) {
+ my $url = $URLS{$name};
+ print("\nmultigraph http_request_time.$name\n");
+ print("$name.value $$url{'time'}\n");
+}
# vim:syntax=perl
View
106 plugins/system/cpu_by_process
@@ -0,0 +1,106 @@
+#!/usr/bin/perl
+#
+# Copyright 2012 Chris Wilson
+# Copyright 2006 Holger Levsen
+#
+# This plugin monitors ALL processes on a system. No exceptions. It can
+# produce very big graphs! But if you want to know where your CPU time
+# is going without knowing what to monitor in advance, this can help;
+# or in addition to one of the more specific CPU plugins to monitor
+# just Apache or MySQL, for example.
+#
+# It's not obvious what the graph heights actually mean, even to me.
+# Each counter is a DERIVE (difference since the last counter reading)
+# of the CPU time usage (in seconds) accounted to each process, summed
+# by the process name, so all Apache and all MySQL processes are grouped
+# together. Processes with no CPU usage at all are ignored. Processes
+# that die may not appear on the graph, and anyway their last chunk of
+# CPU usage before they died is lost. You could modify this plugin to
+# read SAR/psacct records if you care about that.
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; version 2 dated June,
+# 1991.
+
+#scriptname=`basename $0`
+#vsname=`echo $scriptname | perl -ne '/^vserver_proc_VM_(.*)/ and print $1'`
+
+#if [ "$1" = "suggest" ]; then
+# ls -1 /etc/vservers
+# exit 0
+#elif [ -z "$vsname" ]; then
+# echo "Must be used with a vserver name; try '$0 suggest'" >&2
+# exit 2
+#fi
+
+use strict;
+use warnings;
+
+my $cmd = "ps -eo time,comm h";
+open PS, "$cmd|" or die "Failed to run ps command: $cmd: $!";
+
+# my $header_line = <PS>;
+my %total_cpu_by_process;
+
+while (<PS>)
+{
+ my @fields = split;
+ my $cputime = $fields[0];
+ my $process = $fields[1];
+
+ # remove any / and everything after it from the process name,
+ # e.g. kworker/0:2 -> kworker
+ $process =~ s|/.*||;
+
+ # remove any . at the end of the name (why does this appear?)
+ # $process =~ s|\.$||;
+
+ # change any symbol that's not allowed in a munin variable name to _
+ $process =~ tr|a-zA-Z0-9|_|c;
+
+ my @times = split /:/, $cputime;
+ $cputime = (($times[0] * 60) + $times[1]) * 60 + $times[2];
+ $total_cpu_by_process{$process} += $cputime;
+}
+
+foreach my $process (keys %total_cpu_by_process)
+{
+ # remove all processes with 0 cpu time
+ if (not $total_cpu_by_process{$process})
+ {
+ delete $total_cpu_by_process{$process};
+ }
+}
+
+close(PS);
+
+if (@ARGV and $ARGV[1] eq "config")
+{
+ print <<END;
+graph_title CPU time by Process
+graph_args --base 1000
+graph_vlabel seconds
+graph_category system
+graph_info Shows CPU time used by each process name
+END
+
+ my $stack = 0;
+ sub draw() { return $stack++ ? "STACK" : "AREA" }
+ print map
+ {
+ "$_.label $_\n" .
+ "$_.min 0\n" .
+ "$_.type DERIVE\n" .
+ "$_.draw " . draw() . "\n"
+ } sort keys %total_cpu_by_process;
+}
+else
+{
+ print map
+ {
+ "$_.value $total_cpu_by_process{$_}\n"
+ } sort keys %total_cpu_by_process;
+}
+
+exit(0);
View
0  plugins/system/membyuser 100644 → 100755
File mode changed
View
0  plugins/system/memory_by_process 100644 → 100755
File mode changed
View
105 plugins/system/pagefaults_by_process
@@ -0,0 +1,105 @@
+#!/usr/bin/perl
+#
+# Copyright 2012 Chris Wilson
+# Copyright 2006 Holger Levsen
+#
+# This plugin monitors ALL processes on a system. No exceptions. It can
+# produce very big graphs! But if you want to know which processes are
+# killing your system by page faulting, without knowing what to monitor
+# in advance, this can help; or in addition to one of the more specific
+# plugins to monitor just Apache or MySQL, for example.
+#
+# Each counter is a DERIVE (difference since the last counter reading)
+# of the number of major page faults, usually 4k each, read in by a
+# process. Memory mapped files probably contribute to this. The process
+# cannot continue until the page fault is served, so this is a
+# high-priority read that usually indicates memory starvation.
+# Processes with no page faults at all are ignored. Processes
+# that die may not appear on the graph, and anyway their last chunk of
+# CPU usage before they died is lost. You could modify this plugin to
+# read SAR/psacct records if you care about that.
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; version 2 dated June,
+# 1991.
+
+#scriptname=`basename $0`
+#vsname=`echo $scriptname | perl -ne '/^vserver_proc_VM_(.*)/ and print $1'`
+
+#if [ "$1" = "suggest" ]; then
+# ls -1 /etc/vservers
+# exit 0
+#elif [ -z "$vsname" ]; then
+# echo "Must be used with a vserver name; try '$0 suggest'" >&2
+# exit 2
+#fi
+
+use strict;
+use warnings;
+
+my $cmd = "ps -eo maj_flt,comm h";
+open PS, "$cmd|" or die "Failed to run ps command: $cmd: $!";
+
+# my $header_line = <PS>;
+my %total_by_process;
+
+while (<PS>)
+{
+ my @fields = split;
+ my $value = $fields[0];
+ my $process = $fields[1];
+
+ # remove any / and everything after it from the process name,
+ # e.g. kworker/0:2 -> kworker
+ $process =~ s|/.*||;
+
+ # remove any . at the end of the name (why does this appear?)
+ # $process =~ s|\.$||;
+
+ # change any symbol that's not allowed in a munin variable name to _
+ $process =~ tr|a-zA-Z0-9|_|c;
+
+ $total_by_process{$process} += $value;
+}
+
+foreach my $process (keys %total_by_process)
+{
+ # remove all processes with 0 faults
+ if (not $total_by_process{$process})
+ {
+ delete $total_by_process{$process};
+ }
+}
+
+close(PS);
+
+if (@ARGV and $ARGV[1] eq "config")
+{
+ print <<END;
+graph_title Page faults by Process
+graph_args --base 1000
+graph_vlabel seconds
+graph_category system
+graph_info Shows number of major page faults caused by each process name
+END
+
+ my $stack = 0;
+ sub draw() { return $stack++ ? "STACK" : "AREA" }
+ print map
+ {
+ "$_.label $_\n" .
+ "$_.min 0\n" .
+ "$_.type DERIVE\n" .
+ "$_.draw " . draw() . "\n"
+ } sort keys %total_by_process;
+}
+else
+{
+ print map
+ {
+ "$_.value $total_by_process{$_}\n"
+ } sort keys %total_by_process;
+}
+
+exit(0);
View
119 plugins/system/total_by_process_
@@ -0,0 +1,119 @@
+#!/usr/bin/perl
+#
+# Copyright 2012 Chris Wilson
+# Copyright 2006 Holger Levsen
+#
+# This plugin monitors ALL processes on a system. No exceptions. It can
+# produce very big graphs! But if you want to know which processes are
+# killing your system by page faulting, without knowing what to monitor
+# in advance, this can help; or in addition to one of the more specific
+# plugins to monitor just Apache or MySQL, for example.
+#
+# Each counter is a DERIVE (difference since the last counter reading)
+# of the number of major page faults, usually 4k each, read in by a
+# process. Memory mapped files probably contribute to this. The process
+# cannot continue until the page fault is served, so this is a
+# high-priority read that usually indicates memory starvation.
+# Processes with no page faults at all are ignored. Processes
+# that die may not appear on the graph, and anyway their last chunk of
+# CPU usage before they died is lost. You could modify this plugin to
+# read SAR/psacct records if you care about that.
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; version 2 dated June,
+# 1991.
+
+use strict;
+use warnings;
+
+my $scriptname = $0;
+$scriptname =~ s|.*/||;
+my $fieldname = ($scriptname =~ /^total_by_process_(.*)_(.*)/) ? $1 : undef;
+my $fieldtype = ($scriptname =~ /^total_by_process_(.*)_(.*)/) ? $2 : undef;
+
+if (@ARGV and $ARGV[1] eq "suggest")
+{
+ system("ps L | cut -d' ' -f1");
+ exit(0);
+}
+
+if (!$fieldname)
+{
+ print STDERR "Must be used with a PS format specifier name; try '$0 suggest'";
+ exit(2);
+}
+
+unless ($fieldtype =~ /^(GAUGE|DERIVE)$/)
+{
+ print STDERR "Unknown field type $fieldtype: should be GAUGE or DERIVE";
+ exit(2);
+}
+
+my $cmd = "ps -eo $fieldname,comm h";
+open PS, "$cmd|" or die "Failed to run ps command: $cmd: $!";
+
+# my $header_line = <PS>;
+my %total_by_process;
+
+while (<PS>)
+{
+ my @fields = split;
+ my $value = $fields[0];
+ my $process = $fields[1];
+
+ # remove any / and everything after it from the process name,
+ # e.g. kworker/0:2 -> kworker
+ $process =~ s|/.*||;
+
+ # remove any . at the end of the name (why does this appear?)
+ # $process =~ s|\.$||;
+
+ # change any symbol that's not allowed in a munin variable name to _
+ $process =~ tr|a-zA-Z0-9|_|c;
+
+ $total_by_process{$process} += $value;
+}
+
+foreach my $process (keys %total_by_process)
+{
+ # remove all processes with 0 faults
+ if (not $total_by_process{$process})
+ {
+ delete $total_by_process{$process};
+ }
+}
+
+close(PS);
+
+if (@ARGV and $ARGV[1] == "config")
+{
+ print <<END;
+graph_title $fieldname by Process
+graph_category system
+graph_info Shows total of $fieldname (reported by ps) for each process name
+graph_vlabel $fieldname (from ps)
+END
+
+ # graph_args --base 1000
+ # graph_vlabel seconds
+
+ my $stack = 0;
+ sub draw() { return $stack++ ? "STACK" : "AREA" }
+ print map
+ {
+ "$_.label $_\n" .
+ "$_.min 0\n" .
+ "$_.type $fieldtype\n" .
+ "$_.draw " . draw() . "\n"
+ } sort keys %total_by_process;
+}
+else
+{
+ print map
+ {
+ "$_.value $total_by_process{$_}\n"
+ } sort keys %total_by_process;
+}
+
+exit(0);
Something went wrong with that request. Please try again.