diff --git a/common-mortakaz/integration-1.md b/common-mortakaz/integration-1.md deleted file mode 100644 index e69de29..0000000 diff --git a/common-mortakaz/integration-2.md b/common-mortakaz/integration-2.md deleted file mode 100644 index e69de29..0000000 diff --git a/common-qabilah/qabilah-profile.txt b/common-qabilah/qabilah-profile.txt deleted file mode 100644 index e69de29..0000000 diff --git a/q1-deploy-monitor/__pycache__/app.cpython-313.pyc b/q1-deploy-monitor/__pycache__/app.cpython-313.pyc new file mode 100644 index 0000000..dd44628 Binary files /dev/null and b/q1-deploy-monitor/__pycache__/app.cpython-313.pyc differ diff --git a/q1-deploy-monitor/app.py b/q1-deploy-monitor/app.py index 914857d..a0f0a75 100644 --- a/q1-deploy-monitor/app.py +++ b/q1-deploy-monitor/app.py @@ -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 } diff --git a/q1-deploy-monitor/dashboard.html b/q1-deploy-monitor/dashboard.html index aed253c..af91696 100644 --- a/q1-deploy-monitor/dashboard.html +++ b/q1-deploy-monitor/dashboard.html @@ -35,6 +35,10 @@ font-weight:bold; color:green; } + + span.down{ + color:red; + } @@ -64,25 +68,39 @@ diff --git a/q3-cicd/workflow.yml b/q3-cicd/workflow.yml index ee0e231..23c7634 100644 --- a/q3-cicd/workflow.yml +++ b/q3-cicd/workflow.yml @@ -27,14 +27,33 @@ jobs: run: | docker push registry.ghaymah.systems/my-api:${{ github.sha }} - deploy-production: + deploy-staging: needs: build runs-on: ubuntu-latest + environment: + name: staging + + steps: + - name: Deploy to Staging + run: | + echo "Deploying image ${{ github.sha }} to staging..." + # ghaymah deploy my-api-staging --image registry.ghaymah.systems/my-api:${{ github.sha }} + + deploy-production: + needs: deploy-staging + runs-on: ubuntu-latest + + # This "environment: production" line by itself does NOT block the job. + # The manual approval only happens if you also configure, on GitHub: + # Settings -> Environments -> production -> Required reviewers + # Add yourself (or a teammate) as a required reviewer there. + # Without that step, this environment tag is just a label. environment: name: production steps: - name: Deploy to Production run: | - echo "Deploying application to production..." + echo "Deploying image ${{ github.sha }} to production..." + # ghaymah deploy my-api --image registry.ghaymah.systems/my-api:${{ github.sha }} diff --git a/q4-scalability/architecture.png b/q4-scalability/architecture.png deleted file mode 100644 index ea4932c..0000000 Binary files a/q4-scalability/architecture.png and /dev/null differ diff --git a/q5-mithal-monitor/Dockerfile b/q5-mithal-monitor/Dockerfile new file mode 100644 index 0000000..a829069 --- /dev/null +++ b/q5-mithal-monitor/Dockerfile @@ -0,0 +1,13 @@ +FROM python:3.12-slim + +WORKDIR /app + +COPY requirements.txt . +RUN pip install --no-cache-dir -r requirements.txt + +COPY . . +RUN chmod +x start.sh + +EXPOSE 8080 + +CMD ["./start.sh"] diff --git a/q5-mithal-monitor/Start.sh b/q5-mithal-monitor/Start.sh new file mode 100644 index 0000000..0bd8b75 --- /dev/null +++ b/q5-mithal-monitor/Start.sh @@ -0,0 +1,11 @@ +#!/bin/bash\ +# Runs the background monitoring loop (monitor.py) and serves the +# dashboard + monitor_data.json over HTTP at the same time. + +set -e + +# Start the monitor in the background; it updates monitor_data.json every 60s +python monitor.py & + +# Serve the current directory (dashboard.html + monitor_data.json) +python -m http.server 8080 diff --git a/q5-mithal-monitor/monitor_data.json b/q5-mithal-monitor/monitor_data.json index b7d74ff..0336826 100644 --- a/q5-mithal-monitor/monitor_data.json +++ b/q5-mithal-monitor/monitor_data.json @@ -78,5 +78,1005 @@ "ssl_days_remaining": 47, "ssl_expiry": "Sep 15 13:10:47 2026 GMT", "search_latency_ms": 685.76 + }, + { + "timestamp": "2026-07-29 13:29:20", + "uptime": "UP", + "status_code": 200, + "latency_ms": 796.49, + "dns_ms": 17.73, + "ssl_days_remaining": 47, + "ssl_expiry": "Sep 15 13:10:47 2026 GMT", + "search_latency_ms": 702.59 + }, + { + "timestamp": "2026-07-29 13:30:22", + "uptime": "UP", + "status_code": 200, + "latency_ms": 809.36, + "dns_ms": 18.94, + "ssl_days_remaining": 47, + "ssl_expiry": "Sep 15 13:10:47 2026 GMT", + "search_latency_ms": 796.23 + }, + { + "timestamp": "2026-07-29 13:31:24", + "uptime": "UP", + "status_code": 200, + "latency_ms": 693.8, + "dns_ms": 19.01, + "ssl_days_remaining": 47, + "ssl_expiry": "Sep 15 13:10:47 2026 GMT", + "search_latency_ms": 696.29 + }, + { + "timestamp": "2026-07-29 13:32:26", + "uptime": "UP", + "status_code": 200, + "latency_ms": 1065.87, + "dns_ms": 19.99, + "ssl_days_remaining": 47, + "ssl_expiry": "Sep 15 13:10:47 2026 GMT", + "search_latency_ms": 672.23 + }, + { + "timestamp": "2026-07-29 13:33:28", + "uptime": "UP", + "status_code": 200, + "latency_ms": 736.77, + "dns_ms": 19.99, + "ssl_days_remaining": 47, + "ssl_expiry": "Sep 15 13:10:47 2026 GMT", + "search_latency_ms": 702.09 + }, + { + "timestamp": "2026-07-29 13:34:30", + "uptime": "UP", + "status_code": 200, + "latency_ms": 737.3, + "dns_ms": 17.99, + "ssl_days_remaining": 47, + "ssl_expiry": "Sep 15 13:10:47 2026 GMT", + "search_latency_ms": 702.44 + }, + { + "timestamp": "2026-07-29 13:35:32", + "uptime": "UP", + "status_code": 200, + "latency_ms": 711.06, + "dns_ms": 18.03, + "ssl_days_remaining": 47, + "ssl_expiry": "Sep 15 13:10:47 2026 GMT", + "search_latency_ms": 736.32 + }, + { + "timestamp": "2026-07-29 13:36:33", + "uptime": "UP", + "status_code": 200, + "latency_ms": 658.05, + "dns_ms": 19.51, + "ssl_days_remaining": 47, + "ssl_expiry": "Sep 15 13:10:47 2026 GMT", + "search_latency_ms": 710.88 + }, + { + "timestamp": "2026-07-29 13:37:36", + "uptime": "UP", + "status_code": 200, + "latency_ms": 1164.37, + "dns_ms": 35.68, + "ssl_days_remaining": 47, + "ssl_expiry": "Sep 15 13:10:47 2026 GMT", + "search_latency_ms": 766.8 + }, + { + "timestamp": "2026-07-29 13:38:38", + "uptime": "UP", + "status_code": 200, + "latency_ms": 655.73, + "dns_ms": 17.51, + "ssl_days_remaining": 47, + "ssl_expiry": "Sep 15 13:10:47 2026 GMT", + "search_latency_ms": 680.62 + }, + { + "timestamp": "2026-07-29 13:39:39", + "uptime": "UP", + "status_code": 200, + "latency_ms": 685.52, + "dns_ms": 18.46, + "ssl_days_remaining": 47, + "ssl_expiry": "Sep 15 13:10:47 2026 GMT", + "search_latency_ms": 785.82 + }, + { + "timestamp": "2026-07-29 13:40:41", + "uptime": "UP", + "status_code": 200, + "latency_ms": 742.43, + "dns_ms": 18.06, + "ssl_days_remaining": 47, + "ssl_expiry": "Sep 15 13:10:47 2026 GMT", + "search_latency_ms": 682.35 + }, + { + "timestamp": "2026-07-29 13:41:43", + "uptime": "UP", + "status_code": 200, + "latency_ms": 713.42, + "dns_ms": 18.09, + "ssl_days_remaining": 47, + "ssl_expiry": "Sep 15 13:10:47 2026 GMT", + "search_latency_ms": 687.09 + }, + { + "timestamp": "2026-07-29 13:42:45", + "uptime": "UP", + "status_code": 200, + "latency_ms": 702.86, + "dns_ms": 18.12, + "ssl_days_remaining": 47, + "ssl_expiry": "Sep 15 13:10:47 2026 GMT", + "search_latency_ms": 648.26 + }, + { + "timestamp": "2026-07-29 13:43:47", + "uptime": "UP", + "status_code": 200, + "latency_ms": 696.27, + "dns_ms": 17.36, + "ssl_days_remaining": 47, + "ssl_expiry": "Sep 15 13:10:47 2026 GMT", + "search_latency_ms": 735.81 + }, + { + "timestamp": "2026-07-29 13:44:49", + "uptime": "UP", + "status_code": 200, + "latency_ms": 686.58, + "dns_ms": 139.97, + "ssl_days_remaining": 47, + "ssl_expiry": "Sep 15 13:10:47 2026 GMT", + "search_latency_ms": 711.86 + }, + { + "timestamp": "2026-07-29 13:45:51", + "uptime": "UP", + "status_code": 200, + "latency_ms": 753.98, + "dns_ms": 17.99, + "ssl_days_remaining": 47, + "ssl_expiry": "Sep 15 13:10:47 2026 GMT", + "search_latency_ms": 746.27 + }, + { + "timestamp": "2026-07-29 13:46:52", + "uptime": "UP", + "status_code": 200, + "latency_ms": 747.34, + "dns_ms": 20.45, + "ssl_days_remaining": 47, + "ssl_expiry": "Sep 15 13:10:47 2026 GMT", + "search_latency_ms": 694.14 + }, + { + "timestamp": "2026-07-29 13:47:54", + "uptime": "UP", + "status_code": 200, + "latency_ms": 671.9, + "dns_ms": 17.89, + "ssl_days_remaining": 47, + "ssl_expiry": "Sep 15 13:10:47 2026 GMT", + "search_latency_ms": 687.87 + }, + { + "timestamp": "2026-07-29 13:48:56", + "uptime": "UP", + "status_code": 200, + "latency_ms": 913.91, + "dns_ms": 21.38, + "ssl_days_remaining": 47, + "ssl_expiry": "Sep 15 13:10:47 2026 GMT", + "search_latency_ms": 659.79 + }, + { + "timestamp": "2026-07-29 13:49:58", + "uptime": "UP", + "status_code": 200, + "latency_ms": 683.63, + "dns_ms": 18.54, + "ssl_days_remaining": 47, + "ssl_expiry": "Sep 15 13:10:47 2026 GMT", + "search_latency_ms": 692.84 + }, + { + "timestamp": "2026-07-29 13:51:00", + "uptime": "UP", + "status_code": 200, + "latency_ms": 688.33, + "dns_ms": 17.83, + "ssl_days_remaining": 47, + "ssl_expiry": "Sep 15 13:10:47 2026 GMT", + "search_latency_ms": 700.66 + }, + { + "timestamp": "2026-07-29 13:52:02", + "uptime": "UP", + "status_code": 200, + "latency_ms": 774.27, + "dns_ms": 19.76, + "ssl_days_remaining": 47, + "ssl_expiry": "Sep 15 13:10:47 2026 GMT", + "search_latency_ms": 854.92 + }, + { + "timestamp": "2026-07-29 13:53:03", + "uptime": "UP", + "status_code": 200, + "latency_ms": 689.02, + "dns_ms": 19.48, + "ssl_days_remaining": 47, + "ssl_expiry": "Sep 15 13:10:47 2026 GMT", + "search_latency_ms": 681.4 + }, + { + "timestamp": "2026-07-29 13:54:06", + "uptime": "UP", + "status_code": 200, + "latency_ms": 1442.27, + "dns_ms": 19.22, + "ssl_days_remaining": 47, + "ssl_expiry": "Sep 15 13:10:47 2026 GMT", + "search_latency_ms": 676.27 + }, + { + "timestamp": "2026-07-29 13:55:08", + "uptime": "UP", + "status_code": 200, + "latency_ms": 690.76, + "dns_ms": 18.06, + "ssl_days_remaining": 47, + "ssl_expiry": "Sep 15 13:10:47 2026 GMT", + "search_latency_ms": 694.06 + }, + { + "timestamp": "2026-07-29 13:56:10", + "uptime": "UP", + "status_code": 200, + "latency_ms": 731.26, + "dns_ms": 18.22, + "ssl_days_remaining": 47, + "ssl_expiry": "Sep 15 13:10:47 2026 GMT", + "search_latency_ms": 666.09 + }, + { + "timestamp": "2026-07-29 13:57:11", + "uptime": "UP", + "status_code": 200, + "latency_ms": 683.61, + "dns_ms": 17.08, + "ssl_days_remaining": 47, + "ssl_expiry": "Sep 15 13:10:47 2026 GMT", + "search_latency_ms": 670.91 + }, + { + "timestamp": "2026-07-29 13:58:13", + "uptime": "UP", + "status_code": 200, + "latency_ms": 701.41, + "dns_ms": 19.09, + "ssl_days_remaining": 47, + "ssl_expiry": "Sep 15 13:10:47 2026 GMT", + "search_latency_ms": 690.46 + }, + { + "timestamp": "2026-07-29 13:59:15", + "uptime": "UP", + "status_code": 200, + "latency_ms": 715.49, + "dns_ms": 17.84, + "ssl_days_remaining": 47, + "ssl_expiry": "Sep 15 13:10:47 2026 GMT", + "search_latency_ms": 655.36 + }, + { + "timestamp": "2026-07-29 14:00:17", + "uptime": "UP", + "status_code": 200, + "latency_ms": 655.69, + "dns_ms": 18.35, + "ssl_days_remaining": 47, + "ssl_expiry": "Sep 15 13:10:47 2026 GMT", + "search_latency_ms": 685.31 + }, + { + "timestamp": "2026-07-29 14:01:19", + "uptime": "UP", + "status_code": 200, + "latency_ms": 1569.17, + "dns_ms": 18.37, + "ssl_days_remaining": 47, + "ssl_expiry": "Sep 15 13:10:47 2026 GMT", + "search_latency_ms": 776.09 + }, + { + "timestamp": "2026-07-29 14:02:21", + "uptime": "UP", + "status_code": 200, + "latency_ms": 688.85, + "dns_ms": 18.66, + "ssl_days_remaining": 47, + "ssl_expiry": "Sep 15 13:10:47 2026 GMT", + "search_latency_ms": 697.76 + }, + { + "timestamp": "2026-07-29 14:03:23", + "uptime": "UP", + "status_code": 200, + "latency_ms": 871.11, + "dns_ms": 18.49, + "ssl_days_remaining": 47, + "ssl_expiry": "Sep 15 13:10:47 2026 GMT", + "search_latency_ms": 692.08 + }, + { + "timestamp": "2026-07-29 14:04:25", + "uptime": "UP", + "status_code": 200, + "latency_ms": 715.7, + "dns_ms": 18.42, + "ssl_days_remaining": 47, + "ssl_expiry": "Sep 15 13:10:47 2026 GMT", + "search_latency_ms": 695.7 + }, + { + "timestamp": "2026-07-29 14:05:27", + "uptime": "UP", + "status_code": 200, + "latency_ms": 779.05, + "dns_ms": 18.38, + "ssl_days_remaining": 47, + "ssl_expiry": "Sep 15 13:10:47 2026 GMT", + "search_latency_ms": 709.21 + }, + { + "timestamp": "2026-07-29 14:06:29", + "uptime": "UP", + "status_code": 200, + "latency_ms": 853.9, + "dns_ms": 17.51, + "ssl_days_remaining": 47, + "ssl_expiry": "Sep 15 13:10:47 2026 GMT", + "search_latency_ms": 677.57 + }, + { + "timestamp": "2026-07-29 14:07:30", + "uptime": "UP", + "status_code": 200, + "latency_ms": 703.27, + "dns_ms": 17.39, + "ssl_days_remaining": 47, + "ssl_expiry": "Sep 15 13:10:47 2026 GMT", + "search_latency_ms": 690.72 + }, + { + "timestamp": "2026-07-29 14:08:32", + "uptime": "UP", + "status_code": 200, + "latency_ms": 860.15, + "dns_ms": 18.77, + "ssl_days_remaining": 47, + "ssl_expiry": "Sep 15 13:10:47 2026 GMT", + "search_latency_ms": 680.07 + }, + { + "timestamp": "2026-07-29 14:09:34", + "uptime": "UP", + "status_code": 200, + "latency_ms": 947.05, + "dns_ms": 18.08, + "ssl_days_remaining": 47, + "ssl_expiry": "Sep 15 13:10:47 2026 GMT", + "search_latency_ms": 677.68 + }, + { + "timestamp": "2026-07-29 14:10:36", + "uptime": "UP", + "status_code": 200, + "latency_ms": 752.5, + "dns_ms": 19.24, + "ssl_days_remaining": 47, + "ssl_expiry": "Sep 15 13:10:47 2026 GMT", + "search_latency_ms": 700.38 + }, + { + "timestamp": "2026-07-29 14:11:39", + "uptime": "UP", + "status_code": 200, + "latency_ms": 1576.72, + "dns_ms": 19.28, + "ssl_days_remaining": 47, + "ssl_expiry": "Sep 15 13:10:47 2026 GMT", + "search_latency_ms": 689.53 + }, + { + "timestamp": "2026-07-29 14:12:41", + "uptime": "UP", + "status_code": 200, + "latency_ms": 816.53, + "dns_ms": 20.09, + "ssl_days_remaining": 47, + "ssl_expiry": "Sep 15 13:10:47 2026 GMT", + "search_latency_ms": 720.63 + }, + { + "timestamp": "2026-07-29 14:13:43", + "uptime": "UP", + "status_code": 200, + "latency_ms": 702.09, + "dns_ms": 20.07, + "ssl_days_remaining": 47, + "ssl_expiry": "Sep 15 13:10:47 2026 GMT", + "search_latency_ms": 677.69 + }, + { + "timestamp": "2026-07-29 14:14:44", + "uptime": "UP", + "status_code": 200, + "latency_ms": 746.56, + "dns_ms": 18.21, + "ssl_days_remaining": 47, + "ssl_expiry": "Sep 15 13:10:47 2026 GMT", + "search_latency_ms": 731.71 + }, + { + "timestamp": "2026-07-29 14:15:46", + "uptime": "UP", + "status_code": 200, + "latency_ms": 866.47, + "dns_ms": 20.7, + "ssl_days_remaining": 47, + "ssl_expiry": "Sep 15 13:10:47 2026 GMT", + "search_latency_ms": 699.85 + }, + { + "timestamp": "2026-07-29 14:16:48", + "uptime": "UP", + "status_code": 200, + "latency_ms": 692.86, + "dns_ms": 19.2, + "ssl_days_remaining": 47, + "ssl_expiry": "Sep 15 13:10:47 2026 GMT", + "search_latency_ms": 731.95 + }, + { + "timestamp": "2026-07-29 14:17:50", + "uptime": "UP", + "status_code": 200, + "latency_ms": 683.68, + "dns_ms": 19.22, + "ssl_days_remaining": 47, + "ssl_expiry": "Sep 15 13:10:47 2026 GMT", + "search_latency_ms": 704.27 + }, + { + "timestamp": "2026-07-29 14:18:52", + "uptime": "UP", + "status_code": 200, + "latency_ms": 1061.02, + "dns_ms": 19.22, + "ssl_days_remaining": 47, + "ssl_expiry": "Sep 15 13:10:47 2026 GMT", + "search_latency_ms": 718.16 + }, + { + "timestamp": "2026-07-29 14:19:54", + "uptime": "UP", + "status_code": 200, + "latency_ms": 736.45, + "dns_ms": 20.37, + "ssl_days_remaining": 47, + "ssl_expiry": "Sep 15 13:10:47 2026 GMT", + "search_latency_ms": 714.67 + }, + { + "timestamp": "2026-07-29 14:20:57", + "uptime": "UP", + "status_code": 200, + "latency_ms": 2121.53, + "dns_ms": 18.74, + "ssl_days_remaining": 47, + "ssl_expiry": "Sep 15 13:10:47 2026 GMT", + "search_latency_ms": 677.35 + }, + { + "timestamp": "2026-07-29 14:21:59", + "uptime": "UP", + "status_code": 200, + "latency_ms": 696.92, + "dns_ms": 19.84, + "ssl_days_remaining": 47, + "ssl_expiry": "Sep 15 13:10:47 2026 GMT", + "search_latency_ms": 678.32 + }, + { + "timestamp": "2026-07-29 14:23:01", + "uptime": "UP", + "status_code": 200, + "latency_ms": 748.77, + "dns_ms": 19.5, + "ssl_days_remaining": 47, + "ssl_expiry": "Sep 15 13:10:47 2026 GMT", + "search_latency_ms": 681.1 + }, + { + "timestamp": "2026-07-29 14:24:03", + "uptime": "UP", + "status_code": 200, + "latency_ms": 667.43, + "dns_ms": 18.06, + "ssl_days_remaining": 47, + "ssl_expiry": "Sep 15 13:10:47 2026 GMT", + "search_latency_ms": 693.04 + }, + { + "timestamp": "2026-07-29 14:25:04", + "uptime": "UP", + "status_code": 200, + "latency_ms": 728.73, + "dns_ms": 18.35, + "ssl_days_remaining": 47, + "ssl_expiry": "Sep 15 13:10:47 2026 GMT", + "search_latency_ms": 684.73 + }, + { + "timestamp": "2026-07-29 14:26:06", + "uptime": "UP", + "status_code": 200, + "latency_ms": 873.39, + "dns_ms": 19.17, + "ssl_days_remaining": 47, + "ssl_expiry": "Sep 15 13:10:47 2026 GMT", + "search_latency_ms": 666.09 + }, + { + "timestamp": "2026-07-29 14:27:08", + "uptime": "UP", + "status_code": 200, + "latency_ms": 686.15, + "dns_ms": 18.5, + "ssl_days_remaining": 47, + "ssl_expiry": "Sep 15 13:10:47 2026 GMT", + "search_latency_ms": 805.59 + }, + { + "timestamp": "2026-07-29 14:28:11", + "uptime": "UP", + "status_code": 200, + "latency_ms": 1026.35, + "dns_ms": 116.14, + "ssl_days_remaining": 47, + "ssl_expiry": "Sep 15 13:10:47 2026 GMT", + "search_latency_ms": 1088.1 + }, + { + "timestamp": "2026-07-29 14:29:13", + "uptime": "UP", + "status_code": 200, + "latency_ms": 786.21, + "dns_ms": 71.37, + "ssl_days_remaining": 47, + "ssl_expiry": "Sep 15 13:10:47 2026 GMT", + "search_latency_ms": 952.9 + }, + { + "timestamp": "2026-07-29 14:30:17", + "uptime": "UP", + "status_code": 200, + "latency_ms": 1554.83, + "dns_ms": 86.73, + "ssl_days_remaining": 47, + "ssl_expiry": "Sep 15 13:10:47 2026 GMT", + "search_latency_ms": 1048.98 + }, + { + "timestamp": "2026-07-29 14:31:18", + "uptime": "UP", + "status_code": 200, + "latency_ms": 819.4, + "dns_ms": 17.87, + "ssl_days_remaining": 47, + "ssl_expiry": "Sep 15 13:10:47 2026 GMT", + "search_latency_ms": 666.78 + }, + { + "timestamp": "2026-07-29 14:32:20", + "uptime": "UP", + "status_code": 200, + "latency_ms": 666.0, + "dns_ms": 18.86, + "ssl_days_remaining": 47, + "ssl_expiry": "Sep 15 13:10:47 2026 GMT", + "search_latency_ms": 705.81 + }, + { + "timestamp": "2026-07-29 14:33:22", + "uptime": "UP", + "status_code": 200, + "latency_ms": 700.31, + "dns_ms": 17.59, + "ssl_days_remaining": 47, + "ssl_expiry": "Sep 15 13:10:47 2026 GMT", + "search_latency_ms": 696.37 + }, + { + "timestamp": "2026-07-29 14:34:24", + "uptime": "UP", + "status_code": 200, + "latency_ms": 840.75, + "dns_ms": 19.22, + "ssl_days_remaining": 47, + "ssl_expiry": "Sep 15 13:10:47 2026 GMT", + "search_latency_ms": 701.29 + }, + { + "timestamp": "2026-07-29 14:35:26", + "uptime": "UP", + "status_code": 200, + "latency_ms": 748.29, + "dns_ms": 19.99, + "ssl_days_remaining": 47, + "ssl_expiry": "Sep 15 13:10:47 2026 GMT", + "search_latency_ms": 878.32 + }, + { + "timestamp": "2026-07-29 14:36:28", + "uptime": "UP", + "status_code": 200, + "latency_ms": 686.21, + "dns_ms": 17.91, + "ssl_days_remaining": 47, + "ssl_expiry": "Sep 15 13:10:47 2026 GMT", + "search_latency_ms": 701.0 + }, + { + "timestamp": "2026-07-29 14:37:29", + "uptime": "UP", + "status_code": 200, + "latency_ms": 680.49, + "dns_ms": 18.28, + "ssl_days_remaining": 47, + "ssl_expiry": "Sep 15 13:10:47 2026 GMT", + "search_latency_ms": 685.21 + }, + { + "timestamp": "2026-07-29 14:38:31", + "uptime": "UP", + "status_code": 200, + "latency_ms": 708.85, + "dns_ms": 18.96, + "ssl_days_remaining": 47, + "ssl_expiry": "Sep 15 13:10:47 2026 GMT", + "search_latency_ms": 699.8 + }, + { + "timestamp": "2026-07-29 14:39:33", + "uptime": "UP", + "status_code": 200, + "latency_ms": 677.09, + "dns_ms": 19.04, + "ssl_days_remaining": 47, + "ssl_expiry": "Sep 15 13:10:47 2026 GMT", + "search_latency_ms": 698.13 + }, + { + "timestamp": "2026-07-29 14:40:35", + "uptime": "UP", + "status_code": 200, + "latency_ms": 728.62, + "dns_ms": 18.71, + "ssl_days_remaining": 47, + "ssl_expiry": "Sep 15 13:10:47 2026 GMT", + "search_latency_ms": 726.74 + }, + { + "timestamp": "2026-07-29 14:41:37", + "uptime": "UP", + "status_code": 200, + "latency_ms": 665.49, + "dns_ms": 19.41, + "ssl_days_remaining": 47, + "ssl_expiry": "Sep 15 13:10:47 2026 GMT", + "search_latency_ms": 712.4 + }, + { + "timestamp": "2026-07-29 14:42:39", + "uptime": "UP", + "status_code": 200, + "latency_ms": 695.76, + "dns_ms": 18.41, + "ssl_days_remaining": 47, + "ssl_expiry": "Sep 15 13:10:47 2026 GMT", + "search_latency_ms": 691.33 + }, + { + "timestamp": "2026-07-29 14:43:41", + "uptime": "UP", + "status_code": 200, + "latency_ms": 706.12, + "dns_ms": 17.76, + "ssl_days_remaining": 47, + "ssl_expiry": "Sep 15 13:10:47 2026 GMT", + "search_latency_ms": 699.92 + }, + { + "timestamp": "2026-07-29 14:44:42", + "uptime": "UP", + "status_code": 200, + "latency_ms": 682.88, + "dns_ms": 18.85, + "ssl_days_remaining": 47, + "ssl_expiry": "Sep 15 13:10:47 2026 GMT", + "search_latency_ms": 702.56 + }, + { + "timestamp": "2026-07-29 14:45:44", + "uptime": "UP", + "status_code": 200, + "latency_ms": 702.09, + "dns_ms": 18.09, + "ssl_days_remaining": 47, + "ssl_expiry": "Sep 15 13:10:47 2026 GMT", + "search_latency_ms": 676.56 + }, + { + "timestamp": "2026-07-29 14:46:46", + "uptime": "UP", + "status_code": 200, + "latency_ms": 711.72, + "dns_ms": 25.15, + "ssl_days_remaining": 47, + "ssl_expiry": "Sep 15 13:10:47 2026 GMT", + "search_latency_ms": 655.21 + }, + { + "timestamp": "2026-07-29 14:47:48", + "uptime": "UP", + "status_code": 200, + "latency_ms": 706.38, + "dns_ms": 19.05, + "ssl_days_remaining": 47, + "ssl_expiry": "Sep 15 13:10:47 2026 GMT", + "search_latency_ms": 683.9 + }, + { + "timestamp": "2026-07-29 14:48:49", + "uptime": "UP", + "status_code": 200, + "latency_ms": 728.66, + "dns_ms": 20.74, + "ssl_days_remaining": 47, + "ssl_expiry": "Sep 15 13:10:47 2026 GMT", + "search_latency_ms": 690.8 + }, + { + "timestamp": "2026-07-29 14:49:51", + "uptime": "UP", + "status_code": 200, + "latency_ms": 693.39, + "dns_ms": 19.93, + "ssl_days_remaining": 47, + "ssl_expiry": "Sep 15 13:10:47 2026 GMT", + "search_latency_ms": 704.63 + }, + { + "timestamp": "2026-07-29 14:50:53", + "uptime": "UP", + "status_code": 200, + "latency_ms": 743.65, + "dns_ms": 18.26, + "ssl_days_remaining": 47, + "ssl_expiry": "Sep 15 13:10:47 2026 GMT", + "search_latency_ms": 648.65 + }, + { + "timestamp": "2026-07-29 14:51:55", + "uptime": "UP", + "status_code": 200, + "latency_ms": 708.05, + "dns_ms": 18.09, + "ssl_days_remaining": 47, + "ssl_expiry": "Sep 15 13:10:47 2026 GMT", + "search_latency_ms": 704.04 + }, + { + "timestamp": "2026-07-29 14:52:57", + "uptime": "UP", + "status_code": 200, + "latency_ms": 850.67, + "dns_ms": 18.12, + "ssl_days_remaining": 47, + "ssl_expiry": "Sep 15 13:10:47 2026 GMT", + "search_latency_ms": 707.71 + }, + { + "timestamp": "2026-07-29 14:54:03", + "uptime": "UP", + "status_code": 200, + "latency_ms": 3883.48, + "dns_ms": 120.74, + "ssl_days_remaining": 47, + "ssl_expiry": "Sep 15 13:10:47 2026 GMT", + "search_latency_ms": 1307.18 + }, + { + "timestamp": "2026-07-29 14:55:09", + "uptime": "UP", + "status_code": 200, + "latency_ms": 3807.11, + "dns_ms": 153.8, + "ssl_days_remaining": 47, + "ssl_expiry": "Sep 15 13:10:47 2026 GMT", + "search_latency_ms": 1308.85 + }, + { + "timestamp": "2026-07-29 14:56:11", + "uptime": "UP", + "status_code": 200, + "latency_ms": 720.71, + "dns_ms": 18.57, + "ssl_days_remaining": 47, + "ssl_expiry": "Sep 15 13:10:47 2026 GMT", + "search_latency_ms": 714.01 + }, + { + "timestamp": "2026-07-29 14:57:12", + "uptime": "UP", + "status_code": 200, + "latency_ms": 676.41, + "dns_ms": 18.24, + "ssl_days_remaining": 47, + "ssl_expiry": "Sep 15 13:10:47 2026 GMT", + "search_latency_ms": 656.24 + }, + { + "timestamp": "2026-07-29 14:58:14", + "uptime": "UP", + "status_code": 200, + "latency_ms": 960.72, + "dns_ms": 18.57, + "ssl_days_remaining": 47, + "ssl_expiry": "Sep 15 13:10:47 2026 GMT", + "search_latency_ms": 667.98 + }, + { + "timestamp": "2026-07-29 14:59:16", + "uptime": "UP", + "status_code": 200, + "latency_ms": 684.08, + "dns_ms": 19.95, + "ssl_days_remaining": 47, + "ssl_expiry": "Sep 15 13:10:47 2026 GMT", + "search_latency_ms": 726.08 + }, + { + "timestamp": "2026-07-29 15:00:18", + "uptime": "UP", + "status_code": 200, + "latency_ms": 726.14, + "dns_ms": 19.33, + "ssl_days_remaining": 47, + "ssl_expiry": "Sep 15 13:10:47 2026 GMT", + "search_latency_ms": 689.49 + }, + { + "timestamp": "2026-07-29 15:01:20", + "uptime": "UP", + "status_code": 200, + "latency_ms": 700.76, + "dns_ms": 19.22, + "ssl_days_remaining": 47, + "ssl_expiry": "Sep 15 13:10:47 2026 GMT", + "search_latency_ms": 680.48 + }, + { + "timestamp": "2026-07-29 15:02:22", + "uptime": "UP", + "status_code": 200, + "latency_ms": 754.22, + "dns_ms": 18.86, + "ssl_days_remaining": 47, + "ssl_expiry": "Sep 15 13:10:47 2026 GMT", + "search_latency_ms": 678.53 + }, + { + "timestamp": "2026-07-29 15:03:23", + "uptime": "UP", + "status_code": 200, + "latency_ms": 692.99, + "dns_ms": 18.57, + "ssl_days_remaining": 47, + "ssl_expiry": "Sep 15 13:10:47 2026 GMT", + "search_latency_ms": 690.92 + }, + { + "timestamp": "2026-07-29 15:04:25", + "uptime": "UP", + "status_code": 200, + "latency_ms": 683.63, + "dns_ms": 19.09, + "ssl_days_remaining": 47, + "ssl_expiry": "Sep 15 13:10:47 2026 GMT", + "search_latency_ms": 684.45 + }, + { + "timestamp": "2026-07-29 15:05:27", + "uptime": "UP", + "status_code": 200, + "latency_ms": 710.95, + "dns_ms": 18.54, + "ssl_days_remaining": 47, + "ssl_expiry": "Sep 15 13:10:47 2026 GMT", + "search_latency_ms": 680.44 + }, + { + "timestamp": "2026-07-29 15:06:29", + "uptime": "UP", + "status_code": 200, + "latency_ms": 707.22, + "dns_ms": 18.27, + "ssl_days_remaining": 47, + "ssl_expiry": "Sep 15 13:10:47 2026 GMT", + "search_latency_ms": 693.62 + }, + { + "timestamp": "2026-07-29 15:07:30", + "uptime": "UP", + "status_code": 200, + "latency_ms": 692.48, + "dns_ms": 18.26, + "ssl_days_remaining": 47, + "ssl_expiry": "Sep 15 13:10:47 2026 GMT", + "search_latency_ms": 693.3 + }, + { + "timestamp": "2026-07-29 15:08:32", + "uptime": "UP", + "status_code": 200, + "latency_ms": 689.54, + "dns_ms": 18.25, + "ssl_days_remaining": 47, + "ssl_expiry": "Sep 15 13:10:47 2026 GMT", + "search_latency_ms": 671.34 + }, + { + "timestamp": "2026-07-29 15:09:34", + "uptime": "UP", + "status_code": 200, + "latency_ms": 691.36, + "dns_ms": 19.3, + "ssl_days_remaining": 47, + "ssl_expiry": "Sep 15 13:10:47 2026 GMT", + "search_latency_ms": 743.24 + }, + { + "timestamp": "2026-07-29 15:10:37", + "uptime": "UP", + "status_code": 200, + "latency_ms": 708.47, + "dns_ms": 18.02, + "ssl_days_remaining": 47, + "ssl_expiry": "Sep 15 13:10:47 2026 GMT", + "search_latency_ms": 677.05 + }, + { + "timestamp": "2026-07-29 15:11:38", + "uptime": "UP", + "status_code": 200, + "latency_ms": 800.49, + "dns_ms": 18.12, + "ssl_days_remaining": 47, + "ssl_expiry": "Sep 15 13:10:47 2026 GMT", + "search_latency_ms": 679.07 } ] \ No newline at end of file diff --git a/q5-mithal-monitor/requirements.txt b/q5-mithal-monitor/requirements.txt new file mode 100644 index 0000000..f229360 --- /dev/null +++ b/q5-mithal-monitor/requirements.txt @@ -0,0 +1 @@ +requests