I have seen this question pop up several times on the lists and in IRC and 
thought that it may be useful for somebody to explain how I accomplish this in 
my own environment.  Note that this may not be the most efficient way to 
accomplish this, but it does work (so far).  This also gives you an idea of how 
to use net-snmp's "extend" functionality to pipe additional data and metrics 
through net-snmp.  This type of setup can be used to monitor other stuff -- for 
example, BIND statistics.

For the purpose of this HOWTO, we are going to obtain 5 stats from Postfix:
 * Messages Sent/5min
 * Messages Received/5min
 * Messages Bounced/5min
 * Messages Rejected/5min
 * Postfix Queue

Because postfix does not not interface with SNMP, we need to gather the data 
using something else that runs locally on the Postfix server.  We will use 
Craig Sander's Postfix MRTG scripts (http://taz.net.au/postfix/mrtg/) as our 
basis.

update-mailstats.pl is a daemon that will run on your Postfix server and 
collect data.  Out of the box, this script only collects messages sent/received 
(local and remote) but we are going to extend it to collect bounced and 
rejected messages as well:


Code:

use DB_File;
use File::Tail ;
$debug = 0;

$mail_log = '/var/log/maillog' ;
$stats_file = '/mirror/etc/stats.db' ;

$db = tie(%stats, "DB_File", "$stats_file", O_CREAT|O_RDWR, 0666, $DB_HASH)
        || die ("Cannot open $stats_file");

#my $logref=tie(*LOG,"File::Tail",(name=>$mail_log,tail=>-1,debug=>$debug));
my $logref=tie(*LOG,"File::Tail",(name=>$mail_log,debug=>$debug));

while (<LOG>) {
        if (/status=sent/) {
                next unless (/ postfix\//) ;
                # count sent messages
                if (/relay=([^,]+)/o) {
                        $relay = $1 ;
                        #print "$relay..." ;
                } ;
                if ($relay !~ /\[/o ) {
                        $stats{"SENT:$relay"} += 1;
                        #print "$relay\n" ;
                } else {
                        $stats{"SENT:smtp"} +=1 ;
                        #print "smtp\n" ;
                } ;
                $db->sync;
        } elsif (/status=bounced/) {
                # count bounced messages
                $stats{"BOUNCED:smtp"} += 1;
                $db->sync ;
        } elsif (/NOQUEUE: reject/) {
                # count rejected messages
                $stats{"REJECTED:smtp"} += 1;
                $db->sync ;
        } elsif (/smtpd.*client=/) {
                # count received smtp messages
                $stats{"RECEIVED:smtp"} += 1;
                $db->sync ;
        } elsif (/pickup.*(sender|uid)=/) {
                # count received local messages
                $stats{"RECEIVED:local"} += 1;
                $db->sync ;
        } ;
} ;

untie $logref ;
untie %stats;




Make sure you have $mail_log set correctly, and start this daemon.  It will 
create a database at $stats_file and start populating it as your maillog grows.

Now that we are collecting Postfix data, we need something to extract stats 
from the stats.db database which is being generated from update-mailstats.pl.  
Again, we will use Craig's mailstats.pl as our starting point and modify it a 
bit for our purpose:


Code:

use DB_File;

$|=1;

$stats_file = '/mirror/etc/stats.db' ;

tie(%foo, "DB_File", "$stats_file", O_RDONLY, 0666, $DB_HASH) || die ("Cannot 
open $stats_file");

if ($ARGV[0] =~ /sent/) {
        foreach (sort keys %foo) {
                print $foo{$_} if $_ =~ /SENT/;
        }
}
elsif ($ARGV[0] =~ /received/) {
        foreach (sort keys %foo) {
                print $foo{$_} if $_ =~ /RECEIVED/;
        }
}
elsif ($ARGV[0] =~ /bounced/) {
        foreach (sort keys %foo) {
                print $foo{$_} if $_ =~ /BOUNCED/;
        }
}
elsif ($ARGV[0] =~ /rejected/) {
        foreach (sort keys %foo) {
                print $foo{$_} if $_ =~ /REJECTED/;
        }
}
elsif ($ARGV[0] =~ /queue/) {
        @mailq = split(/\n/,`postqueue -p`); @line = split(' 
',$mailq[$#mailq]); print $line[4];
        print $mailq;
}

untie %foo;




Now we can run "mailstats.pl sent" for example and get the number of messages 
that postfix has sent:

# ./mailstats.pl sent
24428

Now that we have a way to extract this data out of the stats.db database, we 
need to make it available to net-snmp so ZenOSS can grab it.  To do this, we 
will use the "extend" function from net-snmp.  Add the following (or something 
similar) to your snmpd.conf:


Code:

# Let's pipe postfix stats to net-snmp
extend postfixSent /usr/local/bin/mailstats.pl sent
extend postfixReceived /usr/local/bin/mailstats.pl received
extend postfixQueue /usr/local/bin/mailstats.pl queue
extend postfixBounced /usr/local/bin/mailstats.pl bounced
extend postfixRejected /usr/local/bin/mailstats.pl rejected




After restarting snmpd, you should be able to retreive this stats via snmpwalk:


Code:

# snmpwalk -On -v2c -c <community> <hostname> .1 | grep postfix
...
NET-SNMP-EXTEND-MIB::nsExtendOutputFull."postfixSent" = STRING: 24492
NET-SNMP-EXTEND-MIB::nsExtendOutputFull."postfixQueue" = STRING: 49
NET-SNMP-EXTEND-MIB::nsExtendOutputFull."postfixBounced" = STRING: 22
NET-SNMP-EXTEND-MIB::nsExtendOutputFull."postfixReceived" = STRING: 18353
NET-SNMP-EXTEND-MIB::nsExtendOutputFull."postfixRejected" = STRING:
...




To get their OID (make sure you escape the "'s with backslashes):

Code:

# snmpwalk -On -v2c -c <community> <hostname> 
NET-SNMP-EXTEND-MIB::nsExtendOutputFull.\"postfixSent\"
.1.3.6.1.4.1.8072.1.3.2.3.1.2.11.112.111.115.116.102.105.120.83.101.110.116 = 
STRING: 24516




This is the OID that you will add as a data source in ZenOSS to collected 
Postfix Sent Messages.  Repeat this previous step for all 5 datasources.

Now we just need to configure ZenOSS.  This will encompass creating a new 
template, defining datasources, defining a threshold and defining two graphs to 
display our data.  By default, ZenOSS polls SNMP every 5 minutes -- this is why 
our message stats are "per 5 minutes."

1.  Create a new template.  Browse to /Devices/Server, click the Templates tab, 
click the dropdown and select "Add Template."  Enter "Postfix" for the tempate 
name.

2.  Add data sources using the OID's that you found earlier.  We will add four 
datasources.  Here are the OID's that I used in my environment.  You should be 
able to SNMPWALK all of these OID's from your ZenOSS machine!:
        a. postfixBounced -     
1.3.6.1.4.1.8072.1.3.2.3.1.1.14.112.111.115.116.102.105.120.66.111.117.110.99.101.100
 (Type: COUNTER)
        b. postfixQueue   -     
1.3.6.1.4.1.8072.1.3.2.3.1.1.12.112.111.115.116.102.105.120.81.117.101.117.101 
(Type: GAUGE)
        c. postfixReceived -    
1.3.6.1.4.1.8072.1.3.2.3.1.1.15.112.111.115.116.102.105.120.82.101.99.101.105.118.101.100
 (Type: COUNTER)
        d. postfixSent -        
1.3.6.1.4.1.8072.1.3.2.3.1.1.11.112.111.115.116.102.105.120.83.101.110.116 
(Type: COUNTER)
        e. postfixRejected -    
1.3.6.1.4.1.8072.1.3.2.3.1.1.15.112.111.115.116.102.105.120.82.101.106.101.99.116.101.100
 (Type: COUNTER)

3. Add a threshold.  I added a threshold for postfixQueue to alert me if 
postfixQueue exceeds 200.

4. Define two graphs:
        a. Name: Postfix Messages.  Add four graph points - received, sent, 
bounced, rejected.  The RPN for all of these graph points MUST be "300,*"  I 
used "%3.0lf" for my "format" for all of these points as well.  The "Units" 
should be "messages/5min"

        b. Name: Postfix Queue.  Add one graph point - queue.  RPN should be 
default, graph point format should be "%3.0lf" and unit should be "messages" 
You can also add your threshold to this graph if you would like.

To use your newly created template, you will need to bind it to a device or 
device class using the Templates -> Bind Templates option.  After the template 
is bound, you should now be collecting postfix data.  Check the performance tab 
of a device and you should see two new graphs.  Note that the graphs will not 
be viewable immediatly -- give it at least 10 minutes.

I hope this was helpful.

Josh


[Image: http://thunder.jbdesign.net/screenshots/postfix-messages.jpg ]
[Image: http://thunder.jbdesign.net/screenshots/postfix-queue.jpg ][/img]




-------------------- m2f --------------------

Read this topic online here:
http://forums.zenoss.com/viewtopic.php?p=37458#37458

-------------------- m2f --------------------



_______________________________________________
zenoss-users mailing list
[email protected]
http://lists.zenoss.org/mailman/listinfo/zenoss-users

Reply via email to