tutorial

How to Monitor Gatus with Vigilmon (Meta-Monitoring Your Monitor)

Gatus is a fast, self-hosted endpoint monitoring tool that checks the health of your APIs, databases, and services. It's lightweight, configuration-driven, a...

Gatus is a fast, self-hosted endpoint monitoring tool that checks the health of your APIs, databases, and services. It's lightweight, configuration-driven, and increasingly popular in homelab and production environments alike.

But here's the thing: Gatus is itself a service. It runs in a container, depends on a configuration file, serves a dashboard, and can be silently killed by an OOM event or a bad deploy. If Gatus goes down, you lose visibility into everything it was watching — and you won't know until a user reports a real outage.

The solution is meta-monitoring: monitor your monitor with an independent external tool. In this tutorial you'll set up Vigilmon to watch Gatus from outside your network, so a Gatus failure triggers an alert through a completely separate path.


Why monitoring Gatus externally matters

Gatus handles the inside view — it knows whether your internal APIs respond. Vigilmon handles the outside view — it knows whether Gatus itself is reachable and healthy. These are complementary:

  • Gatus container crashes — if the container exits or OOMs, Gatus stops alerting. Vigilmon still sees the dashboard as unreachable and fires
  • Configuration errors after redeploy — a malformed gatus.yaml can cause Gatus to start silently ignoring checks; Vigilmon detects the dashboard going blank
  • Disk/volume issues — if Gatus can't write state, it may serve stale data; monitoring the /health API detects this
  • Alert delivery failures — Gatus uses webhooks, Slack, or email to deliver alerts. Vigilmon tests the delivery path end-to-end using a dead man's switch pattern
  • Network partition — if Gatus is isolated from its targets but still running, you need to know that Gatus itself is alive even while its checks fail

What you'll need

  • A running Gatus instance (Docker, Kubernetes, or bare metal)
  • Gatus's web UI and API accessible from the internet (or via a reverse proxy)
  • A free Vigilmon account — sign up takes 30 seconds

Step 1: Verify Gatus's built-in health endpoint

Gatus exposes an /api/v1/endpoints/statuses JSON API and a /health endpoint (if enabled). Check your gatus.yaml to make sure the web server is running:

# gatus.yaml (partial)
web:
  port: 8080
  read-timeout: 15s
  write-timeout: 15s

With a default setup, Gatus serves:

  • http://your-gatus-host:8080/ — the dashboard UI
  • http://your-gatus-host:8080/api/v1/endpoints/statuses — JSON status for all endpoints

Test the API response:

curl http://your-gatus-host:8080/api/v1/endpoints/statuses
# Returns a JSON array of endpoint statuses

If you're behind a reverse proxy (nginx, Caddy, Traefik), confirm the proxy is forwarding correctly:

curl https://status.yourdomain.com/api/v1/endpoints/statuses

Step 2: Monitor the Gatus API health endpoint

Log in to vigilmon.online and go to Monitors → New Monitor.

Set up your first monitor:

| Field | Value | |-------|-------| | Type | HTTP / HTTPS | | Name | Gatus API Health | | URL | https://status.yourdomain.com/api/v1/endpoints/statuses | | Check interval | 1 minute | | Expected status code | 200 | | Response body contains | results |

The results keyword check ensures Gatus is actually returning status data, not just responding with an empty page or error HTML.

Click Save. Vigilmon will begin probing from multiple regions immediately.


Step 3: Monitor the Gatus dashboard availability

Gatus's web UI is what your team uses to get a quick overview of infrastructure health. If the dashboard loads a blank page or returns a 5xx error, that's operationally just as bad as Gatus being down.

Add a second monitor:

| Field | Value | |-------|-------| | Type | HTTP / HTTPS | | Name | Gatus Dashboard UI | | URL | https://status.yourdomain.com/ | | Check interval | 2 minutes | | Expected status code | 200 | | Response body contains | Gatus |

The body check on Gatus ensures the page is rendering real content rather than a reverse-proxy error page.


Step 4: Monitor alert delivery with a heartbeat

This is the most powerful meta-monitoring technique: configure Gatus to periodically ping a Vigilmon heartbeat URL. If Gatus stops running or stops delivering alerts, Vigilmon detects the silence and fires.

Create a heartbeat monitor in Vigilmon

  1. Go to Monitors → New Monitor → Heartbeat
  2. Name it: Gatus Alert Delivery
  3. Set the expected interval to 5 minutes
  4. Save — Vigilmon gives you a unique ping URL like https://hb.vigilmon.online/ping/abc123xyz

Configure Gatus to ping the heartbeat

In your gatus.yaml, add an endpoint that pings Vigilmon's heartbeat URL on a schedule:

endpoints:
  - name: vigilmon-heartbeat
    url: https://hb.vigilmon.online/ping/abc123xyz
    interval: 5m
    conditions:
      - "[STATUS] == 200"
    alerts:
      - type: slack          # or whichever alert channel you use
        failure-threshold: 1
        success-threshold: 1
        send-on-resolved: true

Now the chain is complete:

  • Gatus pings Vigilmon every 5 minutes
  • If Gatus crashes, the pings stop
  • Vigilmon fires an alert after 5 minutes of silence
  • You're notified through Vigilmon — completely independent of Gatus

Step 5: Monitor the TCP layer

If Gatus runs on a non-standard port or behind a TCP load balancer, add a TCP check to catch port-level failures that HTTP monitoring wouldn't catch:

  1. Go to Monitors → New Monitor → TCP Port
  2. Host: your-gatus-host.yourdomain.com
  3. Port: 8080 (or your Gatus port)
  4. Interval: 1 minute

This catches scenarios where the HTTP server inside Gatus hangs but the port is still bound, or vice versa.


Step 6: Configure alert channels

Connect Vigilmon to your notification stack so Gatus failures reach you reliably.

Email

  1. Go to Alert Channels → Add Channel → Email
  2. Enter your on-call address
  3. Assign to all your Gatus monitors

Webhook (Slack, Teams, PagerDuty)

  1. Go to Alert Channels → Add Channel → Webhook
  2. Paste your Slack incoming webhook URL or PagerDuty integration URL
  3. Assign to all monitors

When Gatus goes down, Vigilmon sends a payload like:

{
  "monitor_name": "Gatus API Health",
  "status": "down",
  "url": "https://status.yourdomain.com/api/v1/endpoints/statuses",
  "started_at": "2026-07-01T09:12:00Z",
  "duration_seconds": 67
}

Step 7: Set up a status page

If your team or stakeholders rely on Gatus for visibility, a Vigilmon status page gives them an independent confirmation channel when Gatus itself is unavailable.

  1. Go to Status Pages → New Status Page
  2. Name it: Infrastructure Monitoring Health
  3. Add your monitors: Gatus API Health, Gatus Dashboard UI, Gatus Alert Delivery heartbeat
  4. Publish the page

Share the link in your runbook. When Gatus is down, your team can check Vigilmon's status page directly.


Monitor summary

| Monitor | Type | Catches | |---------|------|---------| | Gatus API /api/v1/endpoints/statuses | HTTP | Container crash, config errors, process hang | | Gatus Dashboard / | HTTP | Reverse proxy failure, UI rendering errors | | Gatus Alert Delivery | Heartbeat | Silent Gatus failures, alert pipeline breakage | | Gatus TCP port | TCP | Port-level connectivity failures |


What's next

  • SSL monitoring — if your Gatus dashboard is behind TLS, Vigilmon tracks your certificate expiry automatically
  • Multi-region confirmation — Vigilmon probes from multiple regions, so a single network hiccup doesn't trigger false alerts for your meta-monitoring
  • Uptime history — Vigilmon's response time graphs let you see if Gatus has been running slow before it actually fails, which can indicate resource pressure

Start meta-monitoring your monitoring stack at vigilmon.online — free tier, no credit card required.

Monitor your app with Vigilmon

Free plan — 5 monitors, no credit card required. Up and running in 60 seconds.

Start free →