Skip to content

Commit ae64102

Browse files
feat: added valkey and minio for caching and s3 storage resp
1 parent 6b28641 commit ae64102

File tree

1 file changed

+74
-9
lines changed

1 file changed

+74
-9
lines changed

app.py

Lines changed: 74 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,44 +1,109 @@
11
# pylint: disable=missing-module-docstring
22
# pylint: disable=missing-function-docstring
33
# import datetime
4+
import io
5+
import json
6+
import ast
7+
import datetime
8+
from http import HTTPStatus
9+
import minio
10+
import valkey
411
from prometheus_client import Counter, generate_latest
512
from dotenv import dotenv_values
613
from flask import Flask, jsonify
714
from version import __version__
815
from services.opensensemap import OpenSenseMap
916

10-
total_version_requests = Counter("version_requests", "Total Number of version requests")
11-
total_temp_requests = Counter("temp_requests", "Total Number of temperature requests")
17+
total_version_requests = Counter(
18+
name="version_requests", documentation="Total Number of version requests"
19+
)
20+
total_temp_requests = Counter(
21+
name="temp_requests", documentation="Total Number of temperature requests"
22+
)
23+
total_store_requests = Counter(
24+
name="store_requests", documentation="Total Number of store requests"
25+
)
26+
1227

1328
BASE_URL = "https://api.opensensemap.org"
1429

15-
config = dotenv_values(".env")
30+
config = dotenv_values(dotenv_path=".env")
31+
32+
senseBoxes = config["SENSEBOXES"].split(sep=",")
33+
34+
app = Flask(import_name=__name__)
1635

17-
senseBoxes = config["SENSEBOXES"].split(",")
36+
bucket_name = config["MBUCKET"]
37+
object_name = config["MOBJECT"]
38+
minio_client = minio.Minio(
39+
endpoint=config["MURL"],
40+
access_key=config["MAK"],
41+
secret_key=config["MSK"],
42+
secure=False,
43+
)
1844

19-
app = Flask(__name__)
45+
valkey_client = valkey.Valkey(host=config["VKURL"], port=config["VKPORT"], db=0)
2046

2147

22-
@app.route("/metrics")
48+
@app.route(rule="/metrics")
2349
def metrics():
2450
return generate_latest()
2551

2652

27-
@app.route("/version")
53+
@app.route(rule="/version")
2854
def print_version():
2955
total_version_requests.inc()
3056
return jsonify({"version": __version__}), 200
3157

3258

33-
@app.route("/temperature")
59+
@app.route(rule="/temperature")
3460
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
3572
api = OpenSenseMap(base_url=BASE_URL)
3673
data, return_code = api.get_avg_temperature(sense_boxes=senseBoxes)
74+
75+
data_as_bytes = str(object=data).encode(encoding="UTF-8")
76+
data_to_minio_stream = io.BytesIO(initial_bytes=data_as_bytes)
77+
minio_client.put_object(
78+
bucket_name=bucket_name,
79+
object_name=object_name,
80+
data=data_to_minio_stream,
81+
length=len(data_as_bytes),
82+
)
83+
84+
valkey_client.set(name="avg-temp", value=str(object=data), ex=3000)
85+
3786
total_temp_requests.inc()
3887
return jsonify(data), return_code
3988

4089

90+
@app.route(rule="/store")
91+
def store():
92+
total_store_requests.inc()
93+
return temperature()
94+
95+
96+
@app.route(rule="/readyz")
97+
def readyz():
98+
# prometheus
99+
pass
100+
101+
41102
if __name__ == "__main__":
103+
bucket_found = minio_client.bucket_exists(bucket_name=bucket_name)
104+
if not bucket_found:
105+
minio_client.make_bucket(bucket_name=bucket_name)
106+
42107
from waitress import serve
43108

44-
serve(app, host=config["HOST"], port=config["PORT"])
109+
serve(app=app, host=config["HOST"], port=config["PORT"])

0 commit comments

Comments
 (0)