1
|
import json
|
2
|
import requests
|
3
|
import logging
|
4
|
from time import sleep
|
5
|
from diskcache import Deque
|
6
|
from requests import HTTPError, ConnectionError
|
7
|
|
8
|
from config_manager import server_url, server_port, server_endpoint, cache_dir, \
|
9
|
cache_retry_period_seconds, cache_max_retries, cache_max_entries
|
10
|
|
11
|
|
12
|
_cache = Deque(directory=cache_dir)
|
13
|
_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
|
_cache_failed_payload(payload)
|
24
|
except HTTPError as error:
|
25
|
logging.error(f"HTTP Error ({_uri}) payload = {payload}, {error}")
|
26
|
_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
|
|
37
|
|
38
|
def api_client_run():
|
39
|
while True:
|
40
|
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
|
sleep(cache_retry_period_seconds)
|