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/08/04 00:13:23 UTC
[skywalking-python] branch master updated: NoopSpan on queue full,
propagation downstream (#141)
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 4a96ff8 NoopSpan on queue full, propagation downstream (#141)
4a96ff8 is described below
commit 4a96ff8965a72e42b12e02628626913fceb7a68d
Author: Tomasz Pytel <to...@gmail.com>
AuthorDate: Tue Aug 3 21:13:16 2021 -0300
NoopSpan on queue full, propagation downstream (#141)
---
skywalking/agent/__init__.py | 4 +++
skywalking/plugins/sw_urllib_request.py | 3 +-
skywalking/trace/carrier.py | 5 +++
skywalking/trace/context.py | 56 +++++++++++++++------------------
skywalking/trace/span.py | 9 +++---
5 files changed, 41 insertions(+), 36 deletions(-)
diff --git a/skywalking/agent/__init__.py b/skywalking/agent/__init__.py
index 4587e5e..b473783 100644
--- a/skywalking/agent/__init__.py
+++ b/skywalking/agent/__init__.py
@@ -168,6 +168,10 @@ def started():
return __started
+def isfull():
+ return __queue.full()
+
+
def archive(segment: 'Segment'):
try: # unlike checking __queue.full() then inserting, this is atomic
__queue.put(segment, block=False)
diff --git a/skywalking/plugins/sw_urllib_request.py b/skywalking/plugins/sw_urllib_request.py
index 6b0a64e..9ce904d 100644
--- a/skywalking/plugins/sw_urllib_request.py
+++ b/skywalking/plugins/sw_urllib_request.py
@@ -41,7 +41,8 @@ def install():
span.layer = Layer.Http
code = None
- [fullurl.add_header(item.key, item.val) for item in carrier]
+ for item in carrier:
+ fullurl.add_header(item.key, item.val)
try:
res = _open(this, fullurl, data, timeout)
diff --git a/skywalking/trace/carrier.py b/skywalking/trace/carrier.py
index 0119a9e..fff0a24 100644
--- a/skywalking/trace/carrier.py
+++ b/skywalking/trace/carrier.py
@@ -48,6 +48,7 @@ class Carrier(CarrierItem):
service_instance: str = '', endpoint: str = '', client_address: str = '',
correlation: dict = None): # pyre-ignore
super(Carrier, self).__init__(key='sw8')
+ self.__val = None
self.trace_id = trace_id # type: str
self.segment_id = segment_id # type: str
self.span_id = span_id # type: str
@@ -101,6 +102,10 @@ class Carrier(CarrierItem):
len(self.client_address) > 0 and \
self.span_id.isnumeric()
+ @property
+ def is_suppressed(self): # if is invalid from previous set, ignored or suppressed status propagation downstream
+ return self.__val and not self.is_valid
+
def __iter__(self):
self.__iter_index = 0
return self
diff --git a/skywalking/trace/context.py b/skywalking/trace/context.py
index 5d65a6e..cdd57c4 100644
--- a/skywalking/trace/context.py
+++ b/skywalking/trace/context.py
@@ -16,6 +16,7 @@
#
from skywalking import Component, agent, config
+from skywalking.agent import isfull
from skywalking.trace import ID
from skywalking.trace.carrier import Carrier
from skywalking.trace.segment import Segment, SegmentRef
@@ -75,12 +76,18 @@ class SpanContext(object):
self._correlation = {} # type: dict
self._nspans = 0
+ def ignore_check(self, op: str, kind: Kind, carrier: 'Carrier' = None):
+ if config.RE_IGNORE_PATH.match(op) or isfull() or (carrier is not None and carrier.is_suppressed):
+ return NoopSpan(context=NoopContext())
+
+ return None
+
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()
+ spans = _spans()
parent = spans[-1] if spans else None # type: Span
return Span(
@@ -92,11 +99,11 @@ class SpanContext(object):
)
def new_entry_span(self, op: str, carrier: 'Carrier' = None, inherit: Component = None) -> Span:
- span = self.ignore_check(op, Kind.Entry)
+ span = self.ignore_check(op, Kind.Entry, carrier)
if span is not None:
return span
- spans = _spans_dup()
+ spans = _spans()
parent = spans[-1] if spans else None # type: Span
if parent is not None and parent.kind.is_entry and inherit == parent.component:
@@ -120,12 +127,13 @@ class SpanContext(object):
if span is not None:
return span
- spans = _spans_dup()
+ spans = _spans()
parent = spans[-1] if spans else None # type: Span
if parent is not None and parent.kind.is_exit and component == parent.inherit:
span = parent
span.op = op
+ span.peer = peer
span.component = component
else:
span = ExitSpan(
@@ -142,23 +150,14 @@ class SpanContext(object):
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()
+ spans = _spans_dup()
if span not in spans:
spans.append(span)
def stop(self, span: Span) -> bool:
- spans = _spans()
+ spans = _spans_dup()
span.finish(self.segment)
try:
@@ -225,30 +224,27 @@ class SpanContext(object):
class NoopContext(SpanContext):
def __init__(self):
super().__init__()
- self._depth = 0
- self._noop_span = NoopSpan(self, kind=Kind.Local)
- self.correlation = {} # type: dict
def new_local_span(self, op: str) -> Span:
- return self._noop_span
+ return NoopSpan(self)
def new_entry_span(self, op: str, carrier: 'Carrier' = None, inherit: Component = None) -> Span:
- if carrier is not None:
- self._noop_span.extract(carrier)
- return self._noop_span
+ return NoopSpan(self)
def new_exit_span(self, op: str, peer: str, component: Component = None, inherit: Component = None) -> Span:
- return self._noop_span
-
- def start(self, span: Span):
- self._depth += 1
+ return NoopSpan(self)
def stop(self, span: Span) -> bool:
- self._depth -= 1
- return self._depth == 0
+ spans = _spans_dup()
- def active_span(self):
- return self._noop_span
+ try:
+ spans.remove(span)
+ except Exception:
+ pass
+
+ self._nspans -= 1
+
+ return self._nspans == 0
def capture(self):
return Snapshot(
diff --git a/skywalking/trace/span.py b/skywalking/trace/span.py
index 80f000a..8d265f3 100644
--- a/skywalking/trace/span.py
+++ b/skywalking/trace/span.py
@@ -220,12 +220,11 @@ class ExitSpan(Span):
@tostring
class NoopSpan(Span):
- def __init__(self, context: 'SpanContext' = None, kind: 'Kind' = None):
- Span.__init__(self, context=context, kind=kind)
+ def __init__(self, context: 'SpanContext' = None):
+ Span.__init__(self, context=context, op='', kind=Kind.Local)
def extract(self, carrier: 'Carrier'):
- if carrier is not None:
- self.context._correlation = carrier.correlation_carrier.correlation
+ return
def inject(self) -> 'Carrier':
- return Carrier(correlation=self.context._correlation)
+ return Carrier()