def test_span_info(self): cursor = self.cursor tracer = self.tracer cursor.rowcount = 123 pin = Pin('my_service', app='my_app', tracer=tracer, tags={'pin1': 'value_pin1'}) traced_cursor = TracedCursor(cursor, pin, {}) def method(): pass traced_cursor._trace_method(method, 'my_name', 'my_resource', {'extra1': 'value_extra1'}) span = tracer.pop()[0] # type: Span # Only measure if the name passed matches the default name (e.g. `sql.query` and not `sql.query.fetchall`) assert_is_not_measured(span) assert span.meta['pin1'] == 'value_pin1', 'Pin tags are preserved' assert span.meta[ 'extra1'] == 'value_extra1', 'Extra tags are merged into pin tags' assert span.name == 'my_name', 'Span name is respected' assert span.service == 'my_service', 'Service from pin' assert span.resource == 'my_resource', 'Resource is respected' assert span.span_type == 'sql', 'Span has the correct span type' # Row count assert span.get_metric( 'db.rowcount') == 123, 'Row count is set as a metric' assert span.get_metric( 'sql.rows' ) == 123, 'Row count is set as a tag (for legacy django cursor replacement)'
def test_sqlite_fetchall_is_traced(self): q = "select * from sqlite_master" # Not traced by default connection = self._given_a_traced_connection(self.tracer) cursor = connection.execute(q) cursor.fetchall() self.assert_structure(dict(name="sqlite.query", resource=q)) self.reset() with self.override_config("sqlite", dict(trace_fetch_methods=True)): connection = self._given_a_traced_connection(self.tracer) cursor = connection.execute(q) cursor.fetchall() # We have two spans side by side query_span, fetchall_span = self.get_root_spans() # Assert query query_span.assert_structure(dict(name="sqlite.query", resource=q)) assert_is_measured(query_span) # Assert fetchall fetchall_span.assert_structure( dict(name="sqlite.query.fetchall", resource=q, span_type="sql", error=0)) assert_is_not_measured(fetchall_span) self.assertIsNone(fetchall_span.get_tag("sql.query"))
def test_span_info(self): cursor = self.cursor tracer = self.tracer cursor.rowcount = 123 pin = Pin("my_service", app="my_app", tracer=tracer, tags={"pin1": "value_pin1"}) traced_cursor = TracedCursor(cursor, pin, {}) def method(): pass traced_cursor._trace_method(method, "my_name", "my_resource", {"extra1": "value_extra1"}) span = tracer.pop()[0] # type: Span # Only measure if the name passed matches the default name (e.g. `sql.query` and not `sql.query.fetchall`) assert_is_not_measured(span) assert span.meta["pin1"] == "value_pin1", "Pin tags are preserved" assert span.meta[ "extra1"] == "value_extra1", "Extra tags are merged into pin tags" assert span.name == "my_name", "Span name is respected" assert span.service == "my_service", "Service from pin" assert span.resource == "my_resource", "Resource is respected" assert span.span_type == "sql", "Span has the correct span type" # Row count assert span.get_metric( "db.rowcount") == 123, "Row count is set as a metric" assert span.get_metric( "sql.rows" ) == 123, "Row count is set as a tag (for legacy django cursor replacement)"
def test_set_tag_measured_change_value(): s = Span(tracer=None, name="test.span") s.set_tag(SPAN_MEASURED_KEY, True) assert_is_measured(s) s.set_tag(SPAN_MEASURED_KEY, False) assert_is_not_measured(s) s.set_tag(SPAN_MEASURED_KEY) assert_is_measured(s)
def test_file_template(self): loader = jinja2.loaders.FileSystemLoader(TMPL_DIR) env = jinja2.Environment(loader=loader) t = env.get_template('template.html') assert t.render(name='Jinja') == 'Message: Hello Jinja!' # tests spans = self.pop_spans() assert len(spans) == 5 for span in spans: assert span.span_type == 'template' assert span.service is None # templates.html extends base.html def get_def(s): return s.name, s.get_tag('jinja2.template_name') assert get_def(spans[0]) == ('jinja2.load', 'template.html') assert_is_not_measured(spans[0]) assert get_def(spans[1]) == ('jinja2.compile', 'template.html') assert_is_not_measured(spans[1]) assert get_def(spans[2]) == ('jinja2.render', 'template.html') assert_is_measured(spans[2]) assert get_def(spans[3]) == ('jinja2.load', 'base.html') assert_is_not_measured(spans[3]) assert get_def(spans[4]) == ('jinja2.compile', 'base.html') assert_is_not_measured(spans[4]) # additional checks for jinja2.load assert spans[0].get_tag('jinja2.template_path') == os.path.join( TMPL_DIR, 'template.html') assert spans[3].get_tag('jinja2.template_path') == os.path.join( TMPL_DIR, 'base.html')
def test_generate_inline_template(self): t = jinja2.environment.Template('Hello {{name}}!') assert ''.join(t.generate(name='Jinja')) == 'Hello Jinja!' # tests spans = self.pop_spans() assert len(spans) == 2 for span in spans: assert span.service is None assert span.span_type == 'template' assert span.get_tag('jinja2.template_name') == '<memory>' assert spans[0].name == 'jinja2.compile' assert_is_not_measured(spans[0]) assert spans[1].name == 'jinja2.render' assert_is_measured(spans[1])
def test_generate_inline_template(self): t = jinja2.environment.Template("Hello {{name}}!") assert "".join(t.generate(name="Jinja")) == "Hello Jinja!" # tests spans = self.pop_spans() assert len(spans) == 2 for span in spans: assert span.service is None assert span.span_type == "template" assert span.get_tag("jinja2.template_name") == "<memory>" assert spans[0].name == "jinja2.compile" assert_is_not_measured(spans[0]) assert spans[1].name == "jinja2.render" assert_is_measured(spans[1])
def test_set_tag_measured_not_set(): # Span is not measured by default s = Span(tracer=None, name="test.span") assert_is_not_measured(s)