sysmon: Report network addresses as metrics

BUG=chromium:757494
TEST=unittests, manually run sysmon to verify metrics

Change-Id: I7f5f0fe7170ce178bfd746ce54af266de28ce1ad
Reviewed-on: https://chromium-review.googlesource.com/624461
Commit-Ready: Prathmesh Prabhu <pprabhu@chromium.org>
Tested-by: Prathmesh Prabhu <pprabhu@chromium.org>
Reviewed-by: Prathmesh Prabhu <pprabhu@chromium.org>
Reviewed-by: Allen Li <ayatane@chromium.org>
diff --git a/scripts/sysmon/net_metrics.py b/scripts/sysmon/net_metrics.py
index 5aba0f1..e576877 100644
--- a/scripts/sysmon/net_metrics.py
+++ b/scripts/sysmon/net_metrics.py
@@ -51,6 +51,7 @@
   _collect_net_io_duplex_counters()
   _collect_net_if_stats()
   _collect_fqdn()
+  _collect_net_if_addrs()
 
 
 # Network IO metrics to collect
@@ -117,6 +118,29 @@
       metric.set(getattr(stats, counter_name), fields=fields)
 
 
+_net_if_addrs_metrics = metrics.StringMetric(
+    'dev/net/address',
+    description='Network address of physical network interfaces.')
+_family_field_strings = {
+    psutil.AF_LINK: 'AF_LINK',
+    socket.AF_INET: 'AF_INET',
+    socket.AF_INET6: 'AF_INET6',
+}
+
+
+def _collect_net_if_addrs():
+  """Collects network addresses as metrics."""
+  for nic, addresses in psutil.net_if_addrs().iteritems():
+    if _is_virtual_netif(nic):
+      continue
+    for address in addresses:
+      fields = {
+          'interface': nic,
+          'family': _family_field_strings.get(address.family, 'UNKNOWN'),
+      }
+      _net_if_addrs_metrics.set(address.address, fields)
+
+
 def _is_virtual_netif(nic):
   """Return whether the network interface is virtual."""
   # TODO(ayatane): Use a different way of identifying virtual interfaces