def test_excludelist_path(self): from opencensus.ext.django import middleware execution_context.clear() excludelist_paths = ['test_excludelist_path'] settings = type('Test', (object,), {}) settings.OPENCENSUS = { 'TRACE': { 'SAMPLER': 'opencensus.trace.samplers.AlwaysOnSampler()', # noqa 'EXCLUDELIST_PATHS': excludelist_paths, 'EXPORTER': mock.Mock(), } } patch_settings = mock.patch( 'django.conf.settings', settings) with patch_settings: middleware_obj = middleware.OpencensusMiddleware() django_request = RequestFactory().get('/test_excludelist_path') disabled = utils.disable_tracing_url(django_request.path, excludelist_paths) self.assertTrue(disabled) self.assertEqual(middleware_obj.excludelist_paths, excludelist_paths) # test process_request middleware_obj.process_request(django_request) tracer = middleware._get_current_tracer() span = tracer.current_span() # process view view_func = mock.Mock() middleware_obj.process_view(django_request, view_func) tracer = middleware._get_current_tracer() span = tracer.current_span() assert isinstance(span, BlankSpan) # process response django_response = mock.Mock() django_response.status_code = 200 middleware_obj.process_response(django_request, django_response) tracer = middleware._get_current_tracer() span = tracer.current_span() assert isinstance(span, BlankSpan)
def test_blacklist_path(self): from opencensus.ext.django import middleware execution_context.clear() blacklist_paths = [ 'test_blacklist_path', ] params = { 'BLACKLIST_PATHS': [ 'test_blacklist_path', ], 'TRANSPORT': 'opencensus.common.transports.sync.SyncTransport', } patch_params = mock.patch( 'opencensus.ext.django.middleware.settings.params', params) with patch_params: middleware_obj = middleware.OpencensusMiddleware() django_request = RequestFactory().get('/test_blacklist_path') disabled = utils.disable_tracing_url(django_request.path, blacklist_paths) self.assertTrue(disabled) self.assertEqual(middleware_obj._blacklist_paths, blacklist_paths) # test process_request middleware_obj.process_request(django_request) tracer = middleware._get_current_tracer() span = tracer.current_span() # process view view_func = mock.Mock() middleware_obj.process_view(django_request, view_func) tracer = middleware._get_current_tracer() span = tracer.current_span() assert isinstance(span, BlankSpan) # process response django_response = mock.Mock() django_response.status_code = 200 middleware_obj.process_response(django_request, django_response) tracer = middleware._get_current_tracer() span = tracer.current_span() assert isinstance(span, BlankSpan)
def test_process_request(self): from opencensus.ext.django import middleware trace_id = '2dd43a1d6b2549c6bc2a1a54c2fc0b05' span_id = '6e0c63257de34c92' django_trace_id = '{}/{}'.format(trace_id, span_id) django_request = RequestFactory().get( '/', **{'HTTP_X_CLOUD_TRACE_CONTEXT': django_trace_id}) middleware_obj = middleware.OpencensusMiddleware() # test process_request middleware_obj.process_request(django_request) tracer = middleware._get_current_tracer() span = tracer.current_span() expected_attributes = { 'http.url': u'/', 'http.method': 'GET', } self.assertEqual(span.span_kind, span_module.SpanKind.SERVER) self.assertEqual(span.attributes, expected_attributes) self.assertEqual(span.parent_span.span_id, span_id) span_context = tracer.span_context self.assertEqual(span_context.trace_id, trace_id) # test process_view view_func = mock.Mock() middleware_obj.process_view(django_request, view_func) self.assertEqual(span.name, 'mock.mock.Mock')
def test_process_response_unfinished_child_span(self): from opencensus.ext.django import middleware trace_id = '2dd43a1d6b2549c6bc2a1a54c2fc0b05' span_id = '6e0c63257de34c92' django_trace_id = '00-{}-{}-00'.format(trace_id, span_id) django_request = RequestFactory().get( '/wiki/Rabbit', **{ 'traceparent': django_trace_id, }) # Force the test request to be sampled settings = type('Test', (object, ), {}) settings.OPENCENSUS = { 'TRACE': { 'SAMPLER': 'opencensus.trace.samplers.AlwaysOnSampler()', # noqa } } patch_settings = mock.patch('django.conf.settings', settings) with patch_settings: middleware_obj = middleware.OpencensusMiddleware() middleware_obj.process_request(django_request) tracer = middleware._get_current_tracer() span = tracer.current_span() exporter_mock = mock.Mock() tracer.exporter = exporter_mock django_response = mock.Mock() django_response.status_code = 500 expected_attributes = { 'http.host': u'testserver', 'http.method': 'GET', 'http.path': u'/wiki/Rabbit', 'http.route': u'/wiki/Rabbit', 'http.url': u'http://testserver/wiki/Rabbit', 'http.status_code': '500', 'django.user.id': '123', 'django.user.name': 'test_name' } mock_user = mock.Mock() mock_user.pk = 123 mock_user.get_username.return_value = 'test_name' django_request.user = mock_user tracer.start_span() self.assertNotEqual(span, tracer.current_span()) middleware_obj.process_response(django_request, django_response) self.assertEqual(span.attributes, expected_attributes)
def test_process_request(self): from opencensus.ext.django import middleware trace_id = '2dd43a1d6b2549c6bc2a1a54c2fc0b05' span_id = '6e0c63257de34c92' django_trace_id = '00-{}-{}-00'.format(trace_id, span_id) django_request = RequestFactory().get('/wiki/Rabbit', **{ 'HTTP_TRACEPARENT': django_trace_id}) # Force the test request to be sampled settings = type('Test', (object,), {}) settings.OPENCENSUS = { 'TRACE': { 'SAMPLER': 'opencensus.trace.samplers.AlwaysOnSampler()', # noqa } } patch_settings = mock.patch( 'django.conf.settings', settings) with patch_settings: middleware_obj = middleware.OpencensusMiddleware() # test process_request middleware_obj.process_request(django_request) tracer = middleware._get_current_tracer() span = tracer.current_span() expected_attributes = { 'http.host': u'testserver', 'http.method': 'GET', 'http.path': u'/wiki/Rabbit', 'http.route': u'/wiki/Rabbit', 'http.url': u'http://testserver/wiki/Rabbit', } self.assertEqual(span.span_kind, span_module.SpanKind.SERVER) self.assertEqual(span.attributes, expected_attributes) self.assertEqual(span.parent_span.span_id, span_id) span_context = tracer.span_context self.assertEqual(span_context.trace_id, trace_id) # test process_view view_func = mock.Mock() middleware_obj.process_view(django_request, view_func) self.assertEqual(span.name, 'mock.mock.Mock')
def test_process_response_no_get_username(self): from opencensus.ext.django import middleware trace_id = '2dd43a1d6b2549c6bc2a1a54c2fc0b05' span_id = '6e0c63257de34c92' django_trace_id = '00-{}-{}-00'.format(trace_id, span_id) django_request = RequestFactory().get( '/', **{ 'traceparent': django_trace_id, }) # Force the test request to be sampled settings = type('Test', (object, ), {}) settings.OPENCENSUS = { 'TRACE': { 'SAMPLER': 'opencensus.trace.samplers.AlwaysOnSampler()', # noqa } } patch_settings = mock.patch('django.conf.settings', settings) with patch_settings: middleware_obj = middleware.OpencensusMiddleware() middleware_obj.process_request(django_request) tracer = middleware._get_current_tracer() span = tracer.current_span() exporter_mock = mock.Mock() tracer.exporter = exporter_mock django_response = mock.Mock() django_response.status_code = 200 expected_attributes = { 'http.url': u'/', 'http.method': 'GET', 'http.status_code': '200', } mock_user = mock.Mock() mock_user.pk = 123 mock_user.get_username.side_effect = AttributeError django_request.user = mock_user middleware_obj.process_response(django_request, django_response) self.assertEqual(span.attributes, expected_attributes)
def test_process_response_unfinished_child_span(self): from opencensus.ext.django import middleware trace_id = '2dd43a1d6b2549c6bc2a1a54c2fc0b05' span_id = '6e0c63257de34c92' django_trace_id = '{}/{}'.format(trace_id, span_id) django_request = RequestFactory().get( '/', **{ google_cloud_format._TRACE_CONTEXT_HEADER_NAME: django_trace_id }) middleware_obj = middleware.OpencensusMiddleware() middleware_obj.process_request(django_request) tracer = middleware._get_current_tracer() span = tracer.current_span() exporter_mock = mock.Mock() tracer.exporter = exporter_mock django_response = mock.Mock() django_response.status_code = 500 expected_attributes = { 'http.url': u'/', 'http.method': 'GET', 'http.status_code': '500', 'django.user.id': '123', 'django.user.name': 'test_name' } mock_user = mock.Mock() mock_user.pk = 123 mock_user.get_username.return_value = 'test_name' django_request.user = mock_user tracer.start_span() self.assertNotEqual(span, tracer.current_span()) middleware_obj.process_response(django_request, django_response) self.assertEqual(span.attributes, expected_attributes)
def process_view(self, request, view_func, *args, **kwargs): """Process view is executed before the view function, here we get the function name add set it as the span name. """ # Do not trace if the url is blacklisted if utils.disable_tracing_url(request.path, self.blacklist_paths): return try: # Get the current span and set the span name to the current # function name of the request. tracer = _get_current_tracer() span = tracer.current_span() span.name = 'Recv.' + self.resolver.resolve(request.path_info) tracer.add_attribute_to_current_span( attribute_key='django.view', attribute_value=utils.get_func_name(view_func)) except Exception: # pragma: no cover logger.error('Failed to trace request', exc_info=True)
def test_process_response(self): from opencensus.ext.django import middleware trace_id = '2dd43a1d6b2549c6bc2a1a54c2fc0b05' span_id = '6e0c63257de34c92' django_trace_id = '00-{}-{}-00'.format(trace_id, span_id) django_request = RequestFactory().get( '/', **{ 'traceparent': django_trace_id, }) middleware_obj = middleware.OpencensusMiddleware() middleware_obj.process_request(django_request) tracer = middleware._get_current_tracer() span = tracer.current_span() exporter_mock = mock.Mock() tracer.exporter = exporter_mock django_response = mock.Mock() django_response.status_code = 200 expected_attributes = { 'http.url': u'/', 'http.method': 'GET', 'http.status_code': '200', 'django.user.id': '123', 'django.user.name': 'test_name' } mock_user = mock.Mock() mock_user.pk = 123 mock_user.get_username.return_value = 'test_name' django_request.user = mock_user middleware_obj.process_response(django_request, django_response) self.assertEqual(span.attributes, expected_attributes)
def test_process_view(self): from opencensus.ext.django import middleware from django.urls.resolvers import ResolverMatch trace_id = '2dd43a1d6b2549c6bc2a1a54c2fc0b05' span_id = '6e0c63257de34c92' django_trace_id = '00-{}-{}-00'.format(trace_id, span_id) django_request = RequestFactory().get( '/wiki/Rabbit', **{'HTTP_TRACEPARENT': django_trace_id}) django_request.resolver_match = ResolverMatch(self.view_func_ok, None, None) # Force the test request to be sampled settings = type('Test', (object, ), {}) settings.OPENCENSUS = { 'TRACE': { 'SAMPLER': 'opencensus.trace.samplers.AlwaysOnSampler()', # noqa } } patch_settings = mock.patch('django.conf.settings', settings) with patch_settings: middleware_obj = self.middleware_kls() # test process_request middleware_obj.process_request(django_request) tracer = middleware._get_current_tracer() span = tracer.current_span() # test process_view middleware_obj.process_view(django_request) self.assertEqual(span.name, 'MyService.test_django_middleware.MockViewOk')
def test_process_exception(self): from opencensus.ext.django import middleware trace_id = '2dd43a1d6b2549c6bc2a1a54c2fc0b05' span_id = '6e0c63257de34c92' django_trace_id = '00-{}-{}-00'.format(trace_id, span_id) django_request = RequestFactory().get('/wiki/Rabbit', **{ 'traceparent': django_trace_id, }) # Force the test request to be sampled settings = type('Test', (object,), {}) settings.OPENCENSUS = { 'TRACE': { 'SAMPLER': 'opencensus.trace.samplers.AlwaysOnSampler()', # noqa } } patch_settings = mock.patch( 'django.conf.settings', settings) with patch_settings: middleware_obj = middleware.OpencensusMiddleware() tb = None try: raise RuntimeError("bork bork bork") except Exception as exc: test_exception = exc if hasattr(exc, "__traceback__"): tb = exc.__traceback__ else: _, _, tb = sys.exc_info() middleware_obj.process_request(django_request) tracer = middleware._get_current_tracer() span = tracer.current_span() exporter_mock = mock.Mock() tracer.exporter = exporter_mock django_response = mock.Mock() django_response.status_code = 200 expected_attributes = { 'http.host': u'testserver', 'http.method': 'GET', 'http.path': u'/wiki/Rabbit', 'http.route': u'/wiki/Rabbit', 'http.url': u'http://testserver/wiki/Rabbit', 'django.user.id': '123', 'django.user.name': 'test_name', 'error.name': "RuntimeError", 'error.message': 'bork bork bork', 'stacktrace': '\n'.join(traceback.format_tb(tb)) } mock_user = mock.Mock() mock_user.pk = 123 mock_user.get_username.return_value = 'test_name' django_request.user = mock_user middleware_obj.process_exception(django_request, test_exception) self.assertEqual(span.attributes, expected_attributes)