def test_header_type_error(self): header = 1234 propagator = google_cloud_format.GoogleCloudFormatPropagator() with self.assertRaises(TypeError): propagator.from_header(header)
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()
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)
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)
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)
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)
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()
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)
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)
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)
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)
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)
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)
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()
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)
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()
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)
"/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:
# 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',