def test_constructor_zipkin_service_name_param(self): from opencensus.ext.django import middleware service_name = 'test_service' host_name = 'test_hostname' port = 2333 protocol = 'http' params = { 'SERVICE_NAME': service_name, 'ZIPKIN_EXPORTER_HOST_NAME': host_name, 'ZIPKIN_EXPORTER_PORT': port, 'ZIPKIN_EXPORTER_PROTOCOL': protocol, 'TRANSPORT': 'opencensus.common.transports.sync.SyncTransport', } patch_zipkin = mock.patch( 'opencensus.ext.django.config.settings.EXPORTER', zipkin_exporter.ZipkinExporter) patch_params = mock.patch( 'opencensus.ext.django.config.settings.params', params) with patch_zipkin, patch_params: middleware = middleware.OpencensusMiddleware() self.assertEqual(middleware.exporter.service_name, service_name) self.assertEqual(middleware.exporter.host_name, host_name) self.assertEqual(middleware.exporter.port, port)
def test_configuration(self): from opencensus.ext.django import middleware settings = type('Test', (object, ), {}) settings.OPENCENSUS = { 'TRACE': { 'SAMPLER': 'opencensus.trace.samplers.AlwaysOnSampler()', # noqa 'EXPORTER': 'opencensus.trace.print_exporter.PrintExporter()', # noqa 'PROPAGATOR': 'opencensus.trace.propagation.trace_context_http_header_format.TraceContextPropagator()', # noqa } } patch_settings = mock.patch('django.conf.settings', settings) with patch_settings: middleware = middleware.OpencensusMiddleware() assert isinstance(middleware.sampler, samplers.AlwaysOnSampler) assert isinstance(middleware.exporter, print_exporter.PrintExporter) assert isinstance( middleware.propagator, trace_context_http_header_format.TraceContextPropagator, )
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_constructor_ocagent_trace_exporter(self): from opencensus.ext.django import middleware service_name = 'test_service' endpoint = 'localhost:50001' params = { 'SERVICE_NAME': service_name, 'OCAGENT_TRACE_EXPORTER_ENDPOINT': endpoint, 'TRANSPORT': 'opencensus.common.transports.sync.SyncTransport', } patch_ocagent_trace = mock.patch( 'opencensus.ext.django.config.settings.EXPORTER', ocagent_exporter.TraceExporter) patch_params = mock.patch( 'opencensus.ext.django.config.settings.params', params) with patch_ocagent_trace, patch_params: middleware = middleware.OpencensusMiddleware() self.assertIs(middleware._sampler, always_on.AlwaysOnSampler) self.assertIs(middleware._exporter, ocagent_exporter.TraceExporter) self.assertIs(middleware._propagator, google_cloud_format.GoogleCloudFormatPropagator) assert isinstance(middleware.sampler, always_on.AlwaysOnSampler) assert isinstance(middleware.exporter, ocagent_exporter.TraceExporter) assert isinstance(middleware.propagator, google_cloud_format.GoogleCloudFormatPropagator) self.assertEqual(middleware.exporter.service_name, service_name) self.assertEqual(middleware.exporter.endpoint, endpoint)
def test_constructor_probability_sampler(self): from opencensus.ext.django import middleware rate = 0.8 params = { 'SAMPLING_RATE': 0.8, 'TRANSPORT': 'opencensus.common.transports.sync.SyncTransport', } patch_sampler = mock.patch( 'opencensus.ext.django.config.settings.SAMPLER', probability.ProbabilitySampler) patch_exporter = mock.patch( 'opencensus.ext.django.config.settings.EXPORTER', print_exporter.PrintExporter) patch_params = mock.patch( 'opencensus.ext.django.config.settings.params', params) with patch_sampler, patch_exporter, patch_params: middleware = middleware.OpencensusMiddleware() self.assertIs(middleware._sampler, probability.ProbabilitySampler) self.assertIs(middleware._exporter, print_exporter.PrintExporter) self.assertIs(middleware._propagator, google_cloud_format.GoogleCloudFormatPropagator) assert isinstance(middleware.sampler, probability.ProbabilitySampler) assert isinstance(middleware.exporter, print_exporter.PrintExporter) assert isinstance(middleware.propagator, google_cloud_format.GoogleCloudFormatPropagator) self.assertEqual(middleware.sampler.rate, rate)
def test_constructor_jaeger(self): from opencensus.ext.django import middleware service_name = 'test_service' params = { 'SERVICE_NAME': service_name, 'TRANSPORT': 'opencensus.common.transports.sync.SyncTransport', } patch_jaeger = mock.patch( 'opencensus.ext.django.config.settings.EXPORTER', jaeger_exporter.JaegerExporter) patch_params = mock.patch( 'opencensus.ext.django.config.settings.params', params) with patch_jaeger, patch_params: middleware = middleware.OpencensusMiddleware() self.assertIs(middleware._sampler, always_on.AlwaysOnSampler) self.assertIs(middleware._exporter, jaeger_exporter.JaegerExporter) self.assertIs(middleware._propagator, google_cloud_format.GoogleCloudFormatPropagator) assert isinstance(middleware.sampler, always_on.AlwaysOnSampler) assert isinstance(middleware.exporter, jaeger_exporter.JaegerExporter) assert isinstance(middleware.propagator, google_cloud_format.GoogleCloudFormatPropagator) self.assertEqual(middleware.exporter.service_name, service_name)
def test_process_request(self): if django.VERSION < (2, 0): pytest.skip("Wrong version of Django") from opencensus.ext.django import middleware sql = "SELECT * FROM users" MockConnection = namedtuple('Connection', ('vendor', 'alias')) connection = MockConnection('mysql', 'default') mock_execute = mock.Mock() mock_execute.return_value = "Mock result" middleware.OpencensusMiddleware() patch_no_tracer = mock.patch( 'opencensus.ext.django.middleware._get_current_tracer', return_value=None) with patch_no_tracer: result = middleware._trace_db_call( mock_execute, sql, params=[], many=False, context={'connection': connection}) self.assertEqual(result, "Mock result") mock_tracer = mock.Mock() mock_tracer.return_value = mock_tracer patch = mock.patch( 'opencensus.ext.django.middleware._get_current_tracer', return_value=mock_tracer) with patch: result = middleware._trace_db_call( mock_execute, sql, params=[], many=False, context={'connection': connection}) (mock_sql, mock_params, mock_many, mock_context) = mock_execute.call_args[0] self.assertEqual(mock_sql, sql) self.assertEqual(mock_params, []) self.assertEqual(mock_many, False) self.assertEqual(mock_context, {'connection': connection}) self.assertEqual(result, "Mock result") result = middleware._trace_db_call(mock_execute, sql, params=[], many=True, context={'connection': connection}) (mock_sql, mock_params, mock_many, mock_context) = mock_execute.call_args[0] self.assertEqual(mock_many, True)
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_constructor_default(self): from opencensus.ext.django import middleware middleware = middleware.OpencensusMiddleware() assert isinstance(middleware.sampler, samplers.ProbabilitySampler) assert isinstance(middleware.exporter, print_exporter.PrintExporter) assert isinstance( middleware.propagator, trace_context_http_header_format.TraceContextPropagator, )
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 = '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_constructor_zipkin(self): from opencensus.ext.django import middleware service_name = 'test_service' host_name = 'test_hostname' port = 2333 protocol = 'http' params = { 'ZIPKIN_EXPORTER_SERVICE_NAME': service_name, 'ZIPKIN_EXPORTER_HOST_NAME': host_name, 'ZIPKIN_EXPORTER_PORT': port, 'ZIPKIN_EXPORTER_PROTOCOL': protocol, 'TRANSPORT': 'opencensus.common.transports.sync.SyncTransport', } patch_zipkin = mock.patch( 'opencensus.ext.django.config.settings.EXPORTER', zipkin_exporter.ZipkinExporter) patch_params = mock.patch( 'opencensus.ext.django.config.settings.params', params) with patch_zipkin, patch_params: middleware = middleware.OpencensusMiddleware() self.assertIs(middleware._sampler, always_on.AlwaysOnSampler) self.assertIs( middleware._exporter, zipkin_exporter.ZipkinExporter) self.assertIs( middleware._propagator, google_cloud_format.GoogleCloudFormatPropagator) assert isinstance(middleware.sampler, always_on.AlwaysOnSampler) assert isinstance( middleware.exporter, zipkin_exporter.ZipkinExporter) assert isinstance( middleware.propagator, google_cloud_format.GoogleCloudFormatPropagator) self.assertEqual(middleware.exporter.service_name, service_name) self.assertEqual(middleware.exporter.host_name, host_name) self.assertEqual(middleware.exporter.port, port)
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 test_constructor_cloud(self): from opencensus.ext.django import middleware class MockCloudExporter(object): def __init__(self, project_id, transport): self.project_id = project_id self.transport = transport MockCloudExporter.__name__ = 'GoogleCloudExporter' project_id = 'my_project' params = { 'GCP_EXPORTER_PROJECT': project_id, 'TRANSPORT': 'opencensus.common.transports.sync.SyncTransport', } patch_params = mock.patch( 'opencensus.ext.django.config.settings.params', params) patch_exporter = mock.patch( 'opencensus.ext.django.config.settings.EXPORTER', MockCloudExporter) with patch_params, patch_exporter: middleware = middleware.OpencensusMiddleware() self.assertIs(middleware._sampler, always_on.AlwaysOnSampler) self.assertIs( middleware._exporter, MockCloudExporter) self.assertIs( middleware._propagator, google_cloud_format.GoogleCloudFormatPropagator) assert isinstance(middleware.sampler, always_on.AlwaysOnSampler) assert isinstance( middleware.exporter, MockCloudExporter) assert isinstance( middleware.propagator, google_cloud_format.GoogleCloudFormatPropagator) self.assertEqual(middleware.exporter.project_id, project_id) self.assertEqual(middleware.exporter.transport, sync.SyncTransport)
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_constructor_ocagent_trace_exporter_default_endpoint(self): from opencensus.ext.django import middleware service_name = 'test_service' params = { 'SERVICE_NAME': service_name, 'TRANSPORT': 'opencensus.common.transports.sync.SyncTransport', } patch_ocagent_trace = mock.patch( 'opencensus.ext.django.config.settings.EXPORTER', ocagent_exporter.TraceExporter) patch_params = mock.patch( 'opencensus.ext.django.config.settings.params', params) with patch_ocagent_trace, patch_params: middleware = middleware.OpencensusMiddleware() self.assertEqual(middleware.exporter.service_name, service_name) self.assertEqual(middleware.exporter.endpoint, ocagent_exporter.DEFAULT_ENDPOINT)
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)