Skip to content

Commit ec30f63

Browse files
authored
Merge pull request #6 from instana/fix_snapshots
Fix Snapshot JSON encoding
2 parents 40e6636 + 50ab590 commit ec30f63

File tree

6 files changed

+62
-19
lines changed

6 files changed

+62
-19
lines changed

instana/agent.py

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -44,8 +44,11 @@ def __init__(self, sensor):
4444
self.reset()
4545

4646
def to_json(self, o):
47-
return json.dumps(o, default=lambda o: o.__dict__,
48-
sort_keys=False, separators=(',', ':')).encode()
47+
try:
48+
return json.dumps(o, default=lambda o: o.to_dict(),
49+
sort_keys=False, separators=(',', ':')).encode()
50+
except Exception as e:
51+
l.error("to_json: ", e, o)
4952

5053
def can_send(self):
5154
return self.fsm.fsm.current == "good2go"
@@ -77,7 +80,7 @@ def full_request_response(self, url, method, o, body, header):
7780
request = urllib2.Request(url, self.to_json(o))
7881
request.add_header("Content-Type", "application/json")
7982

80-
# print self.to_json(o)
83+
l.debug("request: ", method, self.to_json(o))
8184
response = urllib2.urlopen(request, timeout=2)
8285

8386
if not response:

instana/django.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,18 @@
11
from __future__ import print_function
22
import opentracing as ot
3-
from instana import tracer
3+
from instana import tracer, options
44
import opentracing.ext.tags as ext
55

6+
67
DJ_INSTANA_MIDDLEWARE = 'instana.django.InstanaMiddleware'
78

89

910
class InstanaMiddleware(object):
1011
""" Django Middleware to provide request tracing for Instana """
1112
def __init__(self, get_response):
1213
self.get_response = get_response
13-
ot.global_tracer = tracer.InstanaTracer()
14+
opts = options.Options(service="Django")
15+
ot.global_tracer = tracer.InstanaTracer(opts)
1416
self
1517

1618
def __call__(self, request):

instana/fsm.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,12 @@ class Discovery(object):
1515
def __init__(self, **kwds):
1616
self.__dict__.update(kwds)
1717

18+
def to_dict(self):
19+
kvs = dict()
20+
kvs['pid'] = self.pid
21+
kvs['name'] = self.name
22+
kvs['args'] = self.args
23+
return kvs
1824

1925
class Fsm(object):
2026
RETRY_PERIOD = 30

instana/log.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,10 @@ def init(level):
99
f = l.Formatter('%(asctime)s: %(levelname)s: %(name)s: %(message)s')
1010
ch.setFormatter(f)
1111
logger.addHandler(ch)
12-
logger.setLevel(level)
12+
if "INSTANA_DEV" in os.environ:
13+
logger.setLevel(l.DEBUG)
14+
else:
15+
logger.setLevel(level)
1316

1417

1518
def debug(s, *args):

instana/meter.py

Lines changed: 40 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@
77
import instana.agent_const as a
88
import copy
99
import time
10+
import json
11+
from types import ModuleType
1012

1113

1214
class Snapshot(object):
@@ -27,6 +29,13 @@ class Snapshot(object):
2729
def __init__(self, **kwds):
2830
self.__dict__.update(kwds)
2931

32+
def to_dict(self):
33+
kvs = dict()
34+
kvs['name'] = self.name
35+
kvs['version'] = self.version
36+
kvs['versions'] = self.versions
37+
return kvs
38+
3039

3140
class GC(object):
3241
collect0 = 0
@@ -39,6 +48,9 @@ class GC(object):
3948
def __init__(self, **kwds):
4049
self.__dict__.update(kwds)
4150

51+
def to_dict(self):
52+
return self.__dict__
53+
4254

4355
class Metrics(object):
4456
ru_utime = .0
@@ -76,6 +88,9 @@ def delta_data(self, delta):
7688

7789
return data
7890

91+
def to_dict(self):
92+
return self.__dict__
93+
7994

8095
class EntityData(object):
8196
pid = 0
@@ -85,10 +100,13 @@ class EntityData(object):
85100
def __init__(self, **kwds):
86101
self.__dict__.update(kwds)
87102

103+
def to_dict(self):
104+
return self.__dict__
105+
88106

89107
class Meter(object):
90108
SNAPSHOT_PERIOD = 600
91-
snapshot_countdown = 30
109+
snapshot_countdown = 25
92110
sensor = None
93111
last_usage = None
94112
last_collect = None
@@ -113,18 +131,20 @@ def collect_and_report(self):
113131
def process(self):
114132
if self.sensor.agent.can_send():
115133
self.snapshot_countdown = self.snapshot_countdown - 1
116-
s = None
134+
ss = None
117135
cm = self.collect_metrics()
136+
137+
l.debug("snapshot_countdown is:", str(self.snapshot_countdown))
118138
if self.snapshot_countdown == 0:
119139
self.snapshot_countdown = self.SNAPSHOT_PERIOD
120-
s = self.collect_snapshot()
121-
md = cm.delta_data(None)
140+
ss = self.collect_snapshot()
141+
md = copy.deepcopy(cm).delta_data(None)
122142
else:
123143
md = copy.deepcopy(cm).delta_data(self.last_metrics)
124144

125-
d = EntityData(pid=os.getpid(), snapshot=s, metrics=md)
126-
self.sensor.agent.request(
127-
self.sensor.agent.make_url(a.AGENT_DATA_URL), "POST", d)
145+
ed = EntityData(pid=os.getpid(), snapshot=ss, metrics=md)
146+
url = self.sensor.agent.make_url(a.AGENT_DATA_URL)
147+
self.sensor.agent.request(url, "POST", ed)
128148
self.last_metrics = cm.__dict__
129149

130150
def collect_snapshot(self):
@@ -150,10 +170,19 @@ def collect_snapshot(self):
150170

151171
return s
152172
except Exception as e:
153-
l.error(e)
173+
l.error("collect_snapshot: ", str(e))
154174

155175
return None
156176

177+
def jsonable(self, value):
178+
if callable(value):
179+
result = value()
180+
elif type(value) is ModuleType:
181+
result = str(value)
182+
else:
183+
result = value
184+
return result
185+
157186
def collect_modules(self):
158187
try:
159188
m = sys.modules
@@ -162,15 +191,15 @@ def collect_modules(self):
162191
if m[k]:
163192
d = m[k].__dict__
164193
if "version" in d and d["version"]:
165-
r[k] = d["version"]
194+
r[k] = self.jsonable(d["version"])
166195
elif "__version__" in d and d["__version__"]:
167-
r[k] = d["__version__"]
196+
r[k] = self.jsonable(d["__version__"])
168197
else:
169198
r[k] = "builtin"
170199

171200
return r
172201
except Exception as e:
173-
l.error(e)
202+
l.error("collect_modules: ", e)
174203

175204
return None
176205

instana/recorder.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ def run(self):
3636
def report_spans(self):
3737
""" Periodically report the queued spans """
3838
while 1:
39-
if self.sensor.agent.can_send() and self.queue.qsize:
39+
if self.sensor.agent.can_send() and self.queue.qsize() > 0:
4040
url = self.sensor.agent.make_url(a.AGENT_TRACES_URL)
4141
self.sensor.agent.request(url, "POST", self.queued_spans())
4242
time.sleep(1)
@@ -66,7 +66,7 @@ def record_span(self, span):
6666
Convert the passed BasicSpan into an InstanaSpan and
6767
add it to the span queue
6868
"""
69-
if self.sensor.agent.can_send() or os.environ["INSTANA_TEST"]:
69+
if self.sensor.agent.can_send() or "INSTANA_TEST" in os.environ:
7070
instana_span = None
7171

7272
if span.operation_name in self.registered_spans:

0 commit comments

Comments
 (0)