pcp
[Top] [All Lists]

[PATCH] Added mail.log parsing to pmdapostfix.pl

To: pcp@xxxxxxxxxxx
Subject: [PATCH] Added mail.log parsing to pmdapostfix.pl
From: jeffpc@xxxxxxxxxxxxxx
Date: Mon, 10 May 2010 00:36:43 -0400
Cc: nathans@xxxxxxxxxx
User-agent: Mutt/1.5.20 (2009-06-14)
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

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