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