clonable_tracer.py (3145B)
1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\packages\stackless_tracing\clonable_tracer.py 2 from __future__ import absolute_import 3 from beeline.trace import Span, Trace 4 import beeline 5 import logging 6 from . import tasklet_tracer 7 _cut_span_names = set() 8 logger = logging.getLogger(__name__) 9 10 def set_cut_span_names(span_names): 11 global _cut_span_names 12 _cut_span_names = span_names 13 14 15 def is_cut(span_name): 16 return span_name in _cut_span_names 17 18 19 class CloneableTracer(beeline.SynchronousTracer): 20 21 def clone(self): 22 new_tracer = CloneableTracer(self._client) 23 if not self._trace: 24 return None 25 new_tracer._trace = self._trace.copy() 26 new_tracer.sampler_hook = self.sampler_hook 27 return new_tracer 28 29 @staticmethod 30 def get_tasklet_tracer(t): 31 return tasklet_tracer.TaskletTracer(t) 32 33 def has_cut_parent(self): 34 if len(self._trace.stack) == 0: 35 return 36 parent_span = self._trace.stack[-1] 37 return self._was_cut(parent_span) 38 39 def start_or_cut_span(self, span_name, context, trace_id, parent_id): 40 if is_cut(span_name): 41 return self._cut_span(span_name, trace_id, parent_id) 42 if self.has_cut_parent(): 43 context.update({'eve.tracing.has_removed_parents': True}) 44 return self.start_span(context=context, parent_id=parent_id) 45 46 def finish_span(self, span): 47 if self._was_cut(span): 48 return self._pop_cut_span() 49 return super(CloneableTracer, self).finish_span(span) 50 51 def start_or_cut_trace(self, span_name, context, trace_id, parent_id): 52 if is_cut(span_name): 53 return self._cut_span(span_name, trace_id, parent_id) 54 return self.start_trace(context=context, trace_id=trace_id, parent_span_id=parent_id) 55 56 def finish_trace(self, span): 57 if self._was_cut(span): 58 self._pop_cut_span() 59 self._trace = None 60 return 61 return super(CloneableTracer, self).finish_trace(span) 62 63 def _cut_span(self, span_name, trace_id, parent_span_id): 64 if self._trace is None: 65 if trace_id is None or parent_span_id is None: 66 logger.error('cannot cut span, no active trace and supplied trace context is incomplete') 67 return 68 self._trace = Trace(trace_id, None) 69 inactive_span = Span(trace_id=trace_id, parent_id=parent_span_id, id=parent_span_id, event=self._client.new_event(data=self._trace.fields), is_root=len(self._trace.stack) == 0) 70 setattr(inactive_span, 'inactive_span', True) 71 self._trace.stack.append(inactive_span) 72 return inactive_span 73 74 def _was_cut(self, span = None): 75 if span is None: 76 span = self.get_active_span() 77 return hasattr(span, 'inactive_span') 78 79 def _pop_cut_span(self): 80 active_span = self.get_active_span() 81 if not hasattr(active_span, 'inactive_span'): 82 logger.error('invalid cut-span {}\nexpected a span with attribute "inactive_span" set'.format(active_span)) 83 return 84 self._trace.stack.pop()