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