def __init__(self): self.segment = Segment() # type: Segment self._sid = Counter() self._correlation = {} # type: dict
class SpanContext(object): def __init__(self): self.segment = Segment() # type: Segment self._sid = Counter() self._correlation = {} # type: dict def new_local_span(self, op: str) -> Span: span = self.ignore_check(op, Kind.Local) if span is not None: return span spans = _spans_dup() parent = spans[-1] if spans else None # type: Span return Span( context=self, sid=self._sid.next(), pid=parent.sid if parent else -1, op=op, kind=Kind.Local, ) def new_entry_span(self, op: str, carrier: 'Carrier' = None) -> Span: span = self.ignore_check(op, Kind.Entry) if span is not None: return span spans = _spans_dup() parent = spans[-1] if spans else None # type: Span span = parent if parent is not None and parent.kind.is_entry else EntrySpan( context=self, sid=self._sid.next(), pid=parent.sid if parent else -1, ) span.op = op if carrier is not None and carrier.is_valid: span.extract(carrier=carrier) return span def new_exit_span(self, op: str, peer: str, carrier: 'Carrier' = None) -> Span: span = self.ignore_check(op, Kind.Exit) if span is not None: return span spans = _spans_dup() parent = spans[-1] if spans else None # type: Span span = parent if parent is not None and parent.kind.is_exit else ExitSpan( context=self, sid=self._sid.next(), pid=parent.sid if parent else -1, op=op, peer=peer, ) if carrier is not None: span.inject(carrier=carrier) return span def ignore_check(self, op: str, kind: Kind): suffix_idx = op.rfind(".") if suffix_idx > -1 and config.ignore_suffix.find(op[suffix_idx:]) > -1: return NoopSpan( context=NoopContext(), kind=kind, ) if config.trace_ignore: for pattern in config.trace_ignore_path: if fast_path_match(pattern, op): return NoopSpan( context=NoopContext(), kind=kind, ) return None def start(self, span: Span): spans = _spans() if span not in spans: spans.append(span) def stop(self, span: Span) -> bool: spans = _spans() idx = spans.index( span ) # span SHOULD now always be at end even in async-world, but just in case if span.finish(self.segment): del spans[idx] if len(spans) == 0: _local().context = None agent.archive(self.segment) return len(spans) == 0 def active_span(self): spans = _spans() if spans: return spans[len(spans) - 1] return None def get_correlation(self, key): if key in self._correlation: return self._correlation[key] return None def put_correlation(self, key, value): if key is None: return if value is None: self._correlation.pop(key, value) return if len(value) > config.correlation_value_max_length: return if len(self._correlation) > config.correlation_element_max_number: return self._correlation[key] = value def capture(self): spans = _spans() if len(spans) == 0: return None return Snapshot( segment_id=str(self.segment.segment_id), span_id=self.active_span().sid, trace_id=self.segment.related_traces[0], endpoint=spans[0].op, correlation=self._correlation, ) def continued(self, snapshot: 'Snapshot'): if snapshot is None: return None if not snapshot.is_from_current(self) and snapshot.is_valid(): ref = SegmentRef.build_ref(snapshot) span = self.active_span() span.refs.append(ref) self.segment.relate(ID(ref.trace_id)) self._correlation.update(snapshot.correlation)
class SpanContext(object): def __init__(self): self.segment = Segment() # type: Segment self._sid = Counter() self._correlation = {} # type: dict self._nspans = 0 def new_local_span(self, op: str) -> Span: span = self.ignore_check(op, Kind.Local) if span is not None: return span spans = _spans_dup() parent = spans[-1] if spans else None # type: Span return Span( context=self, sid=self._sid.next(), pid=parent.sid if parent else -1, op=op, kind=Kind.Local, ) def new_entry_span(self, op: str, carrier: 'Carrier' = None) -> Span: span = self.ignore_check(op, Kind.Entry) if span is not None: return span spans = _spans_dup() parent = spans[-1] if spans else None # type: Span span = parent if parent is not None and parent.kind.is_entry else EntrySpan( context=self, sid=self._sid.next(), pid=parent.sid if parent else -1, ) span.op = op if carrier is not None and carrier.is_valid: span.extract(carrier=carrier) return span def new_exit_span(self, op: str, peer: str) -> Span: span = self.ignore_check(op, Kind.Exit) if span is not None: return span spans = _spans_dup() parent = spans[-1] if spans else None # type: Span span = parent if parent is not None and parent.kind.is_exit else ExitSpan( context=self, sid=self._sid.next(), pid=parent.sid if parent else -1, op=op, peer=peer, ) return span def ignore_check(self, op: str, kind: Kind): if config.RE_IGNORE_PATH.match(op): return NoopSpan( context=NoopContext(), kind=kind, ) return None def start(self, span: Span): self._nspans += 1 spans = _spans() if span not in spans: spans.append(span) def stop(self, span: Span) -> bool: spans = _spans() span.finish(self.segment) del spans[spans.index(span)] self._nspans -= 1 if self._nspans == 0: _local().context = None agent.archive(self.segment) return True return False def active_span(self): spans = _spans() if spans: return spans[len(spans) - 1] return None def get_correlation(self, key): if key in self._correlation: return self._correlation[key] return None def put_correlation(self, key, value): if key is None: return if value is None: self._correlation.pop(key, value) return if len(value) > config.correlation_value_max_length: return if len(self._correlation) > config.correlation_element_max_number: return self._correlation[key] = value def capture(self): spans = _spans() if len(spans) == 0: return None return Snapshot( segment_id=str(self.segment.segment_id), span_id=self.active_span().sid, trace_id=self.segment.related_traces[0], endpoint=spans[0].op, correlation=self._correlation, ) def continued(self, snapshot: 'Snapshot'): if snapshot is None: return None if not snapshot.is_from_current(self) and snapshot.is_valid(): ref = SegmentRef.build_ref(snapshot) span = self.active_span() span.refs.append(ref) self.segment.relate(ID(ref.trace_id)) self._correlation.update(snapshot.correlation)
def __init__(self): self.spans = [] # type: List[Span] self.segment = Segment() # type: Segment self._sid = Counter()
def __init__(self): self.spans = [] # type: List[Span] self.segment = Segment() # type: Segment self._sid = Counter() self._correlation = {} # type: dict