Remove unnecessary files
هذا الالتزام موجود في:
ثنائية
q1-deploy-monitor/__pycache__/app.cpython-313.pyc
Normal file
ثنائية
q1-deploy-monitor/__pycache__/app.cpython-313.pyc
Normal file
ملف ثنائي غير معروض.
@@ -1,40 +1,48 @@
|
||||
from fastapi import FastAPI
|
||||
from fastapi import FastAPI, Request
|
||||
import time
|
||||
|
||||
app = FastAPI()
|
||||
|
||||
request_count = 0
|
||||
last_response_time_ms = 0.0
|
||||
|
||||
|
||||
@app.middleware("http")
|
||||
async def track_requests(request: Request, call_next):
|
||||
"""
|
||||
Measures the REAL processing time of every request using a middleware
|
||||
that wraps the actual handler, instead of measuring time inside the
|
||||
handler itself (which always returns ~0ms).
|
||||
We skip counting calls to /stats itself so the dashboard polling
|
||||
doesn't inflate the request counter.
|
||||
"""
|
||||
global request_count, last_response_time_ms
|
||||
|
||||
start = time.time()
|
||||
response = await call_next(request)
|
||||
duration_ms = round((time.time() - start) * 1000, 2)
|
||||
|
||||
if request.url.path != "/stats":
|
||||
request_count += 1
|
||||
last_response_time_ms = duration_ms
|
||||
|
||||
return response
|
||||
|
||||
|
||||
@app.get("/")
|
||||
def home():
|
||||
global request_count
|
||||
request_count += 1
|
||||
|
||||
return {
|
||||
"message": "Application is running"
|
||||
}
|
||||
return {"message": "Application is running"}
|
||||
|
||||
|
||||
@app.get("/health")
|
||||
def health():
|
||||
return {
|
||||
"status": "UP"
|
||||
}
|
||||
return {"status": "UP"}
|
||||
|
||||
|
||||
@app.get("/stats")
|
||||
def stats():
|
||||
global request_count
|
||||
|
||||
start = time.time()
|
||||
|
||||
request_count += 1
|
||||
|
||||
response_time = round((time.time() - start) * 1000, 2)
|
||||
|
||||
return {
|
||||
"status": "UP",
|
||||
"requests": request_count,
|
||||
"response_time": response_time
|
||||
"response_time": last_response_time_ms
|
||||
}
|
||||
|
||||
@@ -35,6 +35,10 @@
|
||||
font-weight:bold;
|
||||
color:green;
|
||||
}
|
||||
|
||||
span.down{
|
||||
color:red;
|
||||
}
|
||||
</style>
|
||||
|
||||
</head>
|
||||
@@ -64,25 +68,39 @@
|
||||
|
||||
<script>
|
||||
|
||||
// IMPORTANT: change this after deploying to ghaymah.systems
|
||||
// e.g. "https://your-app-name.ghaymah.systems"
|
||||
const API_URL = "http://127.0.0.1:8000";
|
||||
|
||||
async function updateDashboard() {
|
||||
|
||||
try {
|
||||
|
||||
const response = await fetch("http://127.0.0.1:8000/stats");
|
||||
// Measure real round-trip latency from the browser's point of view
|
||||
const clientStart = performance.now();
|
||||
|
||||
const response = await fetch(`${API_URL}/stats`);
|
||||
const data = await response.json();
|
||||
|
||||
document.getElementById("status").textContent = data.status;
|
||||
const clientLatency = Math.round(performance.now() - clientStart);
|
||||
|
||||
const statusEl = document.getElementById("status");
|
||||
statusEl.textContent = data.status;
|
||||
statusEl.classList.toggle("down", data.status !== "UP");
|
||||
|
||||
document.getElementById("requests").textContent = data.requests;
|
||||
|
||||
document.getElementById("response").textContent = data.response_time;
|
||||
// Show the server-measured latency; fall back to client-measured
|
||||
// round-trip time if the server didn't report anything useful.
|
||||
document.getElementById("response").textContent =
|
||||
data.response_time > 0 ? data.response_time : clientLatency;
|
||||
|
||||
}
|
||||
|
||||
catch(error){
|
||||
|
||||
document.getElementById("status").textContent = "DOWN";
|
||||
const statusEl = document.getElementById("status");
|
||||
statusEl.textContent = "DOWN";
|
||||
statusEl.classList.add("down");
|
||||
|
||||
}
|
||||
|
||||
@@ -90,7 +108,7 @@ async function updateDashboard() {
|
||||
|
||||
updateDashboard();
|
||||
|
||||
setInterval(updateDashboard,30000);
|
||||
setInterval(updateDashboard, 30000);
|
||||
|
||||
</script>
|
||||
|
||||
|
||||
المرجع في مشكلة جديدة
حظر مستخدم