Skip to content

Commit 877f9e0

Browse files
committed
Code to Review Customer Ticket
1 parent 8d38824 commit 877f9e0

File tree

2 files changed

+48
-3
lines changed

2 files changed

+48
-3
lines changed

scrapeops_scrapy/core/api.py

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -198,10 +198,13 @@ def get(url, proxy=None, check=True):
198198

199199
@staticmethod
200200
def post(url, body=None, files=None, proxy=None):
201+
import logging
202+
logger = logging.getLogger(__name__)
203+
201204
proxies = None
202205
if ProxyNormalizer.unknown_proxy_scheme(proxy) is not True:
203206
proxies = {ProxyNormalizer.get_proxy_scheme(proxy): proxy}
204-
for _ in range(SOPSRequest.RETRY_LIMIT):
207+
for attempt in range(SOPSRequest.RETRY_LIMIT):
205208
try:
206209
response = requests.post(url, json=body, timeout=SOPSRequest.TIMEOUT, files=files, proxies=proxies, headers={'api_key': SOPSRequest.API_KEY})
207210
if response.status_code == 401:
@@ -212,13 +215,26 @@ def post(url, body=None, files=None, proxy=None):
212215
else:
213216
time.sleep(3)
214217
raise ScrapeOpsAPIResponseError
218+
except (TypeError, ValueError) as json_error:
219+
# These are JSON serialization errors - don't retry, log and return immediately
220+
logger.error(
221+
"ScrapeOps: Unable to send monitoring data due to non-serializable settings. "
222+
"Some of your Scrapy settings contain functions or other objects that cannot be "
223+
"converted to JSON format. To resolve this, add the problematic setting names "
224+
"to SCRAPEOPS_SETTINGS_EXCLUSION_LIST in your settings.py file. "
225+
f"Error details: {json_error}"
226+
)
227+
error = json_error
228+
return None, str(error) # Don't retry on serialization errors
215229
except requests.exceptions.ConnectionError as e:
230+
logger.warning(f"ScrapeOps: Connection error (attempt {attempt+1}): {e}")
216231
error = e
217232
continue
218233
except ScrapeOpsAPIResponseError as e:
219234
error = e
220235
continue
221236
except Exception as e:
237+
logger.error(f"ScrapeOps: Unexpected error (attempt {attempt+1}): {e}")
222238
error = e
223239
continue
224240
return None, str(error)

scrapeops_scrapy/core/model.py

Lines changed: 31 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -216,14 +216,43 @@ def check_spider_attributes(self, spider):
216216

217217

218218
def get_settings(self, spider):
219+
import logging
220+
logger = logging.getLogger(__name__)
221+
219222
default_scrapy_settings = default_settings.__dict__
220223
full_settings = spider.settings.copy_to_dict()
221224
self.spider_settings = {}
225+
non_serializable_settings = []
226+
222227
for key, value in full_settings.items():
223228
if key not in default_scrapy_settings and self.include_setting(key):
224-
self.spider_settings[key] = value
229+
if self._is_serializable(value):
230+
self.spider_settings[key] = value
231+
else:
232+
non_serializable_settings.append(key)
225233
elif default_scrapy_settings.get(key) != value and self.include_setting(key):
226-
self.spider_settings[key] = value
234+
if self._is_serializable(value):
235+
self.spider_settings[key] = value
236+
else:
237+
non_serializable_settings.append(key)
238+
239+
# Log warning about non-serializable settings
240+
if non_serializable_settings:
241+
logger.warning(
242+
f"ScrapeOps: Excluded {len(non_serializable_settings)} non-serializable settings from monitoring: "
243+
f"{', '.join(non_serializable_settings)}. "
244+
f"These settings contain functions or other objects that cannot be sent to ScrapeOps. "
245+
f"To suppress this warning, add these setting names to SCRAPEOPS_SETTINGS_EXCLUSION_LIST in your settings.py file."
246+
)
247+
248+
def _is_serializable(self, value):
249+
"""Check if a value can be JSON serialized."""
250+
import json
251+
try:
252+
json.dumps(value)
253+
return True
254+
except (TypeError, ValueError):
255+
return False
227256

228257
def include_setting(self, key):
229258
exclusion_terms = ['API_KEY', 'APIKEY', 'SECRET_KEY', 'SECRETKEY', 'PASSWORD', 'CONNECTION_STRING']

0 commit comments

Comments
 (0)