الملفات
2026-07-28 03:54:42 +03:00

66 أسطر
1.8 KiB
Python

"""
Simple demo API for the Ghaymah SRE exam (Q1).
Endpoints:
GET / -> basic welcome message
GET /health -> liveness/readiness probe used by Ghaymah + monitoring script
GET /metrics -> lightweight JSON metrics used by the dashboard
(uptime, request count, avg response time)
"""
import time
from flask import Flask, jsonify
app = Flask(__name__)
START_TIME = time.time()
REQUEST_COUNT = 0
TOTAL_RESPONSE_TIME = 0.0
@app.before_request
def _start_timer():
global REQUEST_COUNT
REQUEST_COUNT += 1
app.config["_req_start"] = time.time()
@app.after_request
def _record_timing(response):
global TOTAL_RESPONSE_TIME
elapsed = time.time() - app.config.get("_req_start", time.time())
TOTAL_RESPONSE_TIME += elapsed
response.headers["X-Response-Time-ms"] = f"{elapsed * 1000:.2f}"
return response
@app.route("/")
def index():
return jsonify(message="Ghaymah SRE exam demo API is running", status="ok")
@app.route("/health")
def health():
"""Used by: Ghaymah container platform health checks, and the
external monitoring script (health-check.sh)."""
return jsonify(status="healthy", uptime_seconds=round(time.time() - START_TIME, 2)), 200
@app.route("/metrics")
def metrics():
"""Used by the dashboard.html to render status / avg response time / request count."""
avg_response_ms = (
(TOTAL_RESPONSE_TIME / REQUEST_COUNT) * 1000 if REQUEST_COUNT else 0
)
return jsonify(
status="healthy",
uptime_seconds=round(time.time() - START_TIME, 2),
request_count=REQUEST_COUNT,
avg_response_time_ms=round(avg_response_ms, 2),
)
if __name__ == "__main__":
# For local testing only; production uses gunicorn (see Dockerfile CMD)
app.run(host="0.0.0.0", port=8080)