def begin_span(self, name, span_type, context=None, leaf=False): parent_span = get_span() tracer = self._tracer if parent_span and parent_span.leaf: span = DroppedSpan(parent_span, leaf=True) elif tracer.max_spans and self._span_counter > tracer.max_spans - 1: self.dropped_spans += 1 span = DroppedSpan(parent_span) self._span_counter += 1 else: span = Span(transaction=self, name=name, span_type=span_type, context=context, leaf=leaf) span.frames = tracer.frames_collector_func() span.parent = parent_span self._span_counter += 1 set_span(span) return span
def end_span(self, skip_frames): span = get_span() if span is None: raise LookupError() if isinstance(span, DroppedSpan): set_span(span.parent) return span.duration = _time_func() - span.start_time if not self._tracer.span_frames_min_duration or span.duration >= self._tracer.span_frames_min_duration: span.frames = self._tracer.frames_processing_func(span.frames)[skip_frames:] else: span.frames = None self.spans.append(span) set_span(span.parent) self._tracer.queue_func(SPAN, span.to_dict()) return span