diff --git a/instana/agent.py b/instana/agent.py index e96f725c..c4a6dfdc 100644 --- a/instana/agent.py +++ b/instana/agent.py @@ -44,8 +44,11 @@ def __init__(self, sensor): self.reset() def to_json(self, o): - return json.dumps(o, default=lambda o: o.__dict__, - sort_keys=False, separators=(',', ':')).encode() + try: + return json.dumps(o, default=lambda o: o.to_dict(), + sort_keys=False, separators=(',', ':')).encode() + except Exception as e: + l.error("to_json: ", e, o) def can_send(self): return self.fsm.fsm.current == "good2go" @@ -77,7 +80,7 @@ def full_request_response(self, url, method, o, body, header): request = urllib2.Request(url, self.to_json(o)) request.add_header("Content-Type", "application/json") - # print self.to_json(o) + l.debug("request: ", method, self.to_json(o)) response = urllib2.urlopen(request, timeout=2) if not response: diff --git a/instana/django.py b/instana/django.py index e6577dd3..6afeea54 100644 --- a/instana/django.py +++ b/instana/django.py @@ -1,8 +1,9 @@ from __future__ import print_function import opentracing as ot -from instana import tracer +from instana import tracer, options import opentracing.ext.tags as ext + DJ_INSTANA_MIDDLEWARE = 'instana.django.InstanaMiddleware' @@ -10,7 +11,8 @@ class InstanaMiddleware(object): """ Django Middleware to provide request tracing for Instana """ def __init__(self, get_response): self.get_response = get_response - ot.global_tracer = tracer.InstanaTracer() + opts = options.Options(service="Django") + ot.global_tracer = tracer.InstanaTracer(opts) self def __call__(self, request): diff --git a/instana/fsm.py b/instana/fsm.py index ad941375..db951a80 100644 --- a/instana/fsm.py +++ b/instana/fsm.py @@ -15,6 +15,12 @@ class Discovery(object): def __init__(self, **kwds): self.__dict__.update(kwds) + def to_dict(self): + kvs = dict() + kvs['pid'] = self.pid + kvs['name'] = self.name + kvs['args'] = self.args + return kvs class Fsm(object): RETRY_PERIOD = 30 diff --git a/instana/log.py b/instana/log.py index d16029f7..12c227d1 100644 --- a/instana/log.py +++ b/instana/log.py @@ -9,7 +9,10 @@ def init(level): f = l.Formatter('%(asctime)s: %(levelname)s: %(name)s: %(message)s') ch.setFormatter(f) logger.addHandler(ch) - logger.setLevel(level) + if "INSTANA_DEV" in os.environ: + logger.setLevel(l.DEBUG) + else: + logger.setLevel(level) def debug(s, *args): diff --git a/instana/meter.py b/instana/meter.py index 96d33f8a..db6dd60c 100644 --- a/instana/meter.py +++ b/instana/meter.py @@ -7,6 +7,8 @@ import instana.agent_const as a import copy import time +import json +from types import ModuleType class Snapshot(object): @@ -27,6 +29,13 @@ class Snapshot(object): def __init__(self, **kwds): self.__dict__.update(kwds) + def to_dict(self): + kvs = dict() + kvs['name'] = self.name + kvs['version'] = self.version + kvs['versions'] = self.versions + return kvs + class GC(object): collect0 = 0 @@ -39,6 +48,9 @@ class GC(object): def __init__(self, **kwds): self.__dict__.update(kwds) + def to_dict(self): + return self.__dict__ + class Metrics(object): ru_utime = .0 @@ -76,6 +88,9 @@ def delta_data(self, delta): return data + def to_dict(self): + return self.__dict__ + class EntityData(object): pid = 0 @@ -85,10 +100,13 @@ class EntityData(object): def __init__(self, **kwds): self.__dict__.update(kwds) + def to_dict(self): + return self.__dict__ + class Meter(object): SNAPSHOT_PERIOD = 600 - snapshot_countdown = 30 + snapshot_countdown = 25 sensor = None last_usage = None last_collect = None @@ -113,18 +131,20 @@ def collect_and_report(self): def process(self): if self.sensor.agent.can_send(): self.snapshot_countdown = self.snapshot_countdown - 1 - s = None + ss = None cm = self.collect_metrics() + + l.debug("snapshot_countdown is:", str(self.snapshot_countdown)) if self.snapshot_countdown == 0: self.snapshot_countdown = self.SNAPSHOT_PERIOD - s = self.collect_snapshot() - md = cm.delta_data(None) + ss = self.collect_snapshot() + md = copy.deepcopy(cm).delta_data(None) else: md = copy.deepcopy(cm).delta_data(self.last_metrics) - d = EntityData(pid=os.getpid(), snapshot=s, metrics=md) - self.sensor.agent.request( - self.sensor.agent.make_url(a.AGENT_DATA_URL), "POST", d) + ed = EntityData(pid=os.getpid(), snapshot=ss, metrics=md) + url = self.sensor.agent.make_url(a.AGENT_DATA_URL) + self.sensor.agent.request(url, "POST", ed) self.last_metrics = cm.__dict__ def collect_snapshot(self): @@ -150,10 +170,19 @@ def collect_snapshot(self): return s except Exception as e: - l.error(e) + l.error("collect_snapshot: ", str(e)) return None + def jsonable(self, value): + if callable(value): + result = value() + elif type(value) is ModuleType: + result = str(value) + else: + result = value + return result + def collect_modules(self): try: m = sys.modules @@ -162,15 +191,15 @@ def collect_modules(self): if m[k]: d = m[k].__dict__ if "version" in d and d["version"]: - r[k] = d["version"] + r[k] = self.jsonable(d["version"]) elif "__version__" in d and d["__version__"]: - r[k] = d["__version__"] + r[k] = self.jsonable(d["__version__"]) else: r[k] = "builtin" return r except Exception as e: - l.error(e) + l.error("collect_modules: ", e) return None diff --git a/instana/recorder.py b/instana/recorder.py index c9dcb8b9..8a7c4b2a 100644 --- a/instana/recorder.py +++ b/instana/recorder.py @@ -36,7 +36,7 @@ def run(self): def report_spans(self): """ Periodically report the queued spans """ while 1: - if self.sensor.agent.can_send() and self.queue.qsize: + if self.sensor.agent.can_send() and self.queue.qsize() > 0: url = self.sensor.agent.make_url(a.AGENT_TRACES_URL) self.sensor.agent.request(url, "POST", self.queued_spans()) time.sleep(1) @@ -66,7 +66,7 @@ def record_span(self, span): Convert the passed BasicSpan into an InstanaSpan and add it to the span queue """ - if self.sensor.agent.can_send() or os.environ["INSTANA_TEST"]: + if self.sensor.agent.can_send() or "INSTANA_TEST" in os.environ: instana_span = None if span.operation_name in self.registered_spans: