Skip to content
Snippets Groups Projects
Commit b4e4114b authored by lukas leufen's avatar lukas leufen
Browse files

Merge branch 'lukas_issue453_refac_advanced-retry-strategy' into 'develop'

Resolve "advanced retry strategy"

See merge request !516
parents fd584ec4 e9d3aed8
No related branches found
No related tags found
3 merge requests!522filter can now combine obs, forecast, and apriori for first iteration. Further...,!521Resolve "release v2.4.0",!516Resolve "advanced retry strategy"
Pipeline #142753 passed
...@@ -3,6 +3,8 @@ __date__ = '2023-06-01' ...@@ -3,6 +3,8 @@ __date__ = '2023-06-01'
import logging import logging
from typing import Dict, Union, List from typing import Dict, Union, List
import time
import random
import requests import requests
from requests.adapters import HTTPAdapter, Retry from requests.adapters import HTTPAdapter, Retry
...@@ -83,7 +85,7 @@ class EmptyQueryResult(Exception): ...@@ -83,7 +85,7 @@ class EmptyQueryResult(Exception):
pass pass
def get_data(opts: Dict, headers: Dict, as_json: bool = True) -> Union[Dict, List, str]: def get_data(opts: Dict, headers: Dict, as_json: bool = True, max_retries=5, timeout_base=60) -> Union[Dict, List, str]:
""" """
Download join data using requests framework. Download join data using requests framework.
...@@ -96,15 +98,26 @@ def get_data(opts: Dict, headers: Dict, as_json: bool = True) -> Union[Dict, Lis ...@@ -96,15 +98,26 @@ def get_data(opts: Dict, headers: Dict, as_json: bool = True) -> Union[Dict, Lis
:return: requested data (either as list or dictionary) :return: requested data (either as list or dictionary)
""" """
url = create_url(**opts) url = create_url(**opts)
response_error = None
for retry in range(max_retries + 1):
time.sleep(random.random())
try: try:
timeout = timeout_base * (2 ** retry)
logging.info(f"connect (retry={retry}, timeout={timeout}) {url}")
with TimeTracking(name=url): with TimeTracking(name=url):
response = retries_session().get(url, headers=headers, timeout=(5, None)) # timeout=(open, read) session = retries_session(max_retries=0)
response = session.get(url, headers=headers, timeout=(5, timeout)) # timeout=(open, read)
if response.status_code == 200: if response.status_code == 200:
return response.json() if as_json is True else response.text return response.json() if as_json is True else response.text
else: else:
raise EmptyQueryResult(f"There was an error (STATUS {response.status_code}) for request {url}") logging.debug(f"There was an error (STATUS {response.status_code}) for request {url}")
except requests.exceptions.RetryError as e: response_error = f"STATUS {response.status_code}"
raise EmptyQueryResult(f"There was an RetryError for request {url}: {e}") except Exception as e:
time.sleep(retry)
logging.debug(f"There was an error for request {url}: {e}")
response_error = e
if retry + 1 >= max_retries:
raise EmptyQueryResult(f"There was an RetryError for request {url}: {response_error}")
def correct_stat_name(stat: str) -> str: def correct_stat_name(stat: str) -> str:
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment