def network(meta): """ network """ # collect info for all hte alive interfaces for interface in alive_interfaces(): addresses = netifaces.ifaddresses(interface) interface_info = { 'name': interface } # collect ipv4 and ipv6 addresses for proto, key in { 'ipv4': netifaces.AF_INET, 'ipv6': netifaces.AF_INET6 }.iteritems(): # get the first address protocol_data = addresses.get(key, [{}])[0] if protocol_data: addr = protocol_data.get('addr').split('%').pop(0) netmask = protocol_data.get('netmask') try: prefixlen = netaddr.IPNetwork('%s/%s' % (addr, netmask)).prefixlen except: prefixlen = None interface_info[proto] = { 'netmask': netmask, 'address': addr, 'prefixlen': prefixlen } # collect mac address interface_info['mac'] = addresses.get(netifaces.AF_LINK, [{}])[0].get('addr') meta['network']['interfaces'].append(interface_info) # get default interface name netstat_out, _ = subp.call("netstat -nr | egrep -i '^0.0.0.0|default'", check=False) if len(netstat_out) and netstat_out[0]: first_matched_line = netstat_out[0] default_interface = first_matched_line.split(' ')[-1] elif len(meta['network']['interfaces']): default_interface = meta['network']['interfaces'][0]['name'] else: default_interface = None meta['network']['default'] = default_interface
def net_io_counters(self): """ net io counters total counters do not include lo interface """ totals = defaultdict(int) metrics = { 'packets_sent': 'system.net.packets_out.count', 'packets_recv': 'system.net.packets_in.count', 'bytes_sent': 'system.net.bytes_sent', 'bytes_recv': 'system.net.bytes_rcvd', 'errin': 'system.net.packets_in.error', 'errout': 'system.net.packets_out.error', 'dropin': 'system.net.drops_in.count', 'dropout': 'system.net.drops_out.count' } net_io_counters = psutil.net_io_counters(pernic=True) for interface in host.alive_interfaces(): io = net_io_counters.get(interface) for method, metric in metrics.iteritems(): new_stamp, new_value = time.time(), getattr(io, method) prev_stamp, prev_value = self.previous_values.get(interface, {}).get(metric, [None, None]) if prev_stamp: delta_value = new_value - prev_value metric_full_name = '%s|%s' % (metric, interface) self.statsd.incr(metric_full_name, delta_value) # collect total values if not interface.startswith('lo'): totals[metric] += delta_value self.previous_values[interface][metric] = [new_stamp, new_value] # send total values for metric, value in totals.iteritems(): self.statsd.incr(metric, value)