66 أسطر
1.8 KiB
Python
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)
|