You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@skywalking.apache.org by ke...@apache.org on 2021/09/11 01:59:14 UTC
[skywalking-python] branch master updated: Spans correctly
reference finished parents (#161)
This is an automated email from the ASF dual-hosted git repository.
kezhenxu94 pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/skywalking-python.git
The following commit(s) were added to refs/heads/master by this push:
new 91c315b Spans correctly reference finished parents (#161)
91c315b is described below
commit 91c315b2b618c39fe534c299618efb0bf42a6e8b
Author: Tomasz Pytel <to...@gmail.com>
AuthorDate: Fri Sep 10 22:59:07 2021 -0300
Spans correctly reference finished parents (#161)
---
skywalking/trace/context.py | 51 ++++++++++++++++++++++++++-------------------
skywalking/trace/span.py | 22 ++++++++-----------
2 files changed, 39 insertions(+), 34 deletions(-)
diff --git a/skywalking/trace/context.py b/skywalking/trace/context.py
index 9ffd8e4..8846207 100644
--- a/skywalking/trace/context.py
+++ b/skywalking/trace/context.py
@@ -87,6 +87,31 @@ class SpanContext(object):
return None
+ def new_span(self, parent: Span, SpanType: type, **kwargs) -> Span:
+ finished = parent and not parent._depth
+ context = SpanContext() if finished else self
+ span = SpanType(context=context,
+ sid=context._sid.next(),
+ pid=parent.sid if parent and not finished else -1,
+ **kwargs)
+
+ # if parent finished and segment was archived before this child starts then we need to refer to parent
+ if finished:
+ carrier = Carrier(
+ trace_id=str(parent.context.segment.related_traces[0]),
+ segment_id=str(parent.context.segment.segment_id),
+ span_id=str(parent.sid),
+ service=config.service_name,
+ service_instance=config.service_instance,
+ endpoint=parent.op,
+ client_address=parent.peer,
+ correlation=parent.context._correlation,
+ )
+
+ Span.extract(span, carrier)
+
+ return span
+
def new_local_span(self, op: str) -> Span:
span = self.ignore_check(op, Kind.Local)
if span is not None:
@@ -95,13 +120,7 @@ class SpanContext(object):
spans = _spans()
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,
- )
+ return self.new_span(parent, Span, op=op, kind=Kind.Local)
def new_entry_span(self, op: str, carrier: 'Carrier' = None, inherit: Component = None) -> Span:
span = self.ignore_check(op, Kind.Entry, carrier)
@@ -124,13 +143,9 @@ class SpanContext(object):
span = parent
span.op = op
+
else:
- span = EntrySpan(
- context=self,
- sid=self._sid.next(),
- pid=parent.sid if parent else -1,
- op=op,
- )
+ span = self.new_span(parent, EntrySpan, op=op)
if carrier is not None and carrier.is_valid: # TODO: should this be done irrespective of inheritance?
span.extract(carrier=carrier)
@@ -150,15 +165,9 @@ class SpanContext(object):
span.op = op
span.peer = peer
span.component = component
+
else:
- span = ExitSpan(
- context=self,
- sid=self._sid.next(),
- pid=parent.sid if parent else -1,
- op=op,
- peer=peer,
- component=component,
- )
+ span = self.new_span(parent, ExitSpan, op=op, peer=peer, component=component)
if inherit:
span.inherit = inherit
diff --git a/skywalking/trace/span.py b/skywalking/trace/span.py
index dd39036..cea35bb 100644
--- a/skywalking/trace/span.py
+++ b/skywalking/trace/span.py
@@ -123,6 +123,15 @@ class Span(ABC):
self.context.segment.relate(ID(carrier.trace_id))
self.context._correlation = carrier.correlation_carrier.correlation
+
+ if not carrier.is_valid:
+ return self
+
+ ref = SegmentRef(carrier=carrier)
+
+ if ref not in self.refs:
+ self.refs.append(ref)
+
return self
def __enter__(self):
@@ -171,19 +180,6 @@ class EntrySpan(Span):
self.logs = []
self.tags = defaultdict(list)
- def extract(self, carrier: 'Carrier') -> 'Span':
- Span.extract(self, carrier)
-
- if carrier is None or not carrier.is_valid:
- return self
-
- ref = SegmentRef(carrier=carrier)
-
- if ref not in self.refs:
- self.refs.append(ref)
-
- return self
-
@tostring
class ExitSpan(Span):