def test__after_request_sampled(self):
        flask_trace_header = 'traceparent'
        trace_id = '2dd43a1d6b2549c6bc2a1a54c2fc0b05'
        span_id = '6e0c63257de34c92'
        flask_trace_id = '00-{}-{}-00'.format(trace_id, span_id)

        app = self.create_app()
        flask_middleware.FlaskMiddleware(app=app,
                                         sampler=samplers.AlwaysOnSampler())

        context = app.test_request_context(
            path='/wiki/Rabbit', headers={flask_trace_header: flask_trace_id})

        with context:
            app.preprocess_request()
            tracer = execution_context.get_opencensus_tracer()
            self.assertIsNotNone(tracer)

            span = tracer.current_span()

            rv = app.dispatch_request()
            app.finalize_request(rv)

            expected_attributes = {
                'http.host': u'localhost',
                'http.method': u'GET',
                'http.path': u'/wiki/Rabbit',
                'http.url': u'http://localhost/wiki/Rabbit',
                'http.route': u'/wiki/<entry>',
                'http.status_code': 200
            }

            self.assertEqual(span.attributes, expected_attributes)
            assert isinstance(span.parent_span, base.NullContextManager)
    def test_init_app_config_zipkin_exporter_service_name_param(self):

        service_name = 'foo'
        host_name = 'localhost'
        port = 1234
        app = mock.Mock()
        app.config = {
            'OPENCENSUS_TRACE': {
                'SAMPLER': ProbabilitySampler,
                'EXPORTER': zipkin_exporter.ZipkinExporter,
                'PROPAGATOR': google_cloud_format.GoogleCloudFormatPropagator,
            },
            'OPENCENSUS_TRACE_PARAMS': {
                'SERVICE_NAME': service_name,
                'ZIPKIN_EXPORTER_HOST_NAME': host_name,
                'ZIPKIN_EXPORTER_PORT': port,
                'ZIPKIN_EXPORTER_PROTOCOL': 'http',
            },
        }

        middleware = flask_middleware.FlaskMiddleware()
        middleware.init_app(app)

        self.assertIs(middleware.app, app)
        self.assertTrue(app.before_request.called)
        self.assertTrue(app.after_request.called)

        assert isinstance(middleware.exporter, zipkin_exporter.ZipkinExporter)
        self.assertEqual(middleware.exporter.service_name, service_name)
        self.assertEqual(middleware.exporter.host_name, host_name)
        self.assertEqual(middleware.exporter.port, port)
    def test_header_encoding(self):
        # The test is for detecting the encoding compatibility issue in
        # Python2 and Python3 and what flask does for encoding the headers.
        # This test case is expected to fail at the check_trace_id method
        # in SpanContext because it cannot match the pattern for trace_id,
        # And a new trace_id will generate for the context.

        flask_trace_header = 'X-Cloud-Trace-Context'
        trace_id = "你好"
        span_id = '6e0c63257de34c92'
        flask_trace_id = '{}/{}'.format(trace_id, span_id)

        app = self.create_app()
        flask_middleware.FlaskMiddleware(app=app)
        context = app.test_request_context(
            path='/', headers={flask_trace_header: flask_trace_id})

        with context:
            app.preprocess_request()
            tracer = execution_context.get_opencensus_tracer()
            self.assertIsNotNone(tracer)

            span = tracer.current_span()

            expected_attributes = {
                'http.url': u'http://localhost/',
                'http.method': 'GET',
            }

            self.assertEqual(span.attributes, expected_attributes)
            assert isinstance(span.parent_span, base.NullContextManager)

            span_context = tracer.span_context
            self.assertNotEqual(span_context.trace_id, trace_id)
    def test_init_app_config_stackdriver_exporter(self):
        app = mock.Mock()
        app.config = {
            'OPENCENSUS_TRACE': {
                'SAMPLER': ProbabilitySampler,
                'EXPORTER': stackdriver_exporter.StackdriverExporter,
                'PROPAGATOR': google_cloud_format.GoogleCloudFormatPropagator,
            },
            'OPENCENSUS_TRACE_PARAMS': {
                'BLACKLIST_PATHS': ['/_ah/health'],
                'GCP_EXPORTER_PROJECT': None,
                'SAMPLING_RATE': 0.5,
                'ZIPKIN_EXPORTER_SERVICE_NAME': 'my_service',
                'ZIPKIN_EXPORTER_HOST_NAME': 'localhost',
                'ZIPKIN_EXPORTER_PORT': 9411,
                'ZIPKIN_EXPORTER_PROTOCOL': 'http',
            },
        }

        class StackdriverExporter(object):
            def __init__(self, *args, **kwargs):
                pass

        middleware = flask_middleware.FlaskMiddleware(
            exporter=StackdriverExporter)
        middleware.init_app(app)

        self.assertIs(middleware.app, app)
        self.assertTrue(app.before_request.called)
        self.assertTrue(app.after_request.called)
    def test__before_request(self):
        from opencensus.trace import execution_context

        flask_trace_header = 'traceparent'
        trace_id = '2dd43a1d6b2549c6bc2a1a54c2fc0b05'
        span_id = '6e0c63257de34c92'
        flask_trace_id = '00-{}-{}-00'.format(trace_id, span_id)

        app = self.create_app()
        flask_middleware.FlaskMiddleware(app=app,
                                         sampler=samplers.AlwaysOnSampler())
        context = app.test_request_context(
            path='/wiki/Rabbit', headers={flask_trace_header: flask_trace_id})

        with context:
            app.preprocess_request()
            tracer = execution_context.get_opencensus_tracer()
            self.assertIsNotNone(tracer)

            span = tracer.current_span()

            expected_attributes = {
                'http.host': u'localhost',
                'http.method': u'GET',
                'http.path': u'/wiki/Rabbit',
                'http.url': u'http://localhost/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)
示例#6
0
    def test_init_app_config_ocagent_trace_exporter_default_endpoint(self):
        app = mock.Mock()
        app.config = {
            'OPENCENSUS_TRACE': {
                'SAMPLER': ProbabilitySampler,
                'EXPORTER': trace_exporter.TraceExporter,
                'PROPAGATOR': google_cloud_format.GoogleCloudFormatPropagator,
            },
            'OPENCENSUS_TRACE_PARAMS': {
                'SERVICE_NAME': 'foo'
            }
        }

        middleware = flask_middleware.FlaskMiddleware()
        middleware.init_app(app)

        self.assertIs(middleware.app, app)
        assert isinstance(
            middleware.exporter, trace_exporter.TraceExporter)
        self.assertEqual(middleware.exporter.service_name, 'foo')
        self.assertEqual(middleware.exporter.endpoint,
                         trace_exporter.DEFAULT_ENDPOINT)

        self.assertTrue(app.before_request.called)
        self.assertTrue(app.after_request.called)
    def test_init_app(self):
        app = mock.Mock()

        middleware = flask_middleware.FlaskMiddleware()
        middleware.init_app(app)

        self.assertIs(middleware.app, app)
        self.assertTrue(app.before_request.called)
        self.assertTrue(app.after_request.called)
    def test_constructor_default(self):
        app = mock.Mock(config={})
        middleware = flask_middleware.FlaskMiddleware(app=app)

        self.assertIs(app, middleware.app)
        self.assertTrue(app.before_request.called)
        self.assertTrue(app.after_request.called)
        assert isinstance(middleware.sampler, always_on.AlwaysOnSampler)
        assert isinstance(middleware.exporter, print_exporter.PrintExporter)
        assert isinstance(middleware.propagator,
                          google_cloud_format.GoogleCloudFormatPropagator)
    def test_constructor_default(self):
        app = mock.Mock(config={})
        middleware = flask_middleware.FlaskMiddleware(app=app)

        self.assertIs(app, middleware.app)
        self.assertTrue(app.before_request.called)
        self.assertTrue(app.after_request.called)
        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_teardown_include_exception(self):
        mock_exporter = mock.MagicMock()
        app = self.create_app()
        flask_middleware.FlaskMiddleware(app=app, exporter=mock_exporter)
        response = app.test_client().get('/error')

        self.assertEqual(response.status_code, 500)

        exported_spandata = mock_exporter.export.call_args[0][0][0]
        self.assertIsInstance(exported_spandata, span_data.SpanData)
        self.assertIsInstance(exported_spandata.status, status.Status)
        self.assertEqual(exported_spandata.status.code, code_pb2.UNKNOWN)
        self.assertEqual(exported_spandata.status.message, 'error')
    def test__after_request_sampled(self):
        flask_trace_header = 'X-Cloud-Trace-Context'
        trace_id = '2dd43a1d6b2549c6bc2a1a54c2fc0b05'
        span_id = '6e0c63257de34c92'
        flask_trace_id = '{}/{}'.format(trace_id, span_id)

        app = self.create_app()
        flask_middleware.FlaskMiddleware(app=app)

        response = app.test_client().get(
            '/', headers={flask_trace_header: flask_trace_id})

        self.assertEqual(response.status_code, 200)
    def test__after_request_not_sampled(self):
        flask_trace_header = 'traceparent'
        trace_id = '2dd43a1d6b2549c6bc2a1a54c2fc0b05'
        span_id = '6e0c63257de34c92'
        flask_trace_id = '00-{}-{}-00'.format(trace_id, span_id)
        sampler = samplers.AlwaysOffSampler()

        app = self.create_app()
        flask_middleware.FlaskMiddleware(app=app, sampler=sampler)

        response = app.test_client().get(
            '/', headers={flask_trace_header: flask_trace_id})

        self.assertEqual(response.status_code, 200)
    def test__after_request_blacklist(self):
        flask_trace_header = 'traceparent'
        trace_id = '2dd43a1d6b2549c6bc2a1a54c2fc0b05'
        span_id = '6e0c63257de34c92'
        flask_trace_id = '00-{}-{}-00'.format(trace_id, span_id)

        app = self.create_app()
        flask_middleware.FlaskMiddleware(app=app)

        response = app.test_client().get(
            '/_ah/health', headers={flask_trace_header: flask_trace_id})

        tracer = execution_context.get_opencensus_tracer()

        self.assertEqual(response.status_code, 200)
        assert isinstance(tracer, noop_tracer.NoopTracer)
    def test_constructor_explicit(self):
        app = mock.Mock(config={})
        sampler = mock.Mock()
        exporter = mock.Mock()
        propagator = mock.Mock()

        middleware = flask_middleware.FlaskMiddleware(app=app,
                                                      sampler=sampler,
                                                      exporter=exporter,
                                                      propagator=propagator)

        self.assertIs(middleware.app, app)
        self.assertIs(middleware.sampler, sampler)
        self.assertIs(middleware.exporter, exporter)
        self.assertIs(middleware.propagator, propagator)
        self.assertTrue(app.before_request.called)
        self.assertTrue(app.after_request.called)
    def test_teardown_include_exception_and_traceback(self):
        mock_exporter = mock.MagicMock()
        app = self.create_app()
        app.config['TESTING'] = True
        flask_middleware.FlaskMiddleware(app=app, exporter=mock_exporter)
        with self.assertRaises(FlaskTestException):
            app.test_client().get('/error')

        exported_spandata = mock_exporter.export.call_args[0][0][0]
        self.assertIsInstance(exported_spandata, span_data.SpanData)
        self.assertIsInstance(exported_spandata.status, status.Status)
        self.assertEqual(exported_spandata.status.code, code_pb2.UNKNOWN)
        self.assertEqual(exported_spandata.status.message, 'error')
        self.assertIsInstance(exported_spandata.stack_trace,
                              stack_trace.StackTrace)
        self.assertIsNotNone(exported_spandata.stack_trace.stack_trace_hash_id)
        self.assertNotEqual(exported_spandata.stack_trace.stack_frames, [])
    def test__before_request_blacklist(self):
        flask_trace_header = 'X-Cloud-Trace-Context'
        trace_id = '2dd43a1d6b2549c6bc2a1a54c2fc0b05'
        span_id = '6e0c63257de34c92'
        flask_trace_id = '{}/{}'.format(trace_id, span_id)

        app = self.create_app()
        flask_middleware.FlaskMiddleware(app=app)
        context = app.test_request_context(
            path='/_ah/health', headers={flask_trace_header: flask_trace_id})

        with context:
            app.preprocess_request()
            tracer = execution_context.get_opencensus_tracer()
            assert isinstance(tracer, noop_tracer.NoopTracer)

            span = tracer.current_span()

            assert isinstance(span, BlankSpan)
    def test_header_is_none(self):
        app = self.create_app()
        flask_middleware.FlaskMiddleware(app=app)
        context = app.test_request_context(path='/')

        with context:
            app.preprocess_request()
            tracer = execution_context.get_opencensus_tracer()
            self.assertIsNotNone(tracer)

            span = tracer.current_span()

            expected_attributes = {
                'http.url': u'http://localhost/',
                'http.method': 'GET',
            }

            self.assertEqual(span.attributes, expected_attributes)
            assert isinstance(span.parent_span, base.NullContextManager)
    def test_teardown_include_exception_and_traceback_span_disabled(self):
        sampler = samplers.AlwaysOffSampler()
        app = self.create_app()
        app.config['TESTING'] = True
        middleware = flask_middleware.FlaskMiddleware(app=app, sampler=sampler)

        # TODO: send trace options in header (#465)
        original_method = middleware.propagator.from_headers

        def nope(*args, **kwargs):
            trace_options = TraceOptions()
            trace_options.set_enabled(False)
            return SpanContext(trace_options=trace_options)

        middleware.propagator.from_headers = nope

        with self.assertRaises(FlaskTestException):
            app.test_client().get('/error')

        middleware.propagator.from_headers = original_method
示例#19
0
    def test_init_app_config(self):
        app = mock.Mock()
        app.config = {
            'OPENCENSUS': {
                'TRACE': {
                    'SAMPLER': 'opencensus.trace.samplers.ProbabilitySampler()',  # noqa
                    'EXPORTER': 'opencensus.trace.print_exporter.PrintExporter()',  # noqa
                    'PROPAGATOR': 'opencensus.trace.propagation.trace_context_http_header_format.TraceContextPropagator()',  # noqa
                }
            }
        }

        middleware = flask_middleware.FlaskMiddleware()
        middleware.init_app(app)

        self.assertIs(middleware.app, app)
        assert isinstance(middleware.exporter, print_exporter.PrintExporter)

        self.assertTrue(app.before_request.called)
        self.assertTrue(app.after_request.called)
    def test__before_request_blacklist(self):
        flask_trace_header = 'traceparent'
        trace_id = '2dd43a1d6b2549c6bc2a1a54c2fc0b05'
        span_id = '6e0c63257de34c92'
        flask_trace_id = '00-{}-{}-00'.format(trace_id, span_id)

        app = self.create_app()
        # Use the AlwaysOnSampler here to prove that the blacklist takes
        # precedence over the sampler
        flask_middleware.FlaskMiddleware(app=app,
                                         sampler=samplers.AlwaysOnSampler())
        context = app.test_request_context(
            path='/_ah/health', headers={flask_trace_header: flask_trace_id})

        with context:
            app.preprocess_request()
            tracer = execution_context.get_opencensus_tracer()
            assert isinstance(tracer, noop_tracer.NoopTracer)

            span = tracer.current_span()

            assert isinstance(span, BlankSpan)
    def test_init_app_config_jaeger_exporter(self):
        service_name = 'foo'
        app = mock.Mock()
        app.config = {
            'OPENCENSUS_TRACE': {
                'SAMPLER': ProbabilitySampler,
                'EXPORTER': jaeger_exporter.JaegerExporter,
                'PROPAGATOR': google_cloud_format.GoogleCloudFormatPropagator,
            },
            'OPENCENSUS_TRACE_PARAMS': {
                'SERVICE_NAME': service_name,
            },
        }

        middleware = flask_middleware.FlaskMiddleware()
        middleware.init_app(app)

        self.assertIs(middleware.app, app)
        self.assertTrue(app.before_request.called)
        self.assertTrue(app.after_request.called)

        assert isinstance(middleware.exporter, jaeger_exporter.JaegerExporter)
        self.assertEqual(middleware.exporter.service_name, service_name)