Please ignore this version...I am going to send a fixed up one soon.
Jeff.
On Mon, May 10, 2010 at 12:36:43AM -0400, jeffpc@xxxxxxxxxxxxxx wrote:
>
> From: Josef 'Jeff' Sipek <jeffpc@xxxxxxxxxxxxxx>
>
> Signed-off-by: Josef 'Jeff' Sipek <jeffpc@xxxxxxxxxxxxxx>
> ---
> src/pmdas/postfix/pmdapostfix.pl | 84 ++++++++++++++++++++++++++++++++++---
> 1 files changed, 77 insertions(+), 7 deletions(-)
>
> diff --git a/src/pmdas/postfix/pmdapostfix.pl
> b/src/pmdas/postfix/pmdapostfix.pl
> index d64bea4..82f016e 100644
> --- a/src/pmdas/postfix/pmdapostfix.pl
> +++ b/src/pmdas/postfix/pmdapostfix.pl
> @@ -19,8 +19,11 @@ use Time::HiRes qw ( time );
>
> use vars qw( $pmda );
> use vars qw( %caches );
> +use vars qw( %logstats );
> +use vars qw( @postfix_sent_dom );
> +my $logfile = '/var/log/mail.log';
> my $qshape = 'qshape -b 10 -t 5';
> -my $refresh = 5.0; # 5 seconds between refreshes
> +my $refresh = 5.0; # 5 seconds between qshape refreshes
>
> my $cached = 0;
>
> @@ -61,6 +64,42 @@ sub postfix_do_refresh
> }
> }
>
> +sub postfix_log_parser
> +{
> + ( undef, $_ ) = @_;
> +
> + if (/status=sent/) {
> + return unless (/ postfix\//);
> +
> + my $relay = "";
> +
> + if (/relay=([^,]+)/o) {
> + $relay = $1;
> + }
> +
> + if ($relay !~ /\[/o) {
> + # if we are about to define a new instance, let's add it to the
> + # domain as well
> + my $found = 0;
> +
> + for(@postfix_sent_dom) {
> + last if ($relay eq $_);
> + $found += 1;
> + }
> +
> + push(@postfix_sent_dom, $relay) if (@postfix_sent_dom == $found);
> +
> + $logstats{"sent"}{$found} += 1;
> + } else {
> + $logstats{"sent"}{0} += 1;
> + }
> + } elsif (/smtpd.*client=/) {
> + $logstats{"received"}{1} += 1;
> + } elsif (/pickup.*(sender|uid)=/) {
> + $logstats{"received"}{0} += 1;
> + }
> +}
> +
> sub postfix_fetch_callback
> {
> my ($cluster, $item, $inst) = @_;
> @@ -72,19 +111,26 @@ sub postfix_fetch_callback
>
> if (!defined($metric_name)) { return (PM_ERR_PMID, 0); }
>
> - if ($now - $cached > $refresh) {
> - postfix_do_refresh();
> - $cached = $now;
> - }
> -
> if ($cluster == 0) {
> my $qname;
>
> + if ($now - $cached > $refresh) {
> + postfix_do_refresh();
> + $cached = $now;
> + }
> +
> $qname = $metric_name;
> $qname =~ s/^postfix\.queues\.//;
>
> return (PM_ERR_AGAIN, 0) unless defined($caches{$qname});
> return ($caches{$qname}{$inst}, 1);
> + } elsif ($cluster == 1) {
> + my $dir = $metric_name;
> + $dir =~ s/^postfix\.//;
> +
> + return (PM_ERR_AGAIN, 0) unless defined($logstats{$dir});
> + return (PM_ERR_AGAIN, 0) unless defined($logstats{$dir}{$inst});
> + return ($logstats{$dir}{$inst}, 1);
> }
>
> return (PM_ERR_PMID, 0);
> @@ -104,6 +150,15 @@ my @postfix_queues_dom = ( 0 => 'total',
> 10=> '1280+ mins',
> );
>
> +my $postfix_sent_indom = 1;
> +my @postfix_sent_dom = ( 0 => 'smtp',
> + );
> +
> +my $postfix_received_indom = 2;
> +my @postfix_received_dom = ( 0 => 'local',
> + 1 => 'smtp',
> + );
> +
> $pmda = PCP::PMDA->new('postfix', 103);
>
> $pmda->add_metric(pmda_pmid(0,0), PM_TYPE_U32, $postfix_queues_indom,
> @@ -122,7 +177,21 @@ $pmda->add_metric(pmda_pmid(0,4), PM_TYPE_U32,
> $postfix_queues_indom,
> PM_SEM_INSTANT, pmda_units(0,0,1,0,0,PM_COUNT_ONE),
> "postfix.queues.deferred", '', '');
>
> +$pmda->add_metric(pmda_pmid(1,0), PM_TYPE_U32, $postfix_sent_indom,
> + PM_SEM_COUNTER, pmda_units(0,0,1,0,0,PM_COUNT_ONE),
> + "postfix.sent", '', '');
> +$pmda->add_metric(pmda_pmid(1,1), PM_TYPE_U32, $postfix_received_indom,
> + PM_SEM_COUNTER, pmda_units(0,0,1,0,0,PM_COUNT_ONE),
> + "postfix.received", '', '');
> +
> +$logstats{"sent"}{0} = 0;
> +$logstats{"received"}{0} = 0;
> +$logstats{"received"}{1} = 0;
> +
> $pmda->add_indom($postfix_queues_indom, \@postfix_queues_dom, '', '');
> +$pmda->add_indom($postfix_sent_indom, \@postfix_sent_dom, '', '');
> +$pmda->add_indom($postfix_received_indom, \@postfix_received_dom, '', '');
> +$pmda->add_tail($logfile, \&postfix_log_parser, 0);
> $pmda->set_fetch_callback(\&postfix_fetch_callback);
> $pmda->run;
>
> @@ -135,7 +204,8 @@ pmdapostfix - Postfix performance metrics domain agent
> (PMDA)
> =head1 DESCRIPTION
>
> B<pmdapostfix> is a Performance Metrics Domain Agent (PMDA) which exports
> -mail queue sizes as reported by qshape(1).
> +mail queue sizes as reported by qshape(1), as well as agreggate statistics
> +collected from mail.log.
>
> =head1 INSTALLATION
>
> --
> 1.6.2.107.ge47ee
>
> _______________________________________________
> pcp mailing list
> pcp@xxxxxxxxxxx
> http://oss.sgi.com/mailman/listinfo/pcp
--
Don't drink and derive. Alcohol and algebra don't mix.
|