a lot of changes
diff --git a/wally/sensors/grafana.py b/wally/sensors/grafana.py
deleted file mode 100644
index 9823fac..0000000
--- a/wally/sensors/grafana.py
+++ /dev/null
@@ -1,47 +0,0 @@
-import json
-
-
-query = """
-select value from "{series}"
-where $timeFilter and
-host='{host}' and device='{device}'
-order asc
-"""
-
-
-def make_dashboard_file(config):
-    series = ['writes_completed', 'sectors_written']
-    dashboards = []
-
-    for serie in series:
-        dashboard = dict(title=serie, type='graph',
-                         span=12, fill=1, linewidth=2,
-                         tooltip={'shared': True})
-
-        targets = []
-
-        for ip, devs in config.items():
-            for device in devs:
-                params = {
-                    'series': serie,
-                    'host': ip,
-                    'device': device
-                }
-
-                target = dict(
-                    target="disk io",
-                    query=query.replace("\n", " ").format(**params).strip(),
-                    interval="",
-                    alias="{0} io {1}".format(ip, device),
-                    rawQuery=True
-                )
-                targets.append(target)
-
-        dashboard['targets'] = targets
-        dashboards.append(dashboard)
-
-    fc = open("grafana_template.js").read()
-    return fc % (json.dumps(dashboards),)
-
-
-print make_dashboard_file({'192.168.0.104': ['sda1', 'rbd1']})
diff --git a/wally/sensors/main.py b/wally/sensors/main.py
index 55a9584..2d0bc81 100644
--- a/wally/sensors/main.py
+++ b/wally/sensors/main.py
@@ -56,6 +56,7 @@
     prev = {}
     next_data_record_time = time.time()
 
+    first_round = True
     while True:
         real_time = int(time.time())
 
@@ -84,8 +85,12 @@
         if source_id is not None:
             curr['source_id'] = source_id
 
-        print report_time, int((report_time - time.time()) * 10) * 0.1
-        sender.send(curr)
+        # on first round not all fields was ready
+        # this leads to setting wrong headers list
+        if not first_round:
+            sender.send(curr)
+        else:
+            first_round = False
 
         next_data_record_time = report_time + opts.timeout + 0.5
         time.sleep(next_data_record_time - time.time())
diff --git a/wally/sensors/protocol.py b/wally/sensors/protocol.py
index fad7e00..67aef2a 100644
--- a/wally/sensors/protocol.py
+++ b/wally/sensors/protocol.py
@@ -62,6 +62,8 @@
 
             result = (self.HEADERS + source_id +
                       self.END_OF_SOURCE_ID +
+                      socket.gethostname() +
+                      self.END_OF_SOURCE_ID +
                       flen + forder + self.END_OF_HEADERS)
 
             if self.headers_send_cycles_left > 0:
@@ -85,13 +87,14 @@
     def __init__(self):
         self.fields = {}
         self.formats = {}
+        self.hostnames = {}
 
     def unpack(self, data):
         code = data[0]
-        source_id, _, packed_data = data[1:].partition(
-            StructSerializerSend.END_OF_SOURCE_ID)
 
         if code == StructSerializerSend.HEADERS:
+            source_id, hostname, packed_data = data[1:].split(
+                StructSerializerSend.END_OF_SOURCE_ID, 2)
             # fields order provided
             flen_sz = struct.calcsize("!H")
             flen = struct.unpack("!H", packed_data[:flen_sz])[0]
@@ -111,11 +114,14 @@
             else:
                 self.fields[source_id] = ['time'] + forder
                 self.formats[source_id] = "!I" + "I" * flen
+                self.hostnames[source_id] = hostname
 
             if len(rest) != 0:
                 return self.unpack(rest)
             return None
         else:
+            source_id, packed_data = data[1:].split(
+                StructSerializerSend.END_OF_SOURCE_ID, 1)
             assert code == StructSerializerSend.DATA,\
                 "Unknown code {0!r}".format(code)
 
@@ -133,6 +139,7 @@
             vals = struct.unpack(s_format, packed_data)
             res = dict(zip(fields, vals))
             res['source_id'] = source_id
+            res['hostname'] = self.hostnames[source_id]
             return res
 
 
diff --git a/wally/sensors/receiver.py b/wally/sensors/receiver.py
deleted file mode 100644
index ff0f223..0000000
--- a/wally/sensors/receiver.py
+++ /dev/null
@@ -1,19 +0,0 @@
-from .api import start_monitoring, Empty
-# from influx_exporter import connect, add_data
-
-uri = "udp://192.168.0.104:12001"
-# infldb_url = "influxdb://perf:perf@192.168.152.42:8086/perf"
-# conn = connect(infldb_url)
-
-monitor_config = {'127.0.0.1':
-                  {"block-io": {'allowed_prefixes': ['sda1', 'rbd1']},
-                   "net-io": {"allowed_prefixes": ["virbr2"]}}}
-
-with start_monitoring(uri, monitor_config) as queue:
-    while True:
-        try:
-            (ip, port), data = queue.get(True, 1)
-            print (ip, port), data
-            # add_data(conn, ip, [data])
-        except Empty:
-            pass
diff --git a/wally/sensors/sensors/io_sensors.py b/wally/sensors/sensors/io_sensors.py
index c9ff340..e4049a9 100644
--- a/wally/sensors/sensors/io_sensors.py
+++ b/wally/sensors/sensors/io_sensors.py
@@ -38,6 +38,8 @@
         dev_ok = is_dev_accepted(dev_name,
                                  disallowed_prefixes,
                                  allowed_prefixes)
+        if dev_name[-1].isdigit():
+            dev_ok = False
 
         if dev_ok:
             for pos, name, accum_val in io_values_pos:
diff --git a/wally/sensors/sensors/net_sensors.py b/wally/sensors/sensors/net_sensors.py
index 4a4e477..2723499 100644
--- a/wally/sensors/sensors/net_sensors.py
+++ b/wally/sensors/sensors/net_sensors.py
@@ -25,7 +25,7 @@
 
 
 @provides("net-io")
-def net_stat(disallowed_prefixes=('docker',), allowed_prefixes=None):
+def net_stat(disallowed_prefixes=('docker', 'lo'), allowed_prefixes=('eth',)):
     results = {}
 
     for line in open('/proc/net/dev').readlines()[2:]:
@@ -36,6 +36,10 @@
         dev_ok = is_dev_accepted(dev_name,
                                  disallowed_prefixes,
                                  allowed_prefixes)
+
+        if '.' in dev_name and dev_name.split('.')[-1].isdigit():
+            dev_ok = False
+
         if dev_ok:
             for pos, name, accum_val in net_values_pos:
                 sensor_name = "{0}.{1}".format(dev_name, name)
diff --git a/wally/sensors/sensors/psram_sensors.py b/wally/sensors/sensors/psram_sensors.py
index 7e4f8b9..faac87d 100644
--- a/wally/sensors/sensors/psram_sensors.py
+++ b/wally/sensors/sensors/psram_sensors.py
@@ -46,7 +46,6 @@
 def psram_stat(disallowed_prefixes=None, allowed_prefixes=None):
     results = {}
     pid_list = get_pid_list(disallowed_prefixes, allowed_prefixes)
-    print pid_list
     for pid in pid_list:
         try:
             dev_name = get_pid_name(pid)
diff --git a/wally/sensors/sensors/syscpu_sensors.py b/wally/sensors/sensors/syscpu_sensors.py
index 3324f67..3f6cf44 100644
--- a/wally/sensors/sensors/syscpu_sensors.py
+++ b/wally/sensors/sensors/syscpu_sensors.py
@@ -1,5 +1,5 @@
+from .utils import SensorInfo
 from ..discover import provides
-from .utils import SensorInfo, is_dev_accepted
 
 # 0 - cpu name
 # 1 - user: normal processes executing in user mode
@@ -17,32 +17,27 @@
     (4, 'idle_time', True),
 ]
 
-# extended values, on 1 pos in line
-cpu_extvalues = ['procs_blocked']
-
 
 @provides("system-cpu")
-def syscpu_stat(disallowed_prefixes=('intr', 'ctxt', 'btime', 'processes',
-                                 'procs_running', 'softirq'),
-            allowed_prefixes=None):
+def syscpu_stat(disallowed_prefixes=None, allowed_prefixes=None):
     results = {}
 
+    # calculate core count
+    core_count = 0
+
     for line in open('/proc/stat'):
         vals = line.split()
         dev_name = vals[0]
 
-        dev_ok = is_dev_accepted(dev_name,
-                                 disallowed_prefixes,
-                                 allowed_prefixes)
+        if dev_name == 'cpu':
+            for pos, name, accum_val in io_values_pos:
+                sensor_name = "{0}.{1}".format(dev_name, name)
+                results[sensor_name] = SensorInfo(int(vals[pos]),
+                                                  accum_val)
+        elif dev_name == 'procs_blocked':
+            val = int(vals[1]) // core_count
+            results["cpu.procs_blocked"] = SensorInfo(val, False)
+        elif dev_name.startswith('cpu'):
+            core_count += 1
 
-        if dev_ok:
-            if dev_name in cpu_extvalues:
-                # for single values
-                sensor_name = "cpu.{0}".format(dev_name)
-                results[sensor_name] = SensorInfo(int(vals[1]), False)
-            else:
-                for pos, name, accum_val in io_values_pos:
-                    sensor_name = "{0}.{1}".format(dev_name, name)
-                    results[sensor_name] = SensorInfo(int(vals[pos]), accum_val)
     return results
-
diff --git a/wally/sensors/sensors/sysram_sensors.py b/wally/sensors/sensors/sysram_sensors.py
index 8df7acc..2eacf44 100644
--- a/wally/sensors/sensors/sysram_sensors.py
+++ b/wally/sensors/sensors/sysram_sensors.py
@@ -39,5 +39,3 @@
         usage = used / results['ram.MemTotal'].value
         results["ram.usage_percent"] = SensorInfo(usage, False)
     return results
-
-print sysram_stat()