Source code for opencensus.trace.tracer

# Copyright 2017, OpenCensus Authors
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     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 execution_context
from opencensus.trace import print_exporter
from opencensus.trace import samplers
from opencensus.trace.propagation import trace_context_http_header_format
from opencensus.trace.span_context import SpanContext
from opencensus.trace.tracers import context_tracer
from opencensus.trace.tracers import noop_tracer


[docs]class Tracer(object): """The Tracer is for tracing a request for web applications. :type span_context: :class:`~opencensus.trace.span_context.SpanContext` :param span_context: SpanContext encapsulates the current context within the request's trace. :type sampler: :class:`~opencensus.trace.samplers.base.Sampler` :param sampler: Instances of Sampler objects. Defaults to :class:`.ProbabilitySampler`. Other options include :class:`.AlwaysOnSampler` and :class:`.AlwaysOffSampler`. :type exporter: :class:`~opencensus.trace.base_exporter.exporter` :param exporter: Instances of exporter objects. Default to :class:`.Printexporter`. The rest options are :class:`.Fileexporter`, :class:`.Printexporter`, :class:`.Loggingexporter`, :class:`.Zipkinexporter`, :class:`.GoogleCloudexporter` """ 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 = samplers.ProbabilitySampler() if exporter is None: exporter = print_exporter.PrintExporter() if propagator is None: propagator = \ trace_context_http_header_format.TraceContextPropagator() self.span_context = span_context self.sampler = sampler self.exporter = exporter self.propagator = propagator self.tracer = self.get_tracer() self.store_tracer()
[docs] def should_sample(self): """Determine whether to sample this request or not. If the context enables tracing, return True. Else follow the decision of the sampler. :rtype: bool :returns: Whether to trace the request or not. """ return self.sampler.should_sample(self.span_context)
[docs] def get_tracer(self): """Return a tracer according to the sampling decision.""" sampled = self.should_sample() if sampled: self.span_context.trace_options.set_enabled(True) return context_tracer.ContextTracer( exporter=self.exporter, span_context=self.span_context) return noop_tracer.NoopTracer()
[docs] def store_tracer(self): """Add the current tracer to thread_local""" execution_context.set_opencensus_tracer(self)
[docs] def finish(self): """End all spans.""" self.tracer.finish()
[docs] def span(self, name='span'): """Create a new span with the trace using the context information. :type name: str :param name: The name of the span. :rtype: :class:`~opencensus.trace.span.Span` :returns: The Span object. """ return self.tracer.span(name)
def start_span(self, name='span'): return self.tracer.start_span(name)
[docs] def end_span(self): """End a span. Update the span_id in SpanContext to the current span's parent span id; Update the current span; Send the span to exporter. """ self.tracer.end_span()
[docs] def current_span(self): """Return the current span.""" return self.tracer.current_span()
[docs] def add_attribute_to_current_span(self, attribute_key, attribute_value): """Add attribute to current span. :type attribute_key: str :param attribute_key: Attribute key. :type attribute_value:str :param attribute_value: Attribute value. """ self.tracer.add_attribute_to_current_span( attribute_key, attribute_value)
[docs] def trace_decorator(self): """Decorator to trace a function.""" def decorator(func): def wrapper(*args, **kwargs): self.tracer.start_span(name=func.__name__) return_value = func(*args, **kwargs) self.tracer.end_span() return return_value return wrapper return decorator