How can I see network traffic?

I found a not working kvm net munin plugin I fixed it for proxmox:
Code:
#!/usr/bin/python
# -*- coding: utf-8 -*-
# vim: set fileencoding=utf-8
#
# Munin plugin to show the network I/O per vm
#
# Copyright Maxence Dunnewind, Rodolphe Qui..deville
#
# License : GPLv3
#
# need to be run with root privilege to execute brctl
#
#
# parsed environment variables:
# vmsuffix: part of vm name to be removed
#
#%# capabilities=autoconf
#%# family=contrib


import re, os, sys
from subprocess import Popen, PIPE


def config(vm_names):
    ''' Print the plugin's config
    @param vm_names : a list of "cleaned" vms' name
    '''
    base_config = """graph_title KVM Network I/O
graph_vlabel Bytes rx(-)/tx(+) per second
graph_category KVM
graph_info This graph shows the network I/O of the virtual machines
graph_args --base 1024
    """
    print base_config
    for vm in vm_names:
        print "%s_in.label %s" % (vm, vm)
        print "%s_in.type COUNTER" % vm
        print "%s_in.min 0" % vm
        print "%s_in.draw LINE2" % vm
        print "%s_out.negative %s_in" % (vm, vm)
        print "%s_out.label %s" % (vm, vm)
        print "%s_out.type COUNTER" % vm
        print "%s_out.min 0" % vm
        print "%s_out.draw LINE2" % vm


def clean_vm_name(vm_name):
    ''' Replace all special chars
    @param vm_name : a vm's name
    @return cleaned vm's name
    '''
    # suffix part defined in conf
    suffix = os.getenv('vmsuffix')
    if suffix:
        vm_name = re.sub(suffix,'',vm_name)


    return re.sub(r"[^a-zA-Z0-9_]", "_", vm_name)

def fetch(vms):
    ''' Fetch values for a list of pids
    @param dictionnary {kvm_pid: cleaned vm name}
    '''
    res = {}
    for pid in vms:
        tap = get_vm_tap(pid)
        try:
                f = open("/proc/net/dev", "r")
                for line in f.readlines():
                    if tap in line:
                    line = line.split(':')[1]
                          print "%s_in.value %s" % (vms[pid], line.split()[0]).
                          print "%s_out.value %s" % (vms[pid], line.split()[8]).
                          break
                    else:
                          f.close()
        except:
            continue


def detect_kvm():
    ''' Check if kvm is installed
    '''
    kvm = Popen("which kvm", shell=True, stdout=PIPE)
    kvm.communicate()
    return not bool(kvm.returncode)


def find_vm_names(pids):
    '''Find and clean vm names from pids
    @return a dictionnary of {pids : cleaned vm name}
    '''
    result = {}
    for pid in pids:
        cmdline = open("/proc/%s/cmdline" % pid, "r")
        result[pid] = clean_vm_name(re.sub(r"^.*-name\x00([a-zA-Z0-9.-]*)\x00\-.*$"
    return result
def get_vm_tap(pid):
    cmdline = open("/proc/%s/cmdline" % pid, "r")
    tap = re.sub(r"^.*ifname=([^,]*),.*$",r"\1", cmdline.readline())
    return tap


def list_pids():
    ''' Find the pid of kvm processes
    @return a list of pids from running kvm
    '''
    pid = Popen("pidof kvm", shell=True, stdout=PIPE)
    return pid.communicate()[0].split()
if __name__ == "__main__":
    if len(sys.argv) > 1:
        if sys.argv[1] in ['autoconf', 'detect']:
            if detect_kvm():
                print "yes"
            else:
                print "no"
        elif sys.argv[1] == "config":
            config(find_vm_names(list_pids()).values())
        else:
            fetch(find_vm_names(list_pids()))
    else:
        fetch(find_vm_names(list_pids()))
 

About

The Proxmox community has been around for many years and offers help and support for Proxmox VE, Proxmox Backup Server, and Proxmox Mail Gateway.
We think our community is one of the best thanks to people like you!

Get your subscription!

The Proxmox team works very hard to make sure you are running the best software and getting stable updates and security enhancements, as well as quick enterprise support. Tens of thousands of happy customers have a Proxmox subscription. Get yours easily in our online shop.

Buy now!