@@ -177,7 +177,13 @@ def try_request(self):
177177 self .close_flusher ()
178178 self .exception_flag = True
179179
180- def send_request (self , data ):
180+ def send_request (self , data ): # noqa: max-complexity: 13
181+ """
182+ Send log data to LogDNA server
183+ Returns:
184+ True - discard flush buffer
185+ False - retry, keep flush buffer
186+ """
181187 try :
182188 response = requests .post (url = self .url ,
183189 json = data ,
@@ -190,38 +196,84 @@ def send_request(self, data):
190196 'now' : int (time .time () * 1000 )
191197 },
192198 stream = True ,
199+ allow_redirects = True ,
193200 timeout = self .request_timeout ,
194201 headers = {'user-agent' : self .user_agent })
195202
196- response .raise_for_status ()
197203 status_code = response .status_code
198- if status_code in [401 , 403 ]:
199- self .internalLogger .debug (
200- 'Please provide a valid ingestion key.' +
201- ' Discarding flush buffer' )
202- return True
203-
204+ '''
205+ response code:
206+ 1XX unexpected status
207+ 200 expected status, OK
208+ 2XX unexpected status
209+ 301 302 303 unexpected status,
210+ per "allow_redirects=True"
211+ 3XX unexpected status
212+ 401, 403 expected client error,
213+ invalid ingestion key
214+ 4XX unexpected client error
215+ 500 502 503 507 expected server error, transient
216+ 5XX unexpected server error
217+ handling:
218+ expected status discard flush buffer
219+ unexpected status log + discard flush buffer
220+ expected client error log + discard flush buffer
221+ unexpected client error log + discard flush buffer
222+ expected server error log + retry
223+ unexpected server error log + discard flush buffer
224+ '''
204225 if status_code == 200 :
205- return True
226+ return True # discard
206227
207- if status_code in [400 , 500 , 504 ]:
208- self .internalLogger .debug ('The request failed %s. Retrying...' ,
209- response .reason )
210- return True
228+ if isinstance (response .reason , bytes ):
229+ # We attempt to decode utf-8 first because some servers
230+ # choose to localize their reason strings. If the string
231+ # isn't utf-8, we fall back to iso-8859-1 for all other
232+ # encodings. (See PR #3538)
233+ try :
234+ reason = response .reason .decode ('utf-8' )
235+ except UnicodeDecodeError :
236+ reason = response .reason .decode ('iso-8859-1' )
211237 else :
238+ reason = response .reason
239+
240+ if 200 < status_code <= 399 :
241+ self .internalLogger .debug ('Unexpected response: %s. ' +
242+ 'Discarding flush buffer' ,
243+ reason )
244+ return True # discard
245+
246+ if status_code in [401 , 403 ]:
212247 self .internalLogger .debug (
213- 'The request failed: %s. Retrying...' , response .reason )
248+ 'Please provide a valid ingestion key. ' +
249+ 'Discarding flush buffer' )
250+ return True # discard
251+
252+ if 400 <= status_code <= 499 :
253+ self .internalLogger .debug ('Client Error: %s. ' +
254+ 'Discarding flush buffer' ,
255+ reason )
256+ return True # discard
257+
258+ if status_code in [500 , 502 , 503 , 507 ]:
259+ self .internalLogger .debug ('Server Error: %s. Retrying...' ,
260+ reason )
261+ return False # retry
262+
263+ self .internalLogger .debug ('The request failed: %s.' +
264+ 'Discarding flush buffer' ,
265+ reason )
214266
215267 except requests .exceptions .Timeout as timeout :
216- self .internalLogger .debug ('Timeout error occurred %s. Retrying...' ,
268+ self .internalLogger .debug ('Timeout Error: %s. Retrying...' ,
217269 timeout )
270+ return False # retry
218271
219272 except requests .exceptions .RequestException as exception :
220273 self .internalLogger .debug (
221274 'Error sending logs %s. Discarding flush buffer' , exception )
222- return True
223275
224- return False
276+ return True # discard
225277
226278 def emit (self , record ):
227279 msg = self .format (record )
0 commit comments