root / plugins / lxc / lxc_net @ 17f78427
Historique | Voir | Annoter | Télécharger (3,57 ko)
| 1 |
#!/bin/sh |
|---|---|
| 2 |
|
| 3 |
: << =cut |
| 4 |
|
| 5 |
=head1 NAME |
| 6 |
|
| 7 |
lxc_net - Munin plugin to graph traffic of active LXC containers. |
| 8 |
|
| 9 |
=head1 APPLICABLE SYSTEMS |
| 10 |
|
| 11 |
LXC container with "lxc.network.type=veth" and "lxc.network.veth.pair" settings. |
| 12 |
|
| 13 |
=head1 CONFIGURATION |
| 14 |
|
| 15 |
env.lxcpath - Set the path where LXC containers are stored, default: /var/lib/lxc |
| 16 |
env.exclude - Removing containers from graphs, default: empty |
| 17 |
|
| 18 |
[lxc_net] |
| 19 |
env.lxcpath /var/lib/lxc |
| 20 |
env.exclude container1 container2 |
| 21 |
|
| 22 |
=head1 INTERPRETATION |
| 23 |
|
| 24 |
This plugin reads a "lxc.network.veth.pair" setting from "config" file of each container, |
| 25 |
because lxc-start command creates a random named veth device without the setting. |
| 26 |
|
| 27 |
If your xen config (/var/lib/lxc/GUEST_NAME/config does not contain this parameter, |
| 28 |
then you have to fill it, because if every guest restart generate new device name, then the graph will be useless |
| 29 |
( example config : lxc.network.veth.pair = vethsamba ) |
| 30 |
|
| 31 |
=head1 AUTHOR |
| 32 |
|
| 33 |
mitty mitty@mitty.jp |
| 34 |
|
| 35 |
=head1 LICENSE |
| 36 |
|
| 37 |
2-clause BSD License |
| 38 |
|
| 39 |
=head1 MAGIC MARKERS |
| 40 |
|
| 41 |
#%# familiy=auto |
| 42 |
#%# capabilities=autoconf |
| 43 |
|
| 44 |
=cut |
| 45 |
|
| 46 |
. $MUNIN_LIBDIR/plugins/plugin.sh |
| 47 |
|
| 48 |
lxcpath=${lxcpath:-/var/lib/lxc}
|
| 49 |
|
| 50 |
if [ "$1" = "autoconf" ]; then |
| 51 |
if [ ! -r /proc/net/dev ]; then |
| 52 |
echo "no (/proc/net/dev cannot be read)" |
| 53 |
exit 0 |
| 54 |
fi |
| 55 |
if [ ! -e "$lxcpath" ]; then |
| 56 |
echo "no ($lxcdir is not present)" |
| 57 |
exit 0 |
| 58 |
fi |
| 59 |
|
| 60 |
echo yes |
| 61 |
fi |
| 62 |
|
| 63 |
actives="" |
| 64 |
for guest in `ls $lxcpath`; do |
| 65 |
if [ `echo $exclude | grep -c "\b$guest\b"` -eq 1 ]; then |
| 66 |
continue; |
| 67 |
fi |
| 68 |
if [ -f "$lxcpath/$guest/config" ]; then |
| 69 |
devices=`grep '^lxc\.network\.veth\.pair[ \t]*=[ \t]*' $lxcpath/$guest/config | \ |
| 70 |
awk '{ split($0, a, /=/); gsub(/[ \t]/, "", a[2]); print a[2]; }'`
|
| 71 |
if [ -n "$devices" ]; then |
| 72 |
for device in $devices; do |
| 73 |
device_re=`echo $device | sed -e 's/\./\\\\./g'` |
| 74 |
if [ `grep -c "^ *$device_re:" /proc/net/dev` -eq 1 ]; then |
| 75 |
actives="$actives $guest" |
| 76 |
eval "dev_$(clean_fieldname $guest)=$device" |
| 77 |
fi |
| 78 |
done |
| 79 |
fi |
| 80 |
fi |
| 81 |
done |
| 82 |
|
| 83 |
if [ "$1" = "config" ]; then |
| 84 |
echo "graph_title Network traffic" |
| 85 |
echo "graph_args --base 1000" |
| 86 |
echo "graph_vlabel bits in (-) / out (+) per ${graph_period}"
|
| 87 |
echo "graph_category network" |
| 88 |
echo "graph_info This graph shows the traffic of active LXC containers." |
| 89 |
|
| 90 |
for guestname in $actives; do |
| 91 |
guest=$(clean_fieldname $guestname) |
| 92 |
device=$(eval 'echo $dev_'$guest) |
| 93 |
bps="U" |
| 94 |
if [ -r /sys/class/net/$device/speed ]; then |
| 95 |
bps=$(cat /sys/class/net/$device/speed) |
| 96 |
bps=$(($bps * 1000 * 1000)) |
| 97 |
fi |
| 98 |
|
| 99 |
echo "${guest}_down.label $guestname"
|
| 100 |
echo "${guest}_down.type DERIVE"
|
| 101 |
echo "${guest}_down.graph no"
|
| 102 |
echo "${guest}_down.cdef ${guest}_down,8,*"
|
| 103 |
echo "${guest}_down.min 0"
|
| 104 |
echo "${guest}_down.max $bps"
|
| 105 |
echo "${guest}_up.label $guestname"
|
| 106 |
echo "${guest}_up.type DERIVE"
|
| 107 |
echo "${guest}_up.negative ${guest}_down"
|
| 108 |
echo "${guest}_up.cdef ${guest}_up,8,*"
|
| 109 |
echo "${guest}_up.min 0"
|
| 110 |
echo "${guest}_up.max $bps"
|
| 111 |
done |
| 112 |
exit 0 |
| 113 |
fi |
| 114 |
|
| 115 |
|
| 116 |
for guest in $actives; do |
| 117 |
guest=$(clean_fieldname $guest) |
| 118 |
device=$(eval 'echo $dev_'$guest) |
| 119 |
device_re=`echo $device | sed -e 's/\./\\\\./g'` |
| 120 |
line=`grep "^ *$device_re:" /proc/net/dev` |
| 121 |
echo -n "${guest}_down.value "
|
| 122 |
echo $line | awk '{
|
| 123 |
split($0, a, /: */); |
| 124 |
print $2; |
| 125 |
}' |
| 126 |
echo -n "${guest}_up.value "
|
| 127 |
echo $line | awk '{
|
| 128 |
split($0, a, /: */); |
| 129 |
print $10; |
| 130 |
}' |
| 131 |
done |
