1 |
7a278c5c
|
silhavyj
|
import json
|
2 |
|
|
import requests
|
3 |
|
|
import logging
|
4 |
76b68bb9
|
silhavyj
|
from time import sleep
|
5 |
|
|
from diskcache import Deque
|
6 |
7a278c5c
|
silhavyj
|
from requests import HTTPError, ConnectionError
|
7 |
|
|
|
8 |
957aac06
|
silhavyj
|
from config_manager import server_url, server_port, server_endpoint, cache_dir, \
|
9 |
|
|
cache_retry_period_seconds, cache_max_retries, cache_max_entries
|
10 |
7a278c5c
|
silhavyj
|
|
11 |
d1528a79
|
silhavyj
|
|
12 |
76b68bb9
|
silhavyj
|
_cache = Deque(directory=cache_dir)
|
13 |
7a278c5c
|
silhavyj
|
_uri = server_url + ":" + server_port + server_endpoint
|
14 |
|
|
|
15 |
|
|
|
16 |
|
|
def send_data(payload: dict):
|
17 |
|
|
try:
|
18 |
|
|
logging.info(f"sending payload = {payload} to {_uri}")
|
19 |
|
|
response = requests.post(url=_uri, data=json.dumps(payload))
|
20 |
|
|
logging.info(f"response text: {response.text}")
|
21 |
|
|
except ConnectionError:
|
22 |
|
|
logging.warning(f"sending payload = {payload} to {_uri} failed")
|
23 |
957aac06
|
silhavyj
|
_cache_failed_payload(payload)
|
24 |
7a278c5c
|
silhavyj
|
except HTTPError as error:
|
25 |
|
|
logging.error(f"HTTP Error ({_uri}) payload = {payload}, {error}")
|
26 |
957aac06
|
silhavyj
|
_cache_failed_payload(payload)
|
27 |
|
|
|
28 |
|
|
|
29 |
|
|
def _cache_failed_payload(payload: dict):
|
30 |
|
|
if len(_cache) >= cache_max_entries:
|
31 |
|
|
oldest_payload = _cache.pop()
|
32 |
|
|
logging.warning(f"cache is full - discarding payload = {oldest_payload}")
|
33 |
|
|
|
34 |
|
|
logging.info(f"adding payload = {payload} into cache")
|
35 |
|
|
_cache.append(payload)
|
36 |
76b68bb9
|
silhavyj
|
|
37 |
|
|
|
38 |
|
|
def api_client_run():
|
39 |
|
|
while True:
|
40 |
957aac06
|
silhavyj
|
retries = min(cache_max_retries, len(_cache))
|
41 |
|
|
logging.info(f"emptying the cache ({retries} records)")
|
42 |
|
|
for _ in range(0, retries):
|
43 |
|
|
payload = _cache.pop()
|
44 |
|
|
send_data(payload)
|
45 |
76b68bb9
|
silhavyj
|
sleep(cache_retry_period_seconds)
|