|
1 | 1 | # pylint: disable=missing-module-docstring |
2 | 2 | # pylint: disable=missing-function-docstring |
3 | 3 | # 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 |
4 | 11 | from prometheus_client import Counter, generate_latest |
5 | 12 | from dotenv import dotenv_values |
6 | 13 | from flask import Flask, jsonify |
7 | 14 | from version import __version__ |
8 | 15 | from services.opensensemap import OpenSenseMap |
9 | 16 |
|
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 | + |
12 | 27 |
|
13 | 28 | BASE_URL = "https://api.opensensemap.org" |
14 | 29 |
|
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__) |
16 | 35 |
|
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 | +) |
18 | 44 |
|
19 | | -app = Flask(__name__) |
| 45 | +valkey_client = valkey.Valkey(host=config["VKURL"], port=config["VKPORT"], db=0) |
20 | 46 |
|
21 | 47 |
|
22 | | -@app.route("/metrics") |
| 48 | +@app.route(rule="/metrics") |
23 | 49 | def metrics(): |
24 | 50 | return generate_latest() |
25 | 51 |
|
26 | 52 |
|
27 | | -@app.route("/version") |
| 53 | +@app.route(rule="/version") |
28 | 54 | def print_version(): |
29 | 55 | total_version_requests.inc() |
30 | 56 | return jsonify({"version": __version__}), 200 |
31 | 57 |
|
32 | 58 |
|
33 | | -@app.route("/temperature") |
| 59 | +@app.route(rule="/temperature") |
34 | 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 |
35 | 72 | api = OpenSenseMap(base_url=BASE_URL) |
36 | 73 | 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 | + |
37 | 86 | total_temp_requests.inc() |
38 | 87 | return jsonify(data), return_code |
39 | 88 |
|
40 | 89 |
|
| 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 | + |
41 | 102 | 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 | + |
42 | 107 | from waitress import serve |
43 | 108 |
|
44 | | - serve(app, host=config["HOST"], port=config["PORT"]) |
| 109 | + serve(app=app, host=config["HOST"], port=config["PORT"]) |
0 commit comments