
Render has grown into a serious platform for deploying web services, background workers, cron jobs, and databases. Its automatic deployments, built-in SSL, and managed infrastructure remove a lot of operational overhead.
But like any hosting platform, Render's internal tooling shows you what's happening inside your service — not what your users experience from the outside. External monitoring fills that gap.
Render includes:
What Render doesn't provide:
Render supports health check configuration for web services. In your service settings, you can specify a health check path and Render will check it before routing traffic to a new deployment.
This is valuable for preventing broken deployments from going live. But it only runs at deploy time — it doesn't continuously monitor your application after deployment.
Configure it in your service settings:
/healthWith this configured, Render won't mark a deployment as live if the health check fails. A deploy that crashes immediately won't get traffic.
Minimal check — Confirms the application is responding:
# FastAPI
@app.get('/health')
async def health():
return {'status': 'ok'}
# Rails
get '/health', to: proc { [200, {}, ['ok']] }
Dependency check — Confirms the database and cache are reachable:
@app.get('/health/deep')
async def deep_health(db: AsyncSession = Depends(get_db)):
try:
await db.execute(text('SELECT 1'))
return {'status': 'ok', 'database': 'ok'}
except Exception as e:
raise HTTPException(status_code=503, detail=str(e))
Use the minimal check for Render's built-in health check (fast, no dependencies) and the deep check for your external monitoring that you want to check more thoroughly.
Render's background workers are services without a public port — they process jobs, run tasks, or perform background computation. When a background worker fails, Render restarts it, but there's no HTTP endpoint to check externally.
The standard approach is heartbeat monitoring: your worker pings a URL at regular intervals to confirm it's alive. If the ping stops coming, an alert fires.
import httpx
import asyncio
async def process_jobs():
while True:
try:
job = await queue.dequeue()
await process(job)
# Ping heartbeat after each successful batch
async with httpx.AsyncClient() as client:
await client.get('https://your-heartbeat-url')
except Exception as e:
logger.error(f'Worker error: {e}')
await asyncio.sleep(5)
See how to monitor cron jobs for detailed heartbeat monitoring setup.
For workers that need more than a heartbeat, run a minimal HTTP server alongside the worker process:
import threading
from http.server import HTTPServer, BaseHTTPRequestHandler
class HealthHandler(BaseHTTPRequestHandler):
def do_GET(self):
if self.path == '/health':
self.send_response(200)
self.end_headers()
self.wfile.write(b'{"status": "ok"}')
def log_message(self, format, *args):
pass # Suppress access logs
def start_health_server():
server = HTTPServer(('0.0.0.0', 8080), HealthHandler)
server.serve_forever()
# Start health server in background thread
threading.Thread(target=start_health_server, daemon=True).start()
# Main worker loop
run_worker()
Set a PORT environment variable on Render and point monitoring at /health on that port.
Render's cron job service runs commands on a schedule. When a cron job fails, Render logs the failure — but you won't know unless you check the logs or set up alerting.
Use post-job pings to an uptime monitor's heartbeat URL:
# Your cron command
python generate_report.py && curl -s https://your-heartbeat-url
The && means the ping only fires if the command succeeds. If it fails, no ping — and your heartbeat monitor fires an alert.
Render's free tier spins down services after inactivity. The first request after a spin-down period takes significantly longer while the container starts up. This can look like downtime to monitoring tools if the timeout is set too short.
Two options:
If you're monitoring a free-tier Render service, configure your monitor's timeout accordingly to avoid false positive alerts on spin-up delays.
Domain Monitor monitors your Render services from multiple global locations, separate from Render's own infrastructure. This means:
Create a free account and add your Render service URL. For background workers with a health endpoint, add that URL too. Set the check interval to every minute for production services.
See how to set up downtime alerts for configuring alert channels, and website monitoring checklist for developers for a complete pre-launch monitoring setup.
When your site goes down, your status page becomes the most important page you have. Here's why it matters, what happens when you don't have one, and what a good status page does during a real outage.
Read moreYour domain is resolving, but pointing to the wrong server — showing old content, a previous host's page, or someone else's site entirely. Here's what causes this and how to diagnose it.
Read moreUptime monitoring isn't foolproof. Single-location monitors, wrong health check endpoints, long check intervals, and false positives can all cause real downtime to go undetected. Here's what to watch out for.
Read moreLooking to monitor your website and domains? Join our platform and start today.