|
@@ -145,6 +145,7 @@ class BaseStorage(object):
|
|
|
def merge_new_data(self, newdata):
|
|
|
"""Updates data in the storage by merging the new data."""
|
|
|
|
|
|
+ ts = time.time()
|
|
|
if newdata is None or not isinstance(newdata, dict):
|
|
|
raise ValueError("Expected a dict as new data.")
|
|
|
|
|
@@ -158,6 +159,7 @@ class BaseStorage(object):
|
|
|
|
|
|
current[item_id] = ffstatus.dict_merge(node, {})
|
|
|
current[item_id]['aliases'] = []
|
|
|
+ current[item_id]['clients.bak'] = current[item_id]['clients']
|
|
|
current[item_id]['clients'] = []
|
|
|
current[item_id]['neighbours'] = {}
|
|
|
current[item_id]['type'] = 'node'
|
|
@@ -259,6 +261,19 @@ class BaseStorage(object):
|
|
|
# set clientcount
|
|
|
item['clientcount'] = len(clients)
|
|
|
|
|
|
+ # compute client delta
|
|
|
+ prev_clients = item.get('clients.bak', [])
|
|
|
+ new_clients = item.get('clients', [])
|
|
|
+ if 'clients.bak' in item:
|
|
|
+ del(item['clients.bak'])
|
|
|
+
|
|
|
+ diff_added = [x for x in new_clients if x not in prev_clients]
|
|
|
+ diff_removed = [x for x in prev_clients if x not in new_clients]
|
|
|
+ self.__send_metric("nodes." + itemid + ".clients_added",
|
|
|
+ len(diff_added), ts)
|
|
|
+ self.__send_metric("nodes." + itemid + ".clients_removed",
|
|
|
+ len(diff_removed), ts)
|
|
|
+
|
|
|
# finally, set each new data
|
|
|
self.set_node_data(itemid, item)
|
|
|
|