def test_client_subtracer(self): tracer = DummyTracer(MockTracer()) tornado_opentracing.init_client_tracing(tracer) self.assertFalse(getattr(tornado, '__opentracing_patch', False)) self.assertTrue(getattr(tornado, '__opentracing_client_patch', False)) self.assertEqual(tornado_opentracing.httpclient.g_client_tracer, tracer._tracer)
def test_start_span_cb(self): def test_cb(span, request): span.operation_name = 'foo/' + request.method span.set_tag('component', 'tornado-client') tornado_opentracing.init_client_tracing(self.tracer, start_span_cb=test_cb) with tracer_stack_context(): self.http_client.fetch(self.get_url('/'), self.stop) response = self.wait() self.assertEqual(response.code, 200) spans = self.tracer.finished_spans() self.assertEqual(len(spans), 1) self.assertTrue(spans[0].finished) self.assertEqual(spans[0].operation_name, 'foo/GET') self.assertEqual( spans[0].tags, { 'component': 'tornado-client', 'span.kind': 'client', 'http.url': self.get_url('/'), 'http.method': 'GET', 'http.status_code': 200, })
def test_client_start_span(self): def test_cb(span, request): pass tornado_opentracing.init_client_tracing(MockTracer(), start_span_cb=test_cb) self.assertEqual(tornado_opentracing.httpclient.g_start_span_cb, test_cb)
def test_client_tracer_none(self, tracer): tornado_opentracing.init_client_tracing() self.assertEqual(tornado_opentracing.httpclient._get_tracer(), opentracing.tracer) opentracing.tracer = mock.MagicMock() self.assertEqual(tornado_opentracing.httpclient._get_tracer(), opentracing.tracer)
def test_start_span_cb_exception(self): def test_cb(span, request): raise RuntimeError('This should not happen') tornado_opentracing.init_client_tracing(self.tracer, start_span_cb=test_cb) with tornado_context(): response = self.http_fetch(self.get_url('/')) self.assertEqual(response.code, 200) spans = self.tracer.finished_spans() self.assertEqual(len(spans), 1) self.assertFalse(spans[0].tags.get('error', False))
def test_server_not_found(self): tornado_opentracing.init_client_tracing(self.tracer) with tracer_stack_context(): self.http_client.fetch(self.get_url('/doesnotexist'), self.stop) response = self.wait() self.assertEqual(response.code, 404) spans = self.tracer.finished_spans() self.assertEqual(len(spans), 1) self.assertEqual(spans[0].operation_name, 'GET') tags = spans[0].tags self.assertEqual(tags.get('http.status_code', None), 404) self.assertEqual(tags.get('error', None), None) # no error. self.assertEqual(len(spans[0].logs), 0)
def test_simple(self): tornado_opentracing.init_client_tracing(self.tracer) with tornado_context(): response = self.http_fetch(self.get_url('/')) self.assertEqual(response.code, 200) spans = self.tracer.finished_spans() self.assertEqual(len(spans), 1) self.assertTrue(spans[0].finished) self.assertEqual(spans[0].operation_name, 'GET') self.assertEqual(spans[0].tags, { 'component': 'tornado', 'span.kind': 'client', 'http.url': self.get_url('/'), 'http.method': 'GET', 'http.status_code': 200, })
def test_simple(self): tornado_opentracing.init_client_tracing(tracing) with tracer_stack_context(): self.http_client.fetch(self.get_url('/decorated'), self.stop) response = self.wait() self.assertEqual(response.code, 200) spans = tracing.tracer.finished_spans() self.assertEqual(len(spans), 2) # Client span = spans[1] self.assertTrue(span.finished) self.assertEqual(span.operation_name, 'GET') self.assertEqual( span.tags, { 'component': 'tornado', 'span.kind': 'client', 'http.url': self.get_url('/decorated'), 'http.method': 'GET', 'http.status_code': 200, }) # Server span2 = spans[0] self.assertTrue(span2.finished) self.assertEqual(span2.operation_name, 'DecoratedHandler') self.assertEqual( span2.tags, { 'component': 'tornado', 'span.kind': 'server', 'http.url': '/decorated', 'http.method': 'GET', 'http.status_code': 200, 'protocol': 'http', }) # Make sure the context was propagated, # and the client/server have the proper child_of relationship. self.assertEqual(span.context.trace_id, span2.context.trace_id) self.assertEqual(span.context.span_id, span2.parent_id)
def test_explicit_parameters(self): tornado_opentracing.init_client_tracing(self.tracer) with tornado_context(): response = self.http_fetch( self.get_url('/error'), raise_error=False, method='POST', body='') self.assertEqual(response.code, 500) spans = self.tracer.finished_spans() self.assertEqual(len(spans), 1) self.assertTrue(spans[0].finished) self.assertEqual(spans[0].operation_name, 'POST') self.assertEqual(spans[0].tags, { 'component': 'tornado', 'span.kind': 'client', 'http.url': self.get_url('/error'), 'http.method': 'POST', 'http.status_code': 500, })
def test_no_tracer(self): tornado_opentracing.init_client_tracing() with mock.patch('opentracing.tracer', new=self.tracer): with tracer_stack_context(): self.http_client.fetch(self.get_url('/'), self.stop) response = self.wait() self.assertEqual(response.code, 200) spans = self.tracer.finished_spans() self.assertEqual(len(spans), 1) self.assertTrue(spans[0].finished) self.assertEqual(spans[0].operation_name, 'GET') self.assertEqual( spans[0].tags, { 'component': 'tornado', 'span.kind': 'client', 'http.url': self.get_url('/'), 'http.method': 'GET', 'http.status_code': 200, })
def test_server_error(self): tornado_opentracing.init_client_tracing(self.tracer) with tornado_context(): response = self.http_fetch(self.get_url('/error')) self.assertEqual(response.code, 500) spans = self.tracer.finished_spans() self.assertEqual(len(spans), 1) self.assertTrue(spans[0].finished) self.assertEqual(spans[0].operation_name, 'GET') tags = spans[0].tags self.assertEqual(tags.get('http.status_code', None), 500) self.assertEqual(tags.get('error', None), True) logs = spans[0].logs self.assertEqual(len(logs), 1) self.assertEqual(logs[0].key_values.get('event', None), 'error') self.assertTrue( isinstance(logs[0].key_values.get('error.object', None), Exception))
def test_client_start_span_cb_invalid(self): with self.assertRaises(ValueError): tornado_opentracing.init_client_tracing(MockTracer(), start_span_cb=object())
def test_client_tracer_none(self): tornado_opentracing.init_client_tracing() self.assertEqual(tornado_opentracing.httpclient.g_client_tracer, opentracing.tracer)
from tornado_opentracing.scope_managers import TornadoScopeManager def client_start_span_cb(span, request): span.operation_name = 'client/%s' % request.method span.set_tag('headers', request.headers) # Pass your OpenTracing-compatible tracer here # using TornadoScopeManager. tracing = tornado_opentracing.TornadoTracing(opentracing.tracer) # Since we are not doing a full tornado_opentracing.init_tracing(), # we need to manually call init_client_tracing() if we want to do # HTTP client tracing too. tornado_opentracing.init_client_tracing(opentracing.tracer, start_span_cb=client_start_span_cb) class ClientLogHandler(RequestHandler): @tracing.trace() @gen.coroutine def get(self): yield AsyncHTTPClient().fetch('http://127.0.0.1:8080/server/log') self.write({'message': 'Sent a request to log'}) class ClientChildSpanHandler(RequestHandler): @tracing.trace() @gen.coroutine def get(self): yield AsyncHTTPClient().fetch('http://127.0.0.1:8080/server/childspan')