55import gc as gc_
66import sys
77import instana .agent_const as a
8+ import copy
89
910
1011class Snapshot (object ):
@@ -63,6 +64,17 @@ class Metrics(object):
6364 def __init__ (self , ** kwds ):
6465 self .__dict__ .update (kwds )
6566
67+ def delta_data (self , delta ):
68+ data = self .__dict__
69+ if delta is None :
70+ return data
71+
72+ unchanged_items = set (data .items ()) & set (delta .items ())
73+ for x in unchanged_items :
74+ data .pop (x [0 ])
75+
76+ return data
77+
6678
6779class EntityData (object ):
6880 pid = 0
@@ -80,6 +92,7 @@ class Meter(object):
8092 last_usage = None
8193 last_collect = None
8294 timer = None
95+ last_metrics = None
8396
8497 def __init__ (self , sensor ):
8598 self .sensor = sensor
@@ -95,17 +108,18 @@ def process(self):
95108 if self .sensor .agent .can_send ():
96109 self .snapshot_countdown = self .snapshot_countdown - 1
97110 s = None
111+ cm = self .collect_metrics ()
98112 if self .snapshot_countdown == 0 :
99113 self .snapshot_countdown = self .SNAPSHOT_PERIOD
100114 s = self .collect_snapshot ()
101-
102- m = self . collect_metrics ()
103- d = EntityData ( pid = os . getpid (), snapshot = s , metrics = m )
104-
105- t . Thread ( target = self . sensor . agent . request ,
106- args = ( self .sensor .agent .make_url ( a . AGENT_DATA_URL ),
107- "POST" , d ),
108- name = "Metrics POST" ). start ()
115+ md = cm . delta_data ( None )
116+ else :
117+ md = copy . deepcopy ( cm ). delta_data ( self . last_metrics )
118+
119+ d = EntityData ( pid = os . getpid (), snapshot = s , metrics = md )
120+ self .sensor .agent .request (
121+ self . sensor . agent . make_url ( a . AGENT_DATA_URL ), "POST" , d )
122+ self . last_metrics = cm . __dict__
109123
110124 self .tick ()
111125
0 commit comments