الملفات
2026-07-28 16:08:22 +03:00

97 أسطر
3.1 KiB
Python

import requests
import socket
import ssl
import time
import json
import os
from datetime import datetime
TARGET_HOST = "mithal.space"
TARGET_URL = f"https://{TARGET_HOST}"
DATA_FILE = "metrics.json"
MAX_RECORDS = 1440
def get_dns_latency():
"""حساب وقت تحليل الـ DNS بالملي ثانية"""
start_time = time.time()
try:
socket.gethostbyname(TARGET_HOST)
return round((time.time() - start_time) * 1000, 2)
except Exception:
return 0
def get_ssl_expiry_days():
"""التحقق من شهادة SSL وحساب الأيام المتبقية"""
try:
context = ssl.create_default_context()
with socket.create_connection((TARGET_HOST, 443), timeout=5) as sock:
with context.wrap_socket(sock, server_hostname=TARGET_HOST) as ssock:
ssl_info = ssock.getpeercert()
expire_date_str = ssl_info['notAfter']
expire_date = datetime.strptime(expire_date_str, "%b %d %H:%M:%S %Y %Z")
remaining = expire_date - datetime.utcnow()
return remaining.days
except Exception:
return 0
def check_health():
"""جمع كل المقاييس المطلوبة"""
metrics = {
"timestamp": datetime.now().strftime("%Y-%m-%d %H:%M:%S"),
"uptime_status": "Down",
"latency_ms": 0,
"ssl_days_left": get_ssl_expiry_days(),
"dns_latency_ms": get_dns_latency(),
"search_latency_ms": 0
}
try:
response = requests.get(TARGET_URL, timeout=10)
metrics["latency_ms"] = round(response.elapsed.total_seconds() * 1000, 2)
if response.status_code == 200:
metrics["uptime_status"] = "Up"
else:
metrics["uptime_status"] = f"Error {response.status_code}"
except Exception:
metrics["uptime_status"] = "Down"
try:
search_res = requests.get(TARGET_URL, params={"q": "test"}, timeout=10)
metrics["search_latency_ms"] = round(search_res.elapsed.total_seconds() * 1000, 2)
except Exception:
metrics["search_latency_ms"] = 0
return metrics
def save_metrics(new_metric):
"""حفظ البيانات في ملف JSON"""
data = []
if os.path.exists(DATA_FILE):
try:
with open(DATA_FILE, "r") as f:
data = json.load(f)
except json.JSONDecodeError:
data = []
data.append(new_metric)
if len(data) > MAX_RECORDS:
data = data[-MAX_RECORDS:]
with open(DATA_FILE, "w") as f:
json.dump(data, f, indent=4)
if __name__ == "__main__":
print(f"Starting monitoring for {TARGET_HOST}... (Press Ctrl+C to stop)")
while True:
try:
metrics = check_health()
save_metrics(metrics)
print(f"[{metrics['timestamp']}] Logged: {metrics['uptime_status']} | Latency: {metrics['latency_ms']}ms | SSL: {metrics['ssl_days_left']} days left")
time.sleep(60)
except KeyboardInterrupt:
print("\nMonitoring stopped by user.")
break
except Exception as e:
print(f"Unexpected error: {e}")
time.sleep(60)