Grafana OnCall is an open-source on-call management platform that centralizes alerting, escalation policies, and on-call schedules across your engineering team. Deployed as a Python/Django + Go hybrid (engine on port 8080, web UI proxied through Grafana on port 3000), it sits in the critical path of your incident response workflow. When OnCall goes down, alerts don't route, pages don't fire, and incidents go unacknowledged. Vigilmon keeps watch over every OnCall component so your on-call tooling never silently fails.
What You'll Set Up
- HTTP availability monitor for the OnCall web UI (via Grafana)
- Alert group processing engine health check
- PostgreSQL database connectivity monitor
- Redis cache and Celery task queue health
- Outbound notification delivery (Telegram, Slack, PagerDuty) monitors
- Inbound webhook alert receiver health check
- On-call schedule calculation service monitor
- Escalation policy execution engine monitor
- Mobile push notification relay monitor
Prerequisites
- Grafana OnCall deployed (Docker Compose or Kubernetes) with the engine accessible
- Grafana running on port 3000 with the OnCall plugin installed
- A free Vigilmon account
Step 1: Monitor the Grafana OnCall Web UI
The OnCall plugin surfaces through the Grafana web interface. Monitor the Grafana instance to catch any UI availability issues:
- Log in to vigilmon.online and click Add Monitor.
- Set Type to
HTTP / HTTPS. - Enter your Grafana URL:
https://grafana.yourdomain.com/api/health. - Set Check interval to
1 minute. - Set Expected HTTP status to
200. - Click Save.
The /api/health endpoint returns a JSON payload with Grafana's database status — a richer signal than a static page check:
{"commit":"abc123","database":"ok","version":"10.x.x"}
If database is not ok, the Grafana backend is degraded and OnCall data may be unavailable.
Step 2: Monitor the Alert Processing Engine
The OnCall engine (Go service, port 8080 by default) processes incoming alert groups and drives escalations. Probe its health endpoint directly:
- Add a new HTTP / HTTPS monitor.
- URL:
http://oncall-engine:8080/health/(or your publicly routable equivalent). - Set Expected HTTP status to
200. - Set Check interval to
1 minute.
If the engine is behind a private network, expose the health endpoint through your reverse proxy with restricted access, or use Vigilmon's agent-based monitoring if your architecture supports it.
The engine health endpoint returns:
{"status": "ok"}
A non-200 response or connection timeout means alert routing is broken — a severity-1 condition worth an immediate page.
Step 3: Monitor PostgreSQL Connectivity
OnCall stores alert groups, schedules, escalation policies, and user data in PostgreSQL. Use a health check endpoint that validates the DB connection:
Add a /ready or /healthz probe to your OnCall setup that confirms the database is reachable. If you use the official OnCall Docker Compose setup, the engine exposes /ready:
- Add a new HTTP / HTTPS monitor.
- URL:
http://oncall-engine:8080/ready/. - Expected status:
200. - Interval:
1 minute.
Alternatively, monitor PostgreSQL directly at the TCP level:
- Add a new TCP monitor.
- Host:
your-postgres-host, Port:5432. - Interval:
1 minute.
A TCP failure here means OnCall cannot persist alert data and escalations will fail.
Step 4: Monitor Redis and the Celery Task Queue
OnCall uses Redis as a message broker for Celery workers that handle async tasks (notification dispatching, schedule recalculation, webhook delivery). Monitor Redis availability:
- Add a TCP monitor.
- Host:
your-redis-host, Port:6379. - Interval:
1 minute.
For deeper Celery queue health, expose a queue-depth endpoint from your application and monitor it with an HTTP check. If the Celery queue depth grows beyond a threshold, workers are falling behind on notification dispatch:
# Example Django view to expose queue depth
from django.http import JsonResponse
from redis import Redis
def celery_health(request):
r = Redis.from_url(settings.CELERY_BROKER_URL)
queue_length = r.llen('celery')
status = 'ok' if queue_length < 1000 else 'degraded'
return JsonResponse({'status': status, 'queue_length': queue_length})
Add an HTTP monitor pointing to this endpoint with expected status 200 and a keyword check for "ok".
Step 5: Monitor Outbound Notification Delivery
OnCall sends alerts via Telegram, Slack, PagerDuty, and SMS. While you cannot directly probe third-party APIs, you can monitor the connector services and use Vigilmon cron heartbeats to verify end-to-end delivery.
Heartbeat for notification dispatch
In your OnCall Celery task that dispatches notifications, ping a Vigilmon heartbeat URL on each successful batch:
import requests
def dispatch_notifications_task():
# ... dispatch logic ...
notify_users()
# Ping Vigilmon heartbeat after successful dispatch
requests.get('https://vigilmon.online/heartbeat/YOUR_HEARTBEAT_ID', timeout=5)
- In Vigilmon, click Add Monitor → Cron Heartbeat.
- Set the expected interval to match your notification dispatch frequency (e.g.
5 minutes). - Paste the heartbeat URL into your task.
If notifications stop dispatching for any reason — Celery crash, Redis failure, API rate limit — the heartbeat goes silent and Vigilmon alerts you.
Step 6: Monitor the Inbound Webhook Alert Receiver
OnCall receives alerts from Prometheus Alertmanager, Grafana alerts, and other sources via inbound webhooks. These endpoints must stay available or alerts never enter OnCall.
- Add an HTTP / HTTPS monitor.
- URL:
https://oncall.yourdomain.com/integrations/v1/alertmanager/YOUR_TOKEN/. - Set Expected HTTP status to
405(Method Not Allowed — GET on a POST-only endpoint, which confirms the endpoint exists and is routing correctly). - Interval:
1 minute.
If the webhook receiver returns a 502, 503, or times out, incoming alerts from Alertmanager and other sources are being dropped.
Step 7: Monitor the On-Call Schedule Service
On-call schedule calculation — determining who is on-call right now — runs as part of the OnCall engine. Verify schedule resolution is working by probing the schedules API:
curl -H "Authorization: Bearer YOUR_API_TOKEN" \
https://oncall.yourdomain.com/api/v1/schedules/ \
-o /dev/null -w "%{http_code}"
Add an HTTP monitor for the schedules API endpoint with expected status 200. If schedules fail to resolve, your escalation policies will page the wrong people (or nobody).
Step 8: Monitor Escalation Policy Execution
Escalation policies are the heart of OnCall. Add a cron heartbeat that fires whenever the escalation engine processes a cycle:
# In your escalation processing Celery beat task
def process_escalations():
run_escalation_cycle()
requests.get('https://vigilmon.online/heartbeat/ESCALATION_HEARTBEAT_ID', timeout=5)
- Add a Cron Heartbeat monitor in Vigilmon.
- Set the interval to match your escalation cycle frequency (typically
1 minute).
Step 9: Configure Alerts and Summary
Set up alert channels in Vigilmon (Alert Channels → Add Slack or email) and configure thresholds:
- Consecutive failures before alert:
2for web UI monitors (allow one transient failure). - Consecutive failures before alert:
1for the alert processing engine — any failure is critical. - Use Maintenance windows during OnCall upgrades to suppress false alerts.
| Monitor | Target | What It Catches |
|---|---|---|
| Grafana web UI | /api/health | Grafana backend failure, DB disconnect |
| Engine health | :8080/health/ | Alert processing engine down |
| Engine readiness | :8080/ready/ | PostgreSQL connectivity lost |
| Redis TCP | :6379 | Cache/broker unavailable, Celery stalled |
| Notification heartbeat | Heartbeat URL | Notification dispatch stopped |
| Webhook receiver | Alertmanager integration URL | Inbound alerts dropped |
| Schedules API | /api/v1/schedules/ | Schedule resolution broken |
| Escalation heartbeat | Heartbeat URL | Escalation engine stalled |
Grafana OnCall is your incident response nervous system — when it fails, your team loses visibility at exactly the wrong moment. With Vigilmon watching every layer from the web UI to the Celery workers, you'll know about OnCall issues before they silently swallow the next real incident.