File tree Expand file tree Collapse file tree 4 files changed +26
-8
lines changed
Expand file tree Collapse file tree 4 files changed +26
-8
lines changed Original file line number Diff line number Diff line change 1616#
1717
1818import atexit
19- from queue import Queue
19+ from queue import Queue , Full
2020from threading import Thread , Event
2121from typing import TYPE_CHECKING
2222
@@ -109,8 +109,7 @@ def connected():
109109
110110
111111def archive (segment : 'Segment' ):
112- if __queue .full ():
112+ try : # unlike checking __queue.full() then inserting, this is atomic
113+ __queue .put (segment , block = False )
114+ except Full :
113115 logger .warning ('the queue is full, the segment will be abandoned' )
114- return
115-
116- __queue .put (segment )
Original file line number Diff line number Diff line change 1818import logging
1919from skywalking .loggings import logger
2020import traceback
21- from queue import Queue , Empty
21+ from queue import Queue , Empty , Full
22+ from time import time
2223
2324import grpc
2425
@@ -68,10 +69,16 @@ def on_error(self):
6869 self .channel .subscribe (self ._cb , try_to_connect = True )
6970
7071 def report (self , queue : Queue , block : bool = True ):
72+ start = time ()
73+ segment = None
74+
7175 def generator ():
76+ nonlocal segment
77+
7278 while True :
7379 try :
74- segment = queue .get (block = block ) # type: Segment
80+ timeout = max (0 , config .QUEUE_TIMEOUT - int (time () - start )) # type: int
81+ segment = queue .get (block = block , timeout = timeout ) # type: Segment
7582 except Empty :
7683 return
7784
@@ -120,5 +127,12 @@ def generator():
120127
121128 try :
122129 self .traces_reporter .report (generator ())
130+
123131 except grpc .RpcError :
124132 self .on_error ()
133+
134+ if segment :
135+ try :
136+ queue .put (segment , block = False )
137+ except Full :
138+ pass
Original file line number Diff line number Diff line change @@ -55,4 +55,4 @@ def __init__(self, channel: grpc.Channel):
5555 self .report_stub = TraceSegmentReportServiceStub (channel )
5656
5757 def report (self , generator ):
58- self .report_stub .collect (generator )
58+ self .report_stub .collect (generator , timeout = config . GRPC_TIMEOUT )
Original file line number Diff line number Diff line change 2323if TYPE_CHECKING :
2424 from typing import List
2525
26+ # In order to prevent timeouts and possible segment loss make sure QUEUE_TIMEOUT is always at least few seconds lower
27+ # than GRPC_TIMEOUT.
28+ GRPC_TIMEOUT = 300 # type: int
29+ QUEUE_TIMEOUT = 240 # type: int
30+
2631RE_IGNORE_PATH = re .compile ('^$' ) # type: re.Pattern
2732
2833service_name = os .getenv ('SW_AGENT_NAME' ) or 'Python Service Name' # type: str
You can’t perform that action at this time.
0 commit comments