NovaBryan/EVE_Dump
Log | Files | 📦 下载最新源码 (.zip) | Refs | README

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()