Skip to content

Commit

Permalink
NoopSpan on queue full, propagation downstream (#141)
Browse files Browse the repository at this point in the history
  • Loading branch information
tom-pytel authored Aug 4, 2021
1 parent bc99949 commit 4a96ff8
Show file tree
Hide file tree
Showing 5 changed files with 41 additions and 36 deletions.
4 changes: 4 additions & 0 deletions skywalking/agent/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
3 changes: 2 additions & 1 deletion skywalking/plugins/sw_urllib_request.py
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,8 @@ def _sw_open(this: OpenerDirector, fullurl, data=None, timeout=socket._GLOBAL_DE
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)
Expand Down
5 changes: 5 additions & 0 deletions skywalking/trace/carrier.py
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,7 @@ def __init__(self, trace_id: str = '', segment_id: str = '', span_id: str = '',
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
Expand Down Expand Up @@ -101,6 +102,10 @@ def is_valid(self):
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
Expand Down
56 changes: 26 additions & 30 deletions skywalking/trace/context.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -75,12 +76,18 @@ def __init__(self):
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(
Expand All @@ -92,11 +99,11 @@ def new_local_span(self, op: str) -> Span:
)

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:
Expand All @@ -120,12 +127,13 @@ def new_exit_span(self, op: str, peer: str, component: Component = None, inherit
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(
Expand All @@ -142,23 +150,14 @@ def new_exit_span(self, op: str, peer: str, component: Component = None, inherit

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:
Expand Down Expand Up @@ -225,30 +224,27 @@ def continued(self, snapshot: 'Snapshot'):
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(
Expand Down
9 changes: 4 additions & 5 deletions skywalking/trace/span.py
Original file line number Diff line number Diff line change
Expand Up @@ -220,12 +220,11 @@ def inject(self) -> 'Carrier':

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

0 comments on commit 4a96ff8

Please sign in to comment.