Python Automated Website Uptime Monitor

Written by

in

Keeping your website online 24/7 is a non‑negotiable expectation for users, search engines, and businesses alike. Even a few minutes of downtime can cost you traffic, revenue, and credibility. Fortunately, Python makes it incredibly easy to build an automated website uptime monitor that checks your site at regular intervals, sends instant alerts, and logs detailed reports for future analysis. In this guide, we’ll walk through everything you need to know—from the essential features of a reliable monitor to a step‑by‑step code tutorial—so you can deploy a robust solution in minutes.

Why Website Uptime Matters for SEO and Business

Search engines treat site availability as a ranking signal. A site that frequently returns 5xx errors may see a drop in organic traffic, while a reliable site enjoys better crawl rates and user trust. For e‑commerce platforms, every minute of downtime translates directly into lost sales. Monitoring uptime isn’t just a technical safeguard; it’s a strategic advantage.

Key Features of an Automated Uptime Monitor

  • Periodic health checks – HTTP GET requests at configurable intervals.
  • Multi‑endpoint support – Monitor several URLs, APIs, or subdomains from a single script.
  • Instant alerts – Email, SMS, or Slack notifications when a site goes down.
  • Retry logic – Automatic re‑tries to filter out false positives caused by transient network glitches.
  • Logging & reporting – Persistent logs, uptime percentages, and visual dashboards.
  • Scalable scheduling – Run checks via cron, APScheduler, or serverless functions.

Getting Started: Prerequisites

Before you dive into the code, make sure you have the following installed on your development machine or server:

  1. Python 3.8+ (recommended latest stable version)
  2. pip for package management
  3. Virtual environment tool (venv or virtualenv)
  4. Access to an SMTP server or a third‑party service like SendGrid for email alerts
  5. Optional: Twilio credentials for SMS, or a Slack webhook URL for chat alerts

Step‑by‑Step Guide to Build Your Own Monitor

1. Setting Up the Project

Create a clean workspace and isolate dependencies using a virtual environment:

mkdir python-uptime-monitor
cd python-uptime-monitor
python -m venv venv
source venv/bin/activate  # On Windows use: venv\Scripts\activate
pip install --upgrade pip

2. Choosing the Right Libraries

For a lightweight solution, the following packages cover all core needs:

  • requests – Simple HTTP client for health checks.
  • APScheduler – Advanced scheduler for flexible interval jobs.
  • python‑dotenv – Securely load environment variables.
  • loguru – Modern logging with rotation and easy formatting.

Install them with:

pip install requests APScheduler python-dotenv loguru

3. Writing the Core Check Function

The heart of the monitor is a function that sends an HTTP request and evaluates the response. Below is a concise implementation:

import os
import requests
from loguru import logger

def check_url(url: str, timeout: int = 10) -> bool:
    """Return True if the URL responds with a 2xx or 3xx status code."""
    try:
        response = requests.get(url, timeout=timeout, verify=False)
        if 200 <= response.status_code < 400:
            logger.info(f"✅ {url} is up (status {response.status_code})")
            return True
        else:
            logger.warning(f"⚠️ {url} returned unexpected status {response.status_code}")
            return False
    except requests.RequestException as e:
        logger.error(f"❌ {url} check failed: {e}")
        return False

4. Implementing Email/SMS Alerts

For email alerts, we’ll use the built‑in smtplib module. Store credentials in a .env file to keep them out of source control.

# .env example
SMTP_SERVER=smtp.gmail.com
SMTP_PORT=587
SMTP_USER=your.email@gmail.com
SMTP_PASS=your_app_password
ALERT_RECIPIENT=admin@example.com

Alert function:

import smtplib
from email.mime.text import MIMEText
from dotenv import load_dotenv

load_dotenv()

def send_alert(subject: str, body: str):
    msg = MIMEText(body, "plain")
    msg["Subject"] = subject
    msg["From"] = os.getenv("SMTP_USER")
    msg["To"] = os.getenv("ALERT_RECIPIENT")

    try:
        with smtplib.SMTP(os.getenv("SMTP_SERVER"), int(os.getenv("SMTP_PORT"))) as server:
            server.starttls()
            server.login(os.getenv("SMTP_USER"), os.getenv("SMTP_PASS"))
            server.send_message(msg)
        logger.info("📧 Alert email sent")
    except Exception as e:
        logger.error(f"Failed to send alert email: {e}")

If you prefer SMS, replace the send_alert body with a Twilio API call.

5. Scheduling with Cron or APScheduler

Using APScheduler gives you Python‑level control without external cron configuration. The following script runs checks every 5 minutes:

from apscheduler.schedulers.blocking import BlockingScheduler
from datetime import datetime

# List of URLs to monitor
URLS = [
    "https://example.com",
    "https://api.example.com/health",
    "https://status.example.org"
]

def monitor():
    logger.info(f"🔎 Starting health check at {datetime.utcnow().isoformat()}Z")
    for url in URLS:
        if not check_url(url):
            subject = f"⚠️ Uptime Alert: {url} is down"
            body = f"The monitor detected a problem with {url} at {datetime.utcnow().isoformat()}Z.\nPlease investigate immediately."
            send_alert(subject, body)

if __name__ == "__main__":
    scheduler = BlockingScheduler()
    scheduler.add_job(monitor, "interval", minutes=5, next_run_time=datetime.now())
    logger.info("🚀 Uptime monitor started")
    scheduler.start()

6. Logging and Reporting

Persistent logs help you calculate uptime percentages over weeks or months. loguru can rotate logs daily and keep a 30‑day archive:

logger.add(
    "logs/uptime_{time:YYYY-MM-DD}.log",
    rotation="00:00",
    retention="30 days",
    level="INFO",
    format="{time:YYYY-MM-DD HH:mm:ss} | {level} | {message}"
)

To generate a simple uptime report, parse the log files and count successful checks versus total checks.

Deploying and Scaling Your Monitor

For personal projects, running the script on a VPS or a Raspberry Pi is sufficient. For production‑grade monitoring, consider these options:

  • Docker container – Package the monitor with all dependencies and run it on any host.
  • Serverless functions – AWS Lambda or Google Cloud Functions can execute the check every few minutes via CloudWatch Events or Cloud Scheduler.
  • Kubernetes CronJob – Ideal for large enterprises monitoring dozens of endpoints with high reliability.

When scaling, keep an eye on API rate limits and network bandwidth. Group URLs by domain and stagger checks to avoid overwhelming a single server.

Best Practices and Common Pitfalls

  • Use HTTPS verification wisely – Disable verification only for internal testing; production checks should validate SSL certificates.
  • Implement exponential back‑off – Retry failed requests after increasing delays to reduce false alarms.
  • Separate monitoring from business logic – Keep the monitor lightweight; avoid heavy data processing inside the check loop.
  • Secure credentials – Never hard‑code passwords; use environment variables, secret managers, or vault services.
  • Monitor the monitor – Set up a secondary alert if the monitoring script itself crashes or stops logging.

Conclusion

Building a Python automated website uptime monitor is a rewarding project that blends practical DevOps skills with Python’s simplicity. By following the steps above—setting up a clean environment, leveraging requests

Comments

Leave a Reply

Your email address will not be published. Required fields are marked *