Skip to content

Commit f623b45

Browse files
author
Paul V Craven
committed
Update code to retry web API calls for fetching datafile and pushing events
1 parent 45e73bb commit f623b45

File tree

3 files changed

+41
-8
lines changed

3 files changed

+41
-8
lines changed

optimizely/config_manager.py

+26-6
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@
1919
import threading
2020
from requests import codes as http_status_codes
2121
from requests import exceptions as requests_exceptions
22+
from requests.adapters import HTTPAdapter
23+
from urllib3.util.retry import Retry
2224

2325
from . import exceptions as optimizely_exceptions
2426
from . import logger as optimizely_logger
@@ -200,6 +202,7 @@ def __init__(
200202
error_handler: Optional[BaseErrorHandler] = None,
201203
notification_center: Optional[NotificationCenter] = None,
202204
skip_json_validation: Optional[bool] = False,
205+
retries: Optional[int] = 3,
203206
):
204207
""" Initialize config manager. One of sdk_key or datafile has to be set to be able to use.
205208
@@ -244,6 +247,7 @@ def __init__(
244247
self.stopped = threading.Event()
245248
self._initialize_thread()
246249
self._polling_thread.start()
250+
self.retries = retries
247251

248252
@staticmethod
249253
def get_datafile_url(sdk_key: Optional[str], url: Optional[str], url_template: Optional[str]) -> str:
@@ -391,9 +395,17 @@ def fetch_datafile(self) -> None:
391395
request_headers[enums.HTTPHeaders.IF_MODIFIED_SINCE] = self.last_modified
392396

393397
try:
394-
response = requests.get(
395-
self.datafile_url, headers=request_headers, timeout=enums.ConfigManager.REQUEST_TIMEOUT,
396-
)
398+
print(f"Getting {self.datafile_url}")
399+
session = requests.Session()
400+
401+
retries = Retry(total=self.retries,
402+
backoff_factor=0.1,
403+
status_forcelist=[ 500, 502, 503, 504 ])
404+
adapter = HTTPAdapter(max_retries=retries)
405+
406+
session.mount('http://', adapter)
407+
session.mount("https://", adapter)
408+
response = session.get(self.datafile_url, timeout=enums.ConfigManager.REQUEST_TIMEOUT)
397409
except requests_exceptions.RequestException as err:
398410
self.logger.error(f'Fetching datafile from {self.datafile_url} failed. Error: {err}')
399411
return
@@ -475,9 +487,17 @@ def fetch_datafile(self) -> None:
475487
request_headers[enums.HTTPHeaders.IF_MODIFIED_SINCE] = self.last_modified
476488

477489
try:
478-
response = requests.get(
479-
self.datafile_url, headers=request_headers, timeout=enums.ConfigManager.REQUEST_TIMEOUT,
480-
)
490+
print(f"Getting {self.datafile_url}")
491+
session = requests.Session()
492+
493+
retries = Retry(total=self.retries,
494+
backoff_factor=0.1,
495+
status_forcelist=[ 500, 502, 503, 504 ])
496+
adapter = HTTPAdapter(max_retries=retries)
497+
498+
session.mount('http://', adapter)
499+
session.mount("https://", adapter)
500+
response = session.get(self.datafile_url, timeout=enums.ConfigManager.REQUEST_TIMEOUT)
481501
except requests_exceptions.RequestException as err:
482502
self.logger.error(f'Fetching datafile from {self.datafile_url} failed. Error: {err}')
483503
return

optimizely/event_dispatcher.py

+14-2
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@
1717

1818
import requests
1919
from requests import exceptions as request_exception
20+
from requests.adapters import HTTPAdapter
21+
from urllib3.util.retry import Retry
2022

2123
from . import event_builder
2224
from .helpers.enums import HTTPVerbs, EventDispatchConfig
@@ -44,11 +46,21 @@ def dispatch_event(event: event_builder.Event) -> None:
4446
event: Object holding information about the request to be dispatched to the Optimizely backend.
4547
"""
4648
try:
49+
session = requests.Session()
50+
51+
retries = Retry(total=EventDispatchConfig.REQUEST_TIMEOUT,
52+
backoff_factor=0.1,
53+
status_forcelist=[ 500, 502, 503, 504 ])
54+
adapter = HTTPAdapter(max_retries=retries)
55+
56+
session.mount('http://', adapter)
57+
session.mount("https://", adapter)
58+
4759
if event.http_verb == HTTPVerbs.GET:
48-
requests.get(event.url, params=event.params,
60+
session.get(event.url, params=event.params,
4961
timeout=EventDispatchConfig.REQUEST_TIMEOUT).raise_for_status()
5062
elif event.http_verb == HTTPVerbs.POST:
51-
requests.post(
63+
session.post(
5264
event.url, data=json.dumps(event.params), headers=event.headers,
5365
timeout=EventDispatchConfig.REQUEST_TIMEOUT,
5466
).raise_for_status()

optimizely/helpers/enums.py

+1
Original file line numberDiff line numberDiff line change
@@ -198,6 +198,7 @@ class VersionType:
198198
class EventDispatchConfig:
199199
"""Event dispatching configs."""
200200
REQUEST_TIMEOUT: Final = 10
201+
RETRIES: Final = 2
201202

202203

203204
class OdpEventApiConfig:

0 commit comments

Comments
 (0)