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 |
|
|
|
9 |
474551ae
|
silhavyj
|
_uri = None
|
10 |
|
|
_cache = None
|
11 |
|
|
_config = None
|
12 |
d1528a79
|
silhavyj
|
|
13 |
474551ae
|
silhavyj
|
|
14 |
|
|
def api_client_set_config(config):
|
15 |
|
|
global _config, _cache, _uri
|
16 |
|
|
_config = config
|
17 |
|
|
_cache = Deque(directory=_config.cache_dir)
|
18 |
|
|
_uri = config.server_url + ":" + config.server_port + config.server_endpoint
|
19 |
7a278c5c
|
silhavyj
|
|
20 |
|
|
|
21 |
|
|
def send_data(payload: dict):
|
22 |
|
|
try:
|
23 |
|
|
logging.info(f"sending payload = {payload} to {_uri}")
|
24 |
|
|
response = requests.post(url=_uri, data=json.dumps(payload))
|
25 |
|
|
logging.info(f"response text: {response.text}")
|
26 |
|
|
except ConnectionError:
|
27 |
|
|
logging.warning(f"sending payload = {payload} to {_uri} failed")
|
28 |
957aac06
|
silhavyj
|
_cache_failed_payload(payload)
|
29 |
7a278c5c
|
silhavyj
|
except HTTPError as error:
|
30 |
|
|
logging.error(f"HTTP Error ({_uri}) payload = {payload}, {error}")
|
31 |
957aac06
|
silhavyj
|
_cache_failed_payload(payload)
|
32 |
|
|
|
33 |
|
|
|
34 |
|
|
def _cache_failed_payload(payload: dict):
|
35 |
474551ae
|
silhavyj
|
if len(_cache) >= _config.cache_max_entries:
|
36 |
957aac06
|
silhavyj
|
oldest_payload = _cache.pop()
|
37 |
|
|
logging.warning(f"cache is full - discarding payload = {oldest_payload}")
|
38 |
|
|
|
39 |
|
|
logging.info(f"adding payload = {payload} into cache")
|
40 |
|
|
_cache.append(payload)
|
41 |
76b68bb9
|
silhavyj
|
|
42 |
|
|
|
43 |
474551ae
|
silhavyj
|
def _resend_cached_payloads():
|
44 |
|
|
retries = min(_config.cache_max_retries, len(_cache))
|
45 |
|
|
logging.info(f"emptying the cache ({retries} records)")
|
46 |
|
|
for _ in range(0, retries):
|
47 |
|
|
payload = _cache.pop()
|
48 |
|
|
send_data(payload)
|
49 |
|
|
|
50 |
|
|
|
51 |
76b68bb9
|
silhavyj
|
def api_client_run():
|
52 |
|
|
while True:
|
53 |
474551ae
|
silhavyj
|
_resend_cached_payloads()
|
54 |
|
|
sleep(_config.cache_retry_period_seconds)
|