Monitoring and Graphing Applications with SNMP and MRTG.
There are two basic sections in this article, first will be
checking
services or processes via net-snmp.
First off download net-snmp from net-snmp.org, a simple
./configure ; make ; make install should do the trick in most
cases.
After this you should run sudo snmpconf, to create your snmpd.conf
file, which will contain your community names, location etc...
Then with the basic configuration you could start the snmpd with
sudo snmpd, or sudo snmpd -r which enables net-snmp to drop most
privileges just after startup.
In this default setting, with a default configuration,
you could do something like snmpwalk -v 1 -c public localhost , to
see
some of the built-in settings. Now to get to the interesting
section,
let’s say you want to monitor an application you just wrote...
let’s say you want to check if port 25 is up, via snmp....
You could write a simple python application[0], which returns 0
for a success, or 1 for a failure...
(In real life you would probably just do this from a remote host, but
this
is just a simple example which can be expanded to your
application).
Now to monitor this event, in your /etc/snmpd.conf add a line
like...
exec 1.3.6.1.4.1.5000.100 check-smtp /software/snmp/check-smtp.py
A oversimplified explanation of the number would be,
1.3.6.1.4.1 means enterprise, 5000 would be your organisations MIB
number, and 100 would be the specific OID. For more information on
getting
an organisation private enterprise number, you should see
http://www.iana.org/cgi-bin/enterprise.pl
Now if you type snmpwalk -v 1 -c public localhost
1.3.6.1.4.1.5000.100
you will see not just the reply, but all objects within the OID.
If you wanted to be specific (which you may need to do for snmp
managers
or mrtg...you would have something like snmpwalk -v 1 -c public
localhost 1.3.6.1.4.1.5000.100.101.1
Or graph something (anything) on a remote machine with snmp and
mrtg?
Now let’s say, you wanted a simple mrtg graph, which only checked
for the amount
of threads in a mysql database, which while useful, is once again a
pretty
simple example, let’s say you didn’t mind spawning a shell and
executing a command,
you might do something like mysqladmin status | awk {’print $4’}
...
which is fairly system unfriendly, but there isn’t much point
presenting a robust
c application in this case. Now in /etc/snmpd.conf add
exec 1.3.6.1.4.1.5000.101 mysql-thread-load
/software/snmp/mysql-thread-load.sh
inside the file have
#!/bin/sh
mysqladmin status | awk {’print $4’}
and make sure it’s executable by the calling process.
Here is a sample partial mrtg config[1].
The reason in Target that you have specified the number twice,
breaking it up with an & sign,
is that mrtg generally expects two inputs, one for incoming and one
for outgoing, this way
it just uses the same reply for both. Of course you could monitor
something like mysql threads,
and load average, and they could be graphed in the same picture,
which can be interesting
for correlation between application and system load.
[0]:
import socket
import time
HOST = ’localhost’
PORT = 25
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
try:
s.connect((HOST, PORT))
print ’0’
except socket.error:
print ’1’;
[1]:
Target[mysqlconnections]:
1.3.6.1.4.1.5000.101.101.1&1.3.6.1.4.1.5000.101.101.1:public@hostname
options[mysqlconnections]:
nobanner,absolute,gauge,growright,nopercent
Title[mysqlconnections]:Mysql Threads
PageTop[mysqlconnections]: <h1>Mysql Threads</h1>
MaxBytes[mysqlconnections]: 1000
YLegend[mysqlconnections]: connections
ShortLegend[mysqlconnections]: connections
LegendI[mysqlconnections]: connections:
LegendO[mysqlconnections]:
Legend1[mysqlconnections]: connections
Legend2[mysqlconnections]:
Step[mysqlconnections]: 12
|
|