Browse Source

BaseStorage: send per-node client delta as metric

needed by thardes2 in his master thesis
Helge Jung 8 years ago
parent
commit
42c186013f
1 changed files with 15 additions and 0 deletions
  1. 15 0
      ffstatus/basestorage.py

+ 15 - 0
ffstatus/basestorage.py

@@ -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)