55 lines
1.4 KiB
Python
55 lines
1.4 KiB
Python
from flask import Flask
|
|
import time, random, threading
|
|
|
|
app = Flask(__name__)
|
|
|
|
# --- Metrics (thread-safe counters) ---
|
|
lock = threading.Lock()
|
|
metrics = {
|
|
"requests_total": 0,
|
|
"errors_total": 0,
|
|
"duration_sum": 0.0,
|
|
"duration_count": 0,
|
|
}
|
|
|
|
@app.route('/')
|
|
def home():
|
|
start = time.time()
|
|
|
|
# Simuleer latency
|
|
time.sleep(random.uniform(0.1, 2.0))
|
|
|
|
# Simuleer 10% errors
|
|
is_error = random.random() < 0.1
|
|
duration = time.time() - start
|
|
|
|
with lock:
|
|
metrics["requests_total"] += 1
|
|
metrics["duration_sum"] += duration
|
|
metrics["duration_count"] += 1
|
|
if is_error:
|
|
metrics["errors_total"] += 1
|
|
|
|
if is_error:
|
|
return "Oeps!", 500
|
|
return "Welkom bij de shop!"
|
|
|
|
@app.route('/metrics')
|
|
def get_metrics():
|
|
with lock:
|
|
avg_duration = (
|
|
metrics["duration_sum"] / metrics["duration_count"]
|
|
if metrics["duration_count"] > 0 else 0
|
|
)
|
|
error_rate = (
|
|
metrics["errors_total"] / metrics["requests_total"] * 100
|
|
if metrics["requests_total"] > 0 else 0
|
|
)
|
|
return {
|
|
"requests_total": metrics["requests_total"],
|
|
"errors_total": metrics["errors_total"],
|
|
"error_rate_pct": round(error_rate, 2),
|
|
"avg_duration_sec": round(avg_duration, 3),
|
|
}
|
|
|
|
app.run(host='0.0.0.0', port=5000) |