pcp
[Top] [All Lists]

Re: [pcp] [PATCH] Added mail.log parsing to pmdapostfix.pl

To: pcp@xxxxxxxxxxx
Subject: Re: [pcp] [PATCH] Added mail.log parsing to pmdapostfix.pl
From: jeffpc@xxxxxxxxxxxxxx
Date: Mon, 10 May 2010 01:42:20 -0400
In-reply-to: <20100510043643.GC29197@xxxxxxxxxxxxxx>
References: <20100510043643.GC29197@xxxxxxxxxxxxxx>
User-agent: Mutt/1.5.20 (2009-06-14)
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.

<Prev in Thread] Current Thread [Next in Thread>