Difference between revisions of "Traffic accounting through proc"

From OpenVZ Virtuozzo Containers Wiki
Jump to: navigation, search
m
(removed /etc/init.d/vz update-cron part (not implemented anymore))
 
(18 intermediate revisions by 8 users not shown)
Line 1: Line 1:
 
Traffic Accounting through /proc/net/dev
 
Traffic Accounting through /proc/net/dev
  
{|border="0" align="right"
+
== Introduction ==
|-
+
Traffic accounting in OpenVZ can be done through data collection against
|__TOC__
+
<code>/proc/net/dev</code> in the individual containers on a [[HN]].
|}
 
  
=Introduction=
+
== Prerequisites ==
Traffic accounting in OpenVZ can be done through data collection against /proc/net/dev in the individual VEs on a HN.
+
* OpenVZ
 +
* RRDTool
 +
* GNU AWK
  
=Prerequisites=
+
== Script ==
  * OpenVZ
+
First create a directory to store your RRD files:
  * RRDTool
+
 
  * Gnu AWK
+
  # mkdir /var/lib/rrd/
 +
 
 +
Then install this script:
 +
 
 +
<source lang="bash">
 +
#!/bin/sh
 +
# Script Name: vz_direct_traffic_log
 +
# Author:      "Brian Harrington, Alticon Inc" <bharrington@alticon.net>
 +
# Website:      htty://www.alticon.net
 +
# Editor:      "Denis Titov, ISP Okeanika" <denis@okeanika.net.ua>
 +
 
 +
# Time to do the data collection.
 +
for veid in $(/usr/sbin/vzlist -o veid -H)
 +
do     
 +
        RRDFILE="/var/lib/rrd/$veid.rrd"
 +
        if ! test -e $RRDFILE; then
 +
                echo $RRDFILE does not exist, creating.
 +
 
 +
                # Place your preferred RRD Creation command here
 +
                # or use this one, following command will create new RRD file with 300 sec step (for 5 min cron)
 +
                /usr/bin/rrdtool create $RRDFILE --step 300 \
 +
                        DS:IN:COUNTER:1000:0:U \
 +
                        DS:OUT:COUNTER:1000:0:U \
 +
                        RRA:AVERAGE:0.5:1:600000 \
 +
                        RRA:AVERAGE:0.5:100:60000 \
 +
                        RRA:AVERAGE:0.5:1000:6000
 +
        fi
 +
        # Parse out the inbound/outbound traffic and assign them to the corresponding variables   
 +
        eval `/usr/sbin/vzctl exec $veid "grep venet0 /proc/net/dev" |  \
 +
                awk -F: '{print $2}' | awk '{printf"CTIN=%s\nCTOUT=%s\n", $1, $9}'`
  
 +
        # Send the data to the corresponding RRD time with (N)now as the update time
 +
        /usr/bin/rrdtool update $RRDFILE N:$CTIN:$CTOUT
 +
done
 +
</source>
  
=Script=
 
First create a directory to store your RRD files:
 
  
<code>
+
the following script uses previously generated RRDs, you'll get nice PNG pictures and index.html file with them:
# mkdir /var/lib/rrd/
+
 
</code>
+
<source lang="bash">
 +
#!/bin/sh
 +
# Script Name:  vz_direct_traffic_render
 +
# Author:      "Denis Titov, ISP Okeanika" <denis@okeanika.net.ua>
 +
# Website:      http://www.okeanika.net.ua
  
The install this script:
+
rrd_path=/var/lib/rrd
 +
www_path=/var/www/html/traf
  
<code>
+
# Clear out the old index, otherwise you end up with a repeating index. This would also be a good place to put a header.
#!/bin/sh
+
rm ${www_path}/index.html
# Script Name:  vz_direct_traffic_log
 
# Author:      "Brian Harrington, Alticon Inc" <bharrington@alticon.net>
 
# Website:      htty://www.alticon.net
 
 
# Time to do the data collection.
 
for veid in `/usr/sbin/vzlist -o veid | grep -v VEID | sed 's/ //g'`; do
 
 
 
                RRDFILE="/var/lib/rrd/$veid.rrd"
 
 
 
                if ! test -e $RRDFILE; then
 
                        echo $RRDFILE does not exist, creating.
 
                        # Place your preferred RRD Creation command here
 
                fi
 
 
 
                # Parse out the inbound/outbound traffic and assign them to the corresponding variables
 
                eval `/usr/sbin/vzctl exec $veid "grep venet0 /proc/net/dev"  |  \
 
                        awk -F: '{print $2}' | awk '{printf"VEIN=%-15d\nVEOUT=%-15d\n", $1, $9}'`
 
 
 
                #Send the data to the corresponding RRD time with (N)now as the update time
 
                /usr/bin/rrdtool update $RRDFILE N:$VEIN:$VEOUT
 
done
 
</code>
 
  
 +
cd $rrd_path
 +
for RRD in *.rrd
 +
do
 +
        CTID=$(echo $RRD | sed 's/.rrd$//')
  
=Setup=
+
        # list of intervals, 1d = last day, 1w = last week and so on
Add this to cron to run every 5 minutes:
+
        for INT in 1h 1d 1w 1m 1y
 +
        do
 +
                /usr/bin/rrdtool graph ${www_path}/${CTID}-${INT}.png \
 +
                        --start now-$INT --end now \
 +
                        -w 1000 -h 500 \
 +
                        --title "CTID $CTID - Interval $INT" \
 +
                        DEF:in=$RRD:IN:AVERAGE AREA:in#aea:'IN' LINE1:in#0e0 \
 +
                        DEF:out=$RRD:OUT:AVERAGE AREA:out#eaa:'OUT' LINE1:out#e00
 +
                echo "<p><img src=\"${CTID}-${INT}.png\"><br/><br/></p>" >> ${www_path}/index.html
 +
        done
 +
done
 +
</source>
  
<code>
+
== Setup ==
# cat "*/5 * * * * root /path/to/script/vz_direct_traffic_log " > /etc/crontab && /etc/init.d/crontab restart
+
Add this to cron to run <code>vz_direct_traffic_log</code> every 5 minutes and <code>vz_direct_traffic_render</code> every 30 minutes:
</code>
 
  
 +
# cat << EOF >> /etc/crontab
 +
*/5 * * * * root /path/to/script/vz_direct_traffic_log
 +
*/30 * * * * root /path/to/script/vz_direct_traffic_render
 +
EOF
  
 
To check the output of this later run:
 
To check the output of this later run:
Line 62: Line 95:
 
  # rrdtool fetch /var/lib/rrd/<veid>.rrd AVERAGE -s -3600
 
  # rrdtool fetch /var/lib/rrd/<veid>.rrd AVERAGE -s -3600
  
__NOEDITSECTION__
+
== See also ==
 +
 
 +
* [[Traffic accounting with iptables]]
 +
* [[Monitoring bandwidth of containers]]
 +
 
 +
[[Category: Monitoring]]
 +
[[Category: Networking]]

Latest revision as of 21:46, 12 January 2013

Traffic Accounting through /proc/net/dev

Introduction[edit]

Traffic accounting in OpenVZ can be done through data collection against /proc/net/dev in the individual containers on a HN.

Prerequisites[edit]

  • OpenVZ
  • RRDTool
  • GNU AWK

Script[edit]

First create a directory to store your RRD files:

# mkdir /var/lib/rrd/

Then install this script:

#!/bin/sh
# Script Name:  vz_direct_traffic_log
# Author:       "Brian Harrington, Alticon Inc" <bharrington@alticon.net>
# Website:      htty://www.alticon.net
# Editor:       "Denis Titov, ISP Okeanika" <denis@okeanika.net.ua>

# Time to do the data collection.
for veid in $(/usr/sbin/vzlist -o veid -H)
do      
        RRDFILE="/var/lib/rrd/$veid.rrd"
        if ! test -e $RRDFILE; then
                echo $RRDFILE does not exist, creating.

                # Place your preferred RRD Creation command here
                # or use this one, following command will create new RRD file with 300 sec step (for 5 min cron)
                /usr/bin/rrdtool create $RRDFILE --step 300 \
                        DS:IN:COUNTER:1000:0:U \
                        DS:OUT:COUNTER:1000:0:U \
                        RRA:AVERAGE:0.5:1:600000 \
                        RRA:AVERAGE:0.5:100:60000 \
                        RRA:AVERAGE:0.5:1000:6000
        fi
        # Parse out the inbound/outbound traffic and assign them to the corresponding variables     
        eval `/usr/sbin/vzctl exec $veid "grep venet0 /proc/net/dev"  |  \
                awk -F: '{print $2}' | awk '{printf"CTIN=%s\nCTOUT=%s\n", $1, $9}'`

        # Send the data to the corresponding RRD time with (N)now as the update time
        /usr/bin/rrdtool update $RRDFILE N:$CTIN:$CTOUT
done


the following script uses previously generated RRDs, you'll get nice PNG pictures and index.html file with them:

#!/bin/sh
# Script Name:  vz_direct_traffic_render
# Author:       "Denis Titov, ISP Okeanika" <denis@okeanika.net.ua>
# Website:      http://www.okeanika.net.ua

rrd_path=/var/lib/rrd
www_path=/var/www/html/traf

# Clear out the old index, otherwise you end up with a repeating index. This would also be a good place to put a header.
rm ${www_path}/index.html

cd $rrd_path
for RRD in *.rrd
do
        CTID=$(echo $RRD | sed 's/.rrd$//')

        # list of intervals, 1d = last day, 1w = last week and so on
        for INT in 1h 1d 1w 1m 1y
        do
                /usr/bin/rrdtool graph ${www_path}/${CTID}-${INT}.png \
                        --start now-$INT --end now \
                        -w 1000 -h 500 \
                        --title "CTID $CTID - Interval $INT" \
                        DEF:in=$RRD:IN:AVERAGE AREA:in#aea:'IN' LINE1:in#0e0 \
                        DEF:out=$RRD:OUT:AVERAGE AREA:out#eaa:'OUT' LINE1:out#e00
                echo "<p><img src=\"${CTID}-${INT}.png\"><br/><br/></p>" >> ${www_path}/index.html
        done
done

Setup[edit]

Add this to cron to run vz_direct_traffic_log every 5 minutes and vz_direct_traffic_render every 30 minutes:

# cat << EOF >> /etc/crontab
*/5 * * * * root /path/to/script/vz_direct_traffic_log
*/30 * * * * root /path/to/script/vz_direct_traffic_render
EOF

To check the output of this later run:

# rrdtool fetch /var/lib/rrd/<veid>.rrd AVERAGE -s -3600

See also[edit]