How To Get Data For Mrtg Without Running SNMP Daemon?

Posted by Alexey Kovyrin under Development, Networks · русский

Plotting traffic graphs is one of the most popular UNIX admin tasks. ;-) Mrtg is a great tool and it is widely used for plotting traffic graphs. It can be easily set up to plot statistics for any SNMP-enabled device (including Linux servers running snmpd). But sometimes we can not setup snmp daemon in Linux server because of small amount of memory or because of some another reasons. How we can plot our favourite graphs in such cases?

When I have installed my home server to connect my home network to Internet, there was too small amount of RAM and spending free memory to run snmpd was not possible. As a solution I have created small Perl script, that can get information from /proc/net/dev and pass it to mrtg script.

If you want to try this script, you need to make following simple steps on your server:

  1. Download my script, rename it to get_if_stats.pl and put it to /usr/local/bin directory on your server.
  2. Make it executable:

    # chmod +x usr/local/bin/get_if_stats.pl
    

  3. Add new entry to mrtg.conf (example is for eth0 interface):

    Title[new_graph]: World channel (eth0)
    PageTop[new_graph]: <h1>Some new mrtg graph (eth0)</h1>
    Target[new_graph]: `/usr/local/bin/get_if_stats.pl eth0`
    MaxBytes[new_graph]: 100000000
    

That is all! Now you can plot graphs for any interface without running huge snmp daemons in your server memory


Related posts:

  1. How to create IP-IP tunnel between FreeBSD and Linux
  2. How To Get “Provider Independent” IP Address For Your Home Server?
  3. Monitoring nginx Server Statistics With rrdtool
  4. Connecting Two Remote Local Networks With Transparent Bridging Technique
  5. 5 Minutes Guide To Linux Traffic Shaping

11 Responses to this entry

kotnik says:

Works excellent! Thanks! I’ve tried snmp with Cacti, but it almost killed my poor router. Now, it’s graphing easily :)

Just one sidenote. If you’re installing clean mrtg, then add this to mrtg.conf:

WorkDir: /var/www/htdocs/mrtg

That direcotory will be a place where mrtg will dump pngg raphs, log and html files.

Thanks Alexey!

Jon says:

Cool stuff! Even if the load of an SNMP daemon wasn’t an issue (and it is for me); this saves you worrying about configuring communities properly, security issues, etc.

Bor says:

Необязательно как скрипт делать ;)
вот поделюсь своими

#####################################################################
#
# eth0 traffic graphing section from /proc/net/dev
# change “grep eth0″ to something else to measure a different device
#
Target[eth0]: `perl -e ‘@a=split(/[:\s]+/,qx(grep eth0 /proc/net/dev));printf “%.0f\n%.0f\n1\neth0 traffic\n”,$a[2],$a[10];’`;
Options[eth0]: dorelpercent, growright, nobanner, noinfo, transparent
MaxBytes[eth0]: 2000000
AbsMax[eth0]: 10000000
kilo[eth0]: 1024
YLegend[eth0]: Bytes per second
ShortLegend[eth0]: B/s
Legend1[eth0]: Incoming Traffic in Bytes per second
Legend2[eth0]: Outgoing Traffic in Bytes per second
LegendI[eth0]: In:
LegendO[eth0]: Out:
Title[eth0]: net eth0 traffic
PageTop[eth0]: net eth0 traffic
#####################################################################

#####################################################################
# # alternative eth0 traffic graphing section
# using “sar” instead of /proc/*
#
Target[eth0sar]: `perl -e ‘printf “%.0f\n%.0f\n1\neth0sar traffic\n”,(qx(/usr/bin/sar -n DEV | grep eth0 | tail -n 2)=~/eth0\s+[^\s]+\s+[^\s]+\s+([^\s]+)\s+([^\s]+)/)’`;
Options[eth0sar]: dorelpercent, gauge, growright, nobanner, noinfo, transparent
MaxBytes[eth0sar]: 2000000
AbsMax[eth0sar]: 10000000
kilo[eth0sar]: 1024
YLegend[eth0sar]: Bytes per second
ShortLegend[eth0sar]: B/s
Legend1[eth0sar]: Incoming Traffic in Bytes per second
Legend2[eth0sar]: Outgoing Traffic in Bytes per second
LegendI[eth0sar]: In:
LegendO[eth0sar]: Out:
Title[eth0sar]: net eth0sar traffic
PageTop[eth0sar]: net eth0sar traffic
#####################################################################

Scoundrel says:

2Bor: Thanks for example, but such complex config file is not so easily readable/modificable and that is why I’ve created my script ;-)

sb says:

Traffic monitoring without snmp has at least two caveats:

1) The counters in /proc/net/dev (and in the output of ifconfig etc.) are 32bit and will overflow at around 4GiB. SNMP agents (should!) use 64bit counters.

2) Related to (1), the SNMP client can tell if the counter has been reset because of a reboot, as it knows the server’s uptime (SysUpTime).

Have you tried tinysnmp? Its memory footprint is smaller than perl’s ;-)

Dusan says:

Hi,

Do you have any idea how to get this script working on OpenBSD? There is no /proc/net/dev on OpenBSD.
Anyway, nice script, thanks :)

Andrea says:

Hi,
i’ve installed get_if_stats.pl, and my configuration is:

Target[webpec1eth0]: `/usr/local/bin/get_if_stats.pl eth0`
Options[webpec1eth0]: gauge,noinfo, nopercent, growright, nobanner
Title[webpec1eth0]: Traffico IN/OUT(eth0)
MaxBytes[webpec1eth0]: 100000000
PageTop[webpec1eth0]: Traffico interfaccia (eth0)
#
Target[webpec1eth1]: `/usr/local/bin/get_if_stats.pl eth1`
Options[webpec1eth1]: gauge,noinfo, nopercent, growright, nobanner
Title[webpec1eth1]: Traffico IN/OUT(eth1)
MaxBytes[webpec1eth1]: 100000000
PageTop[webpec1eth1]: Traffico interfaccia (eth1)

Eth0 graph is correct, while the eth1 graph shows empty values ?
If I run the script on command line I get:
227419173
261530900
0
0

thanks

andrea b