Skip to content

Commit 827a017

Browse files
feat: implemented readyz probe
1 parent c2126b3 commit 827a017

File tree

2 files changed

+45
-22
lines changed

2 files changed

+45
-22
lines changed

app.py

Lines changed: 39 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
import io
55
import json
66
import ast
7-
import datetime
87
from http import HTTPStatus
98
import minio
109
import valkey
@@ -44,6 +43,8 @@
4443

4544
valkey_client = valkey.Valkey(host=config["VKURL"], port=config["VKPORT"], db=0)
4645

46+
SENSEBOX_FAIL_COUNT = 0
47+
4748

4849
@app.route(rule="/metrics")
4950
def metrics():
@@ -56,21 +57,11 @@ def print_version():
5657
return jsonify({"version": __version__}), 200
5758

5859

59-
@app.route(rule="/temperature")
60-
def temperature():
61-
v_value = valkey_client.get(name="avg-temp")
62-
if v_value is not None:
63-
v_value = json.loads(
64-
s=json.dumps(
65-
obj=ast.literal_eval(node_or_string=v_value.decode(encoding="UTF-8"))
66-
)
67-
)
68-
if v_value.get("status") == "Internal Error":
69-
return jsonify(v_value), HTTPStatus.INTERNAL_SERVER_ERROR
70-
else:
71-
return jsonify(v_value), HTTPStatus.OK
60+
def query_main_and_store():
7261
api = OpenSenseMap(base_url=BASE_URL)
73-
data, return_code = api.get_avg_temperature(sense_boxes=senseBoxes)
62+
data, return_code, fail_count = api.get_avg_temperature(sense_boxes=senseBoxes)
63+
global SENSEBOX_FAIL_COUNT
64+
SENSEBOX_FAIL_COUNT = fail_count
7465

7566
data_as_bytes = str(object=data).encode(encoding="UTF-8")
7667
data_to_minio_stream = io.BytesIO(initial_bytes=data_as_bytes)
@@ -82,26 +73,54 @@ def temperature():
8273
)
8374

8475
valkey_client.set(name="avg-temp", value=str(object=data), ex=3000)
76+
return jsonify(data), return_code
77+
78+
79+
@app.route(rule="/temperature")
80+
def temperature():
81+
v_value = valkey_client.get(name="avg-temp")
82+
if v_value is not None:
83+
v_value = json.loads(
84+
s=json.dumps(
85+
obj=ast.literal_eval(node_or_string=v_value.decode(encoding="UTF-8"))
86+
)
87+
)
88+
if v_value.get("status") == "Internal Error":
89+
return jsonify(v_value), HTTPStatus.INTERNAL_SERVER_ERROR
90+
return jsonify(v_value), HTTPStatus.OK
8591

8692
total_temp_requests.inc()
87-
return jsonify(data), return_code
93+
return query_main_and_store()
8894

8995

9096
@app.route(rule="/store")
9197
def store():
98+
query_main_and_store()
9299
total_store_requests.inc()
93100
return temperature()
94101

95102

96103
@app.route(rule="/readyz")
97104
def readyz():
98-
# prometheus
99-
pass
105+
most_sense_boxes_working = SENSEBOX_FAIL_COUNT < (len(senseBoxes) // 2) + 1
106+
v_value = valkey_client.get(name="avg-temp")
107+
v_ttl = valkey_client.ttl(name="avg-temp")
108+
109+
if most_sense_boxes_working and v_value is not None and v_ttl > 1:
110+
return str(SENSEBOX_FAIL_COUNT), HTTPStatus.OK
111+
return str(SENSEBOX_FAIL_COUNT), HTTPStatus.INTERNAL_SERVER_ERROR
112+
113+
114+
# Hacky way to populate cache, s3 and senseBox_fail_count
115+
@app.before_request
116+
def first_temp_query():
117+
app.before_request_funcs[None].remove(first_temp_query)
118+
temperature()
100119

101120

102121
if __name__ == "__main__":
103-
bucket_found = minio_client.bucket_exists(bucket_name=bucket_name)
104-
if not bucket_found:
122+
BUCKET_FOUND = minio_client.bucket_exists(bucket_name=bucket_name)
123+
if not BUCKET_FOUND:
105124
minio_client.make_bucket(bucket_name=bucket_name)
106125

107126
from waitress import serve

services/opensensemap.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
class OpenSenseMap:
1010
def __init__(self, base_url):
1111
self.base_url = base_url
12+
self.fail_count = 0
1213

1314
def get_avg_temperature(self, sense_boxes=None):
1415
temperature_info = []
@@ -21,14 +22,15 @@ def get_avg_temperature(self, sense_boxes=None):
2122
return (
2223
({"avg_temp": 0, "status": "Internal Error"}),
2324
HTTPStatus.INTERNAL_SERVER_ERROR,
25+
self.fail_count,
2426
)
2527

2628
if response.status_code == HTTPStatus.OK:
2729
temperature_info.append(
2830
self._process_temperature_data(data=response.json())
2931
)
3032
else:
31-
pass # check stage increment a failure counter
33+
self.fail_count += 1
3234

3335
if temperature_info:
3436
avg_temp = sum(temperature_info) / len(temperature_info)
@@ -42,11 +44,13 @@ def get_avg_temperature(self, sense_boxes=None):
4244
return (
4345
({"avg_temp": round(number=avg_temp, ndigits=2), "status": status}),
4446
HTTPStatus.OK,
47+
self.fail_count,
4548
)
4649

4750
return (
4851
({"avg_temp": 0, "status": "Internal Error"}),
4952
HTTPStatus.INTERNAL_SERVER_ERROR,
53+
self.fail_count,
5054
)
5155

5256
def _process_temperature_data(self, data):
@@ -79,4 +83,4 @@ def _process_temperature_data(self, data):
7983
if date_diff_in_hours < 24 and temperature_value != "":
8084
return float(temperature_value)
8185

82-
return None # handle none
86+
return None

0 commit comments

Comments
 (0)