コード例 #1
0
    def test_pin_find(self):
        # ensure Pin will find the first available pin

        # Override service
        obj_a = self.Obj()
        pin = Pin(service="service-a")
        pin.onto(obj_a)

        # Override service
        obj_b = self.Obj()
        pin = Pin(service="service-b")
        pin.onto(obj_b)

        # No Pin set
        obj_c = self.Obj()

        # We find the first pin (obj_b)
        pin = Pin._find(obj_c, obj_b, obj_a)
        assert pin is not None
        assert pin.service == "service-b"

        # We find the first pin (obj_a)
        pin = Pin._find(obj_a, obj_b, obj_c)
        assert pin is not None
        assert pin.service == "service-a"

        # We don't find a pin if none is there
        pin = Pin._find(obj_c, obj_c, obj_c)
        assert pin is None
コード例 #2
0
    def test_pin_find(self):
        # ensure Pin will find the first available pin

        # Override service
        obj_a = self.Obj()
        pin = Pin(service='service-a')
        pin.onto(obj_a)

        # Override service
        obj_b = self.Obj()
        pin = Pin(service='service-b')
        pin.onto(obj_b)

        # No Pin set
        obj_c = self.Obj()

        # We find the first pin (obj_b)
        pin = Pin._find(obj_c, obj_b, obj_a)
        ok_(pin is not None)
        eq_(pin.service, 'service-b')

        # We find the first pin (obj_a)
        pin = Pin._find(obj_a, obj_b, obj_c)
        ok_(pin is not None)
        eq_(pin.service, 'service-a')

        # We don't find a pin if none is there
        pin = Pin._find(obj_c, obj_c, obj_c)
        ok_(pin is None)
コード例 #3
0
ファイル: patch.py プロジェクト: wantsui/dd-trace-py
def patch_conn(conn):
    tags = {t: getattr(conn, a, '') for t, a in CONN_ATTR_BY_TAG.items()}
    pin = Pin(app='pymysql', tags=tags)

    # grab the metadata from the conn
    wrapped = TracedConnection(conn, pin=pin, cfg=config.pymysql)
    pin.onto(wrapped)
    return wrapped
コード例 #4
0
ファイル: patch.py プロジェクト: tebriel/dd-trace-py
def patch_conn(conn):
    tags = {t: getattr(conn, a, '') for t, a in CONN_ATTR_BY_TAG.items()}
    pin = Pin(service="pymysql", app="pymysql", app_type=AppTypes.db, tags=tags)

    # grab the metadata from the conn
    wrapped = TracedConnection(conn, pin=pin)
    pin.onto(wrapped)
    return wrapped
コード例 #5
0
def patch_conn(conn):

    tags = {t: getattr(conn, a) for t, a in CONN_ATTR_BY_TAG.items() if getattr(conn, a, '') != ''}
    pin = Pin(service='mysql', app='mysql', app_type=AppTypes.db, tags=tags)

    # grab the metadata from the conn
    wrapped = TracedConnection(conn, pin=pin)
    pin.onto(wrapped)
    return wrapped
コード例 #6
0
    def test_pin(self):
        # ensure a Pin can be attached to an instance
        obj = self.Obj()
        pin = Pin(service='metrics')
        pin.onto(obj)

        got = Pin.get_from(obj)
        eq_(got.service, pin.service)
        ok_(got is pin)
コード例 #7
0
def patch_conn(conn):

    tags = {t: getattr(conn, a, '') for t, a in CONN_ATTR_BY_TAG.items()}
    pin = Pin(service="mysql", app="mysql", app_type="db", tags=tags)

    # grab the metadata from the conn
    wrapped = TracedConnection(conn)
    pin.onto(wrapped)
    return wrapped
コード例 #8
0
    def test_pin(self):
        # ensure a Pin can be attached to an instance
        obj = self.Obj()
        pin = Pin(service="metrics")
        pin.onto(obj)

        got = Pin.get_from(obj)
        assert got.service == pin.service
        assert got is pin
コード例 #9
0
ファイル: test_pin.py プロジェクト: tebriel/dd-trace-py
    def test_pin(self):
        # ensure a Pin can be attached to an instance
        obj = self.Obj()
        pin = Pin(service='metrics')
        pin.onto(obj)

        got = Pin.get_from(obj)
        eq_(got.service, pin.service)
        ok_(got is pin)
コード例 #10
0
def patch_conn(conn, *args, **kwargs):
    tags = {
        t: kwargs[k] if k in kwargs else args[p] for t, (k, p) in KWPOS_BY_TAG.items() if k in kwargs or len(args) > p
    }
    tags[net.TARGET_PORT] = conn.port
    pin = Pin(app="mysql", tags=tags)

    # grab the metadata from the conn
    wrapped = TracedConnection(conn, pin=pin, cfg=config.mysqldb)
    pin.onto(wrapped)
    return wrapped
コード例 #11
0
def test_pin():
    class A(object):
        pass

    a = A()
    pin = Pin(service="abc")
    pin.onto(a)

    got = Pin.get_from(a)
    assert pin.service == got.service
    assert pin is got
コード例 #12
0
ファイル: patch.py プロジェクト: tebriel/dd-trace-py
def patch_conn(conn, *args, **kwargs):
    tags = {t: kwargs[k] if k in kwargs else args[p]
            for t, (k, p) in KWPOS_BY_TAG.items()
            if k in kwargs or len(args) > p}
    tags[net.TARGET_PORT] = conn.port
    pin = Pin(service="mysql", app="mysql", app_type=AppTypes.db, tags=tags)

    # grab the metadata from the conn
    wrapped = TracedConnection(conn, pin=pin)
    pin.onto(wrapped)
    return wrapped
コード例 #13
0
def patch_conn(conn, *args, **kwargs):
    tags = {
        t: kwargs[k] if k in kwargs else args[p]
        for t, (k, p) in KWPOS_BY_TAG.items() if k in kwargs or len(args) > p
    }
    tags[net.TARGET_PORT] = conn.port
    pin = Pin(service='mysql', app='mysql', app_type=AppTypes.db, tags=tags)

    # grab the metadata from the conn
    wrapped = TracedConnection(conn, pin=pin)
    pin.onto(wrapped)
    return wrapped
コード例 #14
0
def _connect(func, instance, args, kwargs):
    conn = func(*args, **kwargs)
    tags = {
        net.TARGET_HOST: kwargs["host"],
        net.TARGET_PORT: kwargs["port"],
        db.USER: kwargs["user"],
        db.NAME: kwargs["database"],
    }

    pin = Pin(app="mariadb", tags=tags)

    wrapped = TracedConnection(conn, pin=pin, cfg=config.mariadb)
    pin.onto(wrapped)
    return wrapped
コード例 #15
0
    def __init__(self, *args, **kwargs):
        c = _Client(*args, **kwargs)
        super(WrappedClient, self).__init__(c)

        # tags to apply to each span generated by this client
        tags = _get_address_tags(*args, **kwargs)

        parent_pin = Pin.get_from(pymemcache)

        if parent_pin:
            pin = parent_pin.clone(tags=tags)
        else:
            pin = Pin(tags=tags)

        # attach the pin onto this instance
        pin.onto(self)
コード例 #16
0
def cursor_span_end(instance, cursor, _, conf, *args, **kwargs):
    tags = {}
    tags[net.TARGET_HOST] = instance.options["host"]
    tags[net.TARGET_PORT] = instance.options["port"]
    if "user" in instance.options:
        tags[dbx.USER] = instance.options["user"]
    if "database" in instance.options:
        tags[dbx.NAME] = instance.options["database"]

    pin = Pin(
        service=config.vertica["service_name"],
        app=APP,
        app_type=AppTypes.db,
        tags=tags,
        _config=config.vertica["patch"]
        ["vertica_python.vertica.cursor.Cursor"],
    )
    pin.onto(cursor)
コード例 #17
0
ファイル: test_pin.py プロジェクト: tebriel/dd-trace-py
    def test_pin_does_not_override_global_with_new_instance(self):
        # ensure that when a `Pin` is created from a class, the specific
        # instance doesn't override the global one, even if only the
        # `onto()` API has been used
        class A(object):
            pass

        pin = Pin(service='metrics')
        pin.onto(A)
        global_pin = Pin.get_from(A)
        global_pin._config['distributed_tracing'] = True

        a = A()
        pin = Pin.get_from(a)
        ok_(pin is not None)
        ok_(pin._config['distributed_tracing'] is True)
        pin._config['distributed_tracing'] = False

        ok_(global_pin._config['distributed_tracing'] is True)
        ok_(pin._config['distributed_tracing'] is False)
コード例 #18
0
ファイル: patch.py プロジェクト: jalaziz/dd-trace-py
def patched_connect(connect_func, _, args, kwargs):
    conn = connect_func(*args, **kwargs)
    if isinstance(conn, TracedConnection):
        return conn

    # Add default tags to each query
    tags = {
        net.TARGET_HOST: conn.host,
        net.TARGET_PORT: conn.port,
        db.NAME: conn.database,
        db.USER: conn.user,
        "db.application": conn.application,
        "db.schema": conn.schema,
        "db.warehouse": conn.warehouse,
    }

    pin = Pin(tags=tags)
    traced_conn = TracedConnection(conn, pin=pin, cfg=config.snowflake)
    pin.onto(traced_conn)
    return traced_conn
コード例 #19
0
    def test_pin_does_not_override_global_with_new_instance(self):
        # ensure that when a `Pin` is created from a class, the specific
        # instance doesn't override the global one, even if only the
        # `onto()` API has been used
        class A(object):
            pass

        pin = Pin(service='metrics')
        pin.onto(A)
        global_pin = Pin.get_from(A)
        global_pin._config['distributed_tracing'] = True

        a = A()
        pin = Pin.get_from(a)
        ok_(pin is not None)
        ok_(pin._config['distributed_tracing'] is True)
        pin._config['distributed_tracing'] = False

        ok_(global_pin._config['distributed_tracing'] is True)
        ok_(pin._config['distributed_tracing'] is False)
コード例 #20
0
ファイル: test_requests.py プロジェクト: onyb/dd-trace-py
    def test_analytics_integration_on_using_pin_default(self):
        """
        When making a request
            When an integration trace search is enabled and sample rate is set
                We expect the root span to have the appropriate tag
        """
        pin = Pin(service=__name__,
                  app='requests',
                  _config={
                      'service_name': __name__,
                      'distributed_tracing': False,
                      'split_by_domain': False,
                      'analytics_enabled': True,
                  })
        pin.onto(self.session)
        self.session.get(URL_200)

        spans = self.tracer.writer.pop()
        self.assertEqual(len(spans), 1)
        s = spans[0]
        self.assertEqual(s.get_metric(ANALYTICS_SAMPLE_RATE_KEY), 1.0)
コード例 #21
0
    def test_analytics_integration_on_using_pin(self):
        """
        When making a request
            When an integration trace search is enabled and sample rate is set
                We expect the root span to have the appropriate tag
        """
        pin = Pin(
            service=__name__,
            _config={
                "service_name": __name__,
                "distributed_tracing": False,
                "split_by_domain": False,
                "analytics_enabled": True,
                "analytics_sample_rate": 0.5,
            },
        )
        pin.onto(self.session)
        self.session.get(URL_200)

        spans = self.pop_spans()
        self.assertEqual(len(spans), 1)
        s = spans[0]
        self.assertEqual(s.get_metric(ANALYTICS_SAMPLE_RATE_KEY), 0.5)
コード例 #22
0
ファイル: test.py プロジェクト: mattrobenolt/dd-trace-py
    def test_elasticsearch(self):
        """Test the elasticsearch integration

        All in this for now. Will split it later.
        """
        """Test the elasticsearch integration with patching

        """
        es = elasticsearch.Elasticsearch(port=ELASTICSEARCH_CONFIG['port'])

        tracer = get_dummy_tracer()
        writer = tracer.writer
        pin = Pin(service=self.TEST_SERVICE, tracer=tracer)
        pin.onto(es)

        # Test index creation
        es.indices.create(index=self.ES_INDEX, ignore=400)

        spans = writer.pop()
        assert spans, spans
        eq_(len(spans), 1)
        span = spans[0]
        eq_(span.service, self.TEST_SERVICE)
        eq_(span.name, "elasticsearch.query")
        eq_(span.span_type, "elasticsearch")
        eq_(span.error, 0)
        eq_(span.get_tag(metadata.METHOD), "PUT")
        eq_(span.get_tag(metadata.URL), "/%s" % self.ES_INDEX)
        eq_(span.resource, "PUT /%s" % self.ES_INDEX)

        # Put data
        args = {'index': self.ES_INDEX, 'doc_type': self.ES_TYPE}
        es.index(id=10, body={'name': 'ten'}, **args)
        es.index(id=11, body={'name': 'eleven'}, **args)
        es.index(id=12, body={'name': 'twelve'}, **args)

        spans = writer.pop()
        assert spans, spans
        eq_(len(spans), 3)
        span = spans[0]
        eq_(span.error, 0)
        eq_(span.get_tag(metadata.METHOD), "PUT")
        eq_(span.get_tag(metadata.URL),
            "/%s/%s/%s" % (self.ES_INDEX, self.ES_TYPE, 10))
        eq_(span.resource, "PUT /%s/%s/?" % (self.ES_INDEX, self.ES_TYPE))

        # Make the data available
        es.indices.refresh(index=self.ES_INDEX)

        spans = writer.pop()
        assert spans, spans
        eq_(len(spans), 1)
        span = spans[0]
        eq_(span.resource, "POST /%s/_refresh" % self.ES_INDEX)
        eq_(span.get_tag(metadata.METHOD), "POST")
        eq_(span.get_tag(metadata.URL), "/%s/_refresh" % self.ES_INDEX)

        # Search data
        result = es.search(sort=['name:desc'],
                           size=100,
                           body={"query": {
                               "match_all": {}
                           }},
                           **args)

        assert len(result["hits"]) == 3, result

        spans = writer.pop()
        assert spans, spans
        eq_(len(spans), 1)
        span = spans[0]
        eq_(span.resource,
            "GET /%s/%s/_search" % (self.ES_INDEX, self.ES_TYPE))
        eq_(span.get_tag(metadata.METHOD), "GET")
        eq_(span.get_tag(metadata.URL),
            "/%s/%s/_search" % (self.ES_INDEX, self.ES_TYPE))
        eq_(
            span.get_tag(metadata.BODY).replace(" ", ""),
            '{"query":{"match_all":{}}}')
        eq_(set(span.get_tag(metadata.PARAMS).split('&')),
            {'sort=name%3Adesc', 'size=100'})

        self.assertTrue(span.get_metric(metadata.TOOK) > 0)

        # Drop the index, checking it won't raise exception on success or failure
        es.indices.delete(index=self.ES_INDEX, ignore=[400, 404])
        es.indices.delete(index=self.ES_INDEX, ignore=[400, 404])