コード例 #1
0
    def test_header_type_error(self):
        header = 1234

        propagator = google_cloud_format.GoogleCloudFormatPropagator()

        with self.assertRaises(TypeError):
            propagator.from_header(header)
コード例 #2
0
    async def middleware(request, handler):
        if handler.__name__ == "health_check":
            return await handler(request)
        span = None
        tracer = None
        try:
            propagator = google_cloud_format.GoogleCloudFormatPropagator()
            span_context = propagator.from_headers(request.headers)
            tracer = initialize_tracer(project_id, span_context, propagator)
            span = tracer.start_span()
            span.name = handler.__name__
            tracer.add_attribute_to_current_span(HTTP_HOST, request.host)
            tracer.add_attribute_to_current_span(HTTP_METHOD, request.method)
            tracer.add_attribute_to_current_span(HTTP_PATH, request.path)
            tracer.add_attribute_to_current_span(HTTP_URL, str(request.url))
            request["trace_header"] = propagator.to_headers(span_context)
        except:  # NOQA
            logging.exception("Could not initialize the tracer")

        try:
            response = await handler(request)
            if tracer:
                tracer.add_attribute_to_current_span(HTTP_STATUS_CODE,
                                                     response.status)
            return response
        finally:
            if tracer:
                tracer.end_span()
コード例 #3
0
    def test_from_header_no_header(self):
        from opencensus.trace.span_context import SpanContext

        propagator = google_cloud_format.GoogleCloudFormatPropagator()
        span_context = propagator.from_header(None)

        assert isinstance(span_context, SpanContext)
コード例 #4
0
    def test_header_not_match(self):
        header = 'invalid_trace_id/66666;o=1'
        trace_id = 'invalid_trace_id'

        propagator = google_cloud_format.GoogleCloudFormatPropagator()
        span_context = propagator.from_header(header)

        self.assertNotEqual(span_context.trace_id, trace_id)
コード例 #5
0
    def test_tracer(self):
        import json

        from opencensus.trace import file_exporter
        from opencensus.trace import samplers
        from opencensus.trace import tracer as tracer_module
        from opencensus.trace.propagation import google_cloud_format

        trace_id = 'f8739df974a4481f98748cd92b27177d'
        span_id = '6e0c63257de34c92'
        trace_option = 1

        trace_header = '{}/{};o={}'.format(
            trace_id, int(span_id, 16), trace_option)

        sampler = samplers.AlwaysOnSampler()
        exporter = file_exporter.FileExporter()
        propagator = google_cloud_format.GoogleCloudFormatPropagator()
        span_context = propagator.from_header(header=trace_header)

        tracer = tracer_module.Tracer(
            span_context=span_context,
            sampler=sampler,
            exporter=exporter,
            propagator=propagator
        )

        with tracer.span(name='root_span') as root:
            func_to_trace()
            parent_span_id = root.span_id
            with root.span(name='child_span'):
                func_to_trace()

        tracer.finish()

        file = open(file_exporter.DEFAULT_FILENAME, 'r')
        trace_json = json.loads(file.read())

        spans = trace_json.get('spans')

        self.assertEqual(trace_json.get('traceId'), trace_id)
        self.assertEqual(len(spans), 2)

        self.assertSetEqual(
            {ss['displayName']['value'] for ss in spans},
            {'child_span', 'root_span'})

        for span in spans:
            if span['displayName']['value'] == 'root_span':
                self.assertEqual(span['parentSpanId'], span_id)
                self.assertEqual(span['childSpanCount'], 1)
            else:
                self.assertEqual(span['displayName']['value'], 'child_span')
                self.assertEqual(span['parentSpanId'], parent_span_id)
                self.assertEqual(span['childSpanCount'], 0)
コード例 #6
0
    def test_header_match_no_option(self):
        header = '6e0c63257de34c92bf9efcd03927272e/00f067aa0ba902b7'
        expected_trace_id = '6e0c63257de34c92bf9efcd03927272e'
        expected_span_id = '00f067aa0ba902b7'

        propagator = google_cloud_format.GoogleCloudFormatPropagator()
        span_context = propagator.from_header(header)

        self.assertEqual(span_context.trace_id, expected_trace_id)
        self.assertEqual(span_context.span_id, expected_span_id)
        self.assertTrue(span_context.trace_options.enabled)
コード例 #7
0
    def __init__(self, app, sampler=None, reporter=None, propagator=None):
        if sampler is None:
            sampler = always_on.AlwaysOnSampler()

        if reporter is None:
            reporter = print_reporter.PrintReporter()

        if propagator is None:
            propagator = google_cloud_format.GoogleCloudFormatPropagator()

        self.app = app
        self.sampler = sampler
        self.reporter = reporter
        self.propagator = propagator
        self.setup_trace()
コード例 #8
0
    def test_headers_match(self):
        # Trace option is enabled.
        headers = {
            'X-Cloud-Trace-Context':
            '6e0c63257de34c92bf9efcd03927272e/00f067aa0ba902b7;o=1',
        }
        expected_trace_id = '6e0c63257de34c92bf9efcd03927272e'
        expected_span_id = '00f067aa0ba902b7'

        propagator = google_cloud_format.GoogleCloudFormatPropagator()
        span_context = propagator.from_headers(headers)

        self.assertEqual(span_context.trace_id, expected_trace_id)
        self.assertEqual(span_context.span_id, expected_span_id)
        self.assertTrue(span_context.trace_options.enabled)
コード例 #9
0
    def test_to_header(self):
        from opencensus.trace import span_context

        trace_id = '6e0c63257de34c92bf9efcd03927272e'
        span_id = 1234
        span_context = span_context.SpanContext(trace_id=trace_id,
                                                span_id=span_id,
                                                enabled=True)

        propagator = google_cloud_format.GoogleCloudFormatPropagator()

        header = propagator.to_header(span_context)
        expected_header = '{}/{};o={}'.format(trace_id, span_id, 1)

        self.assertEqual(header, expected_header)
コード例 #10
0
    def test_header_match(self):
        # Trace option is not enabled.
        header = '6e0c63257de34c92bf9efcd03927272e/1234;o=0'
        expected_trace_id = '6e0c63257de34c92bf9efcd03927272e'
        expected_span_id = 1234

        propagator = google_cloud_format.GoogleCloudFormatPropagator()
        span_context = propagator.from_header(header)

        self.assertEqual(span_context.trace_id, expected_trace_id)
        self.assertEqual(span_context.span_id, expected_span_id)
        self.assertFalse(span_context.enabled)

        # Trace option is enabled.
        header = '6e0c63257de34c92bf9efcd03927272e/1234;o=1'
        expected_trace_id = '6e0c63257de34c92bf9efcd03927272e'
        expected_span_id = 1234

        propagator = google_cloud_format.GoogleCloudFormatPropagator()
        span_context = propagator.from_header(header)

        self.assertEqual(span_context.trace_id, expected_trace_id)
        self.assertEqual(span_context.span_id, expected_span_id)
        self.assertTrue(span_context.enabled)
コード例 #11
0
    def __init__(self,
                 span_context=None,
                 sampler=None,
                 reporter=None,
                 propagator=None):
        if propagator is None:
            propagator = google_cloud_format.GoogleCloudFormatPropagator()

        if span_context is None:
            header = get_webapp2_header()
            span_context = propagator.from_header(header)

        super(WebApp2Tracer, self).__init__(span_context=span_context,
                                            sampler=sampler,
                                            reporter=reporter,
                                            propagator=propagator)
コード例 #12
0
    def test_to_header(self):
        from opencensus.trace import span_context
        from opencensus.trace import trace_options

        trace_id = '6e0c63257de34c92bf9efcd03927272e'
        span_id = '00f067aa0ba902b7'
        span_context = span_context.SpanContext(
            trace_id=trace_id,
            span_id=span_id,
            trace_options=trace_options.TraceOptions('1'))

        propagator = google_cloud_format.GoogleCloudFormatPropagator()

        header = propagator.to_header(span_context)
        expected_header = '{}/{};o={}'.format(trace_id, span_id, 1)

        self.assertEqual(header, expected_header)
コード例 #13
0
    def test_tracer(self):
        import json

        from opencensus.trace import tracer as tracer_module
        from opencensus.trace.samplers import always_on
        from opencensus.trace.exporters import file_exporter
        from opencensus.trace.propagation import google_cloud_format

        trace_id = 'f8739df974a4481f98748cd92b27177d'
        span_id = '16971691944144156899'
        trace_option = 1

        trace_header = '{}/{};o={}'.format(trace_id, span_id, trace_option)

        sampler = always_on.AlwaysOnSampler()
        exporter = file_exporter.FileExporter()
        propagator = google_cloud_format.GoogleCloudFormatPropagator()
        span_context = propagator.from_header(header=trace_header)

        tracer = tracer_module.Tracer(span_context=span_context,
                                      sampler=sampler,
                                      exporter=exporter,
                                      propagator=propagator)

        with tracer.span(name='root_span') as root:
            func_to_trace()
            parent_span_id = root.span_id
            with root.span(name='child_span'):
                func_to_trace()

        tracer.finish()

        file = open(file_exporter.DEFAULT_FILENAME, 'r')
        trace_json = json.loads(file.read())

        spans = trace_json.get('spans')

        self.assertEqual(trace_json.get('traceId'), trace_id)
        self.assertEqual(len(spans), 2)

        for span in spans:
            if span.get('displayName').get('value') == 'root_span':
                self.assertEqual(str(span.get('parentSpanId')), span_id)
            else:
                self.assertEqual(span.get('parentSpanId'), parent_span_id)
コード例 #14
0
    def __init__(self,
                 app,
                 blacklist_paths=None,
                 sampler=None,
                 exporter=None,
                 propagator=None):
        if sampler is None:
            sampler = always_on.AlwaysOnSampler()

        if exporter is None:
            exporter = print_exporter.PrintExporter()

        if propagator is None:
            propagator = google_cloud_format.GoogleCloudFormatPropagator()

        self.app = app
        self.blacklist_paths = blacklist_paths
        self.sampler = sampler
        self.exporter = exporter
        self.propagator = propagator
        self.setup_trace()
コード例 #15
0
    def test_constructor_explicit(self):
        from opencensus.trace import span_context
        from opencensus.trace.reporters import print_reporter
        from opencensus.trace.samplers import always_on
        from opencensus.trace.propagation import google_cloud_format
        from opencensus.trace.tracer import webapp2_tracer

        trace_id = '6e0c63257de34c92bf9efcd03927272e'
        span_context = span_context.SpanContext(trace_id=trace_id)
        sampler = always_on.AlwaysOnSampler()
        reporter = print_reporter.PrintReporter()
        propagator = google_cloud_format.GoogleCloudFormatPropagator()

        tracer = webapp2_tracer.WebApp2Tracer(span_context=span_context,
                                              sampler=sampler,
                                              reporter=reporter,
                                              propagator=propagator)

        self.assertEqual(tracer.span_context, span_context)
        self.assertEqual(tracer.sampler, sampler)
        self.assertEqual(tracer.reporter, reporter)
        self.assertEqual(tracer.propagator, propagator)
コード例 #16
0
    def __init__(self,
                 span_context=None,
                 sampler=None,
                 exporter=None,
                 propagator=None):
        if span_context is None:
            span_context = SpanContext()

        if sampler is None:
            sampler = always_on.AlwaysOnSampler()

        if exporter is None:
            exporter = print_exporter.PrintExporter()

        if propagator is None:
            propagator = google_cloud_format.GoogleCloudFormatPropagator()

        self.span_context = span_context
        self.sampler = sampler
        self.exporter = exporter
        self.propagator = propagator
        self.tracer = self.get_tracer()
        self.store_tracer()
コード例 #17
0
def initialize_tracer(request: 'flask.Request') -> tracer.Tracer:
    if TRACE_PROPAGATE == "google":
        propagator = google_cloud_format.GoogleCloudFormatPropagator()
    else:
        propagator = trace_context_http_header_format.TraceContextPropagator()
    if TRACE_EXPORTER == "stackdriver":
        exporter = trace_exporter.StackdriverExporter(transport=AsyncTransport)
        sampler = samplers.AlwaysOnSampler()
    elif TRACE_EXPORTER == "log":
        exporter = logging_exporter.LoggingExporter(
            handler=py_logging.NullHandler(), transport=AsyncTransport)
        sampler = samplers.AlwaysOnSampler()
    elif TRACE_EXPORTER == "stdout":
        exporter = print_exporter.PrintExporter(transport=AsyncTransport)
        sampler = samplers.AlwaysOnSampler()
    else:
        exporter = print_exporter.PrintExporter(transport=AsyncTransport)
        sampler = samplers.AlwaysOffSampler()
    span_context = propagator.from_headers(request.headers)
    return tracer.Tracer(exporter=exporter,
                         sampler=sampler,
                         propagator=propagator,
                         span_context=span_context)
コード例 #18
0
ファイル: server.py プロジェクト: jazzPouls/pulse-data
            "/scraper/": samplers.ProbabilitySampler(),
            "/scrape_aggregate_reports/": samplers.ProbabilitySampler(),
        },
        # For other requests, trace 1 in 20.
        default_sampler=samplers.ProbabilitySampler(rate=0.05),
    )
else:
    trace_exporter = file_exporter.FileExporter(file_name="traces")
    trace_sampler = samplers.AlwaysOnSampler()

middleware = FlaskMiddleware(
    app,
    excludelist_paths=["metadata", "computeMetadata"],  # Don't trace metadata requests
    sampler=trace_sampler,
    exporter=trace_exporter,
    propagator=google_cloud_format.GoogleCloudFormatPropagator(),
)
config_integration.trace_integrations(
    [
        # TODO(#4283): The 'google_cloud_clientlibs' integration is currently not compatible with the
        # 'proto-plus' objects used by the 2.0.0 versions of the client libraries. Investigate best way to hydrate
        # spans in traces for these calls in the future.
        "google_cloud_clientlibs",
        "requests",
        "sqlalchemy",
    ]
)


@zope.event.classhandler.handler(events.MemoryUsageThresholdExceeded)
def memory_condition_handler(event: events.MemoryUsageThresholdExceeded) -> None:
コード例 #19
0
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

from opencensus.trace import print_exporter
from opencensus.trace.samplers import always_on
from opencensus.trace.propagation import google_cloud_format

DEFAULT_PYRAMID_TRACER_CONFIG = {
    'SAMPLER': always_on.AlwaysOnSampler(),
    'EXPORTER': print_exporter.PrintExporter(),
    'PROPAGATOR': google_cloud_format.GoogleCloudFormatPropagator()
}

DEFAULT_PYRAMID_TRACER_PARAMS = {
    # https://cloud.google.com/appengine/docs/flexible/python/
    # how-instances-are-managed#health_checking
    'BLACKLIST_PATHS': ['_ah/health'],
}


class PyramidTraceSettings(object):
    def __init__(self, registry):
        self.settings = registry.settings.get('OPENCENSUS_TRACE',
                                              DEFAULT_PYRAMID_TRACER_CONFIG)

        self.params = registry.settings.get('OPENCENSUS_TRACE_PARAMS',