137 أسطر
4.3 KiB
Markdown
137 أسطر
4.3 KiB
Markdown
# Mithal.space Monitor
|
||
|
||
Production-quality website monitoring solution for [mithal.space](https://mithal.space) — an Arabic-first, privacy-respecting search engine.
|
||
|
||
## Overview
|
||
|
||
This project provides continuous monitoring of mithal.space, collecting uptime, latency, DNS, SSL, and search-response metrics every 60 seconds. A static HTML dashboard displays real-time charts and status cards, auto-refreshing every 30 seconds.
|
||
|
||
## Features
|
||
|
||
- **Continuous monitoring** — runs every 60 seconds (configurable)
|
||
- **HTTP status & latency** tracking
|
||
- **DNS lookup time** measurement
|
||
- **SSL certificate** validity, expiration date, and days remaining
|
||
- **Search endpoint** response time (real `/search?q=` request)
|
||
- **JSON persistence** — last 24 hours of data (1,440 records)
|
||
- **Static dashboard** — no frameworks, just HTML/CSS/Vanilla JS
|
||
- **Chart.js** line and bar charts
|
||
- **Dark mode** toggle
|
||
- **Auto-refresh** with countdown timer
|
||
- **CSV export** of all metrics
|
||
- **CLI arguments** for interval, target, max records
|
||
- **Logging** to both console and `monitor.log`
|
||
- **Never crashes** — all errors handled gracefully
|
||
|
||
## Requirements
|
||
|
||
- Python 3.10+
|
||
- pip
|
||
- A modern web browser (for the dashboard)
|
||
|
||
## Installation
|
||
|
||
### 1. Clone / Download
|
||
|
||
```bash
|
||
cd q5-mithal-monitor
|
||
```
|
||
|
||
### 2. Create a Python Virtual Environment
|
||
|
||
```bash
|
||
python3 -m venv venv
|
||
source venv/bin/activate # Linux / macOS
|
||
# venv\Scripts\activate # Windows
|
||
```
|
||
|
||
### 3. Install Dependencies
|
||
|
||
```bash
|
||
pip install -r requirements.txt
|
||
```
|
||
|
||
### 4. Run the Monitor
|
||
|
||
```bash
|
||
python monitor.py
|
||
```
|
||
|
||
With options:
|
||
|
||
```bash
|
||
python monitor.py --interval 30 --target https://mithal.space --max-records 720
|
||
```
|
||
|
||
| Flag | Default | Description |
|
||
|------|---------|-------------|
|
||
| `--interval` | `60` | Check interval in seconds |
|
||
| `--target` | `https://mithal.space` | URL to monitor |
|
||
| `--max-records` | `1440` | Max records to keep (≈24h at 60s) |
|
||
| `--search-query` | `test` | Query sent to `/search` endpoint |
|
||
| `--metrics-file` | `metrics.json` | Path to metrics file |
|
||
|
||
### 5. View the Dashboard
|
||
|
||
Open `dashboard.html` in a browser. It reads `metrics.json` directly via `fetch()`.
|
||
|
||
```bash
|
||
# Option A: just open the file
|
||
open dashboard.html # macOS
|
||
xdg-open dashboard.html # Linux
|
||
|
||
# Option B: serve via Python
|
||
python3 -m http.server 8080
|
||
# then visit http://localhost:8080/dashboard.html
|
||
```
|
||
|
||
## Project Structure
|
||
|
||
```
|
||
q5-mithal-monitor/
|
||
├── monitor.py # Main monitoring script
|
||
├── metrics.json # Collected metrics (auto-generated)
|
||
├── dashboard.html # Dashboard page
|
||
├── style.css # Dashboard styles
|
||
├── script.js # Dashboard logic
|
||
├── requirements.txt # Python dependencies
|
||
├── README.md # This file
|
||
├── monitor.log # Log file (auto-generated)
|
||
└── screenshots/
|
||
├── dashboard.png
|
||
└── monitor.png
|
||
```
|
||
|
||
## How Monitoring Works
|
||
|
||
Every check interval the script:
|
||
|
||
1. **DNS** — resolves the hostname and measures lookup time
|
||
2. **SSL** — connects on port 443 and reads the certificate expiry
|
||
3. **HTTP** — sends `GET` to the target URL, records status code and latency
|
||
4. **Search** — sends `GET /search?q=test` to measure search endpoint response
|
||
5. **Persist** — appends the record to `metrics.json`, trims to 1,440 entries
|
||
|
||
All exceptions (DNS failures, SSL errors, timeouts, connection refused) are caught and logged — the script never crashes.
|
||
|
||
## Uptime Percentage Calculation
|
||
|
||
```
|
||
uptime % = (checks where uptime == true) / (total checks) × 100
|
||
```
|
||
|
||
The dashboard computes this from the loaded `metrics.json` data. When the file contains ≤1,440 records, the percentage reflects all available data; otherwise it represents the last 24 hours.
|
||
|
||
## Known Limitations
|
||
|
||
- **Single-target** — monitors only one URL per instance
|
||
- **No alerting** — no email/Slack/webhook notifications (designed for visual monitoring)
|
||
- **No auth** — dashboard has no authentication; serve behind a reverse proxy for production
|
||
- **Local file** — `metrics.json` is read via browser `fetch()`; requires same-origin or local file access
|
||
- **Chart.js CDN** — the dashboard loads Chart.js from a CDN; works offline after first load (cached)
|
||
- **Search metric** — only measures response time, not result quality or completeness
|
||
|
||
## License
|
||
|
||
MIT
|