DEV Community

Joao Thomazinho
Joao Thomazinho

Posted on • Originally published at cronobserver.com

How to migrate from Dead Man's Snitch to CronObserver in 5 minutes

Silent job failures usually hurt the most. This guide shows how to move from Dead Man's Snitch (DMS) to CronObserver without rewriting every scheduled job.

Why teams migrate

Dead Man's Snitch works well for basic heartbeat monitoring, but teams often hit limitations:

  • Limited payload visibility (no context on why the job failed)
  • Hard to keep history beyond simple tables
  • Alerting restricted to email or basic webhook
  • No synthetic checks or observability integrations

CronObserver follows the same "check-in" model but adds payload logging, synthetic checks, per-observer grace periods, and integrations (Datadog, Prometheus, etc.).

Migration checklist

  1. [x] Create a CronObserver account (free tier covers 1 job)
  2. [x] Create an observer for each DMS snitch (copy schedule + grace period)
  3. [x] Replace the DMS POST call with CronObserver token URL
  4. [x] Test and archive the old snitch

Step 1 – Create observers

Use the CronObserver dashboard to create observers with the same frequency you used in DMS. Example: an hourly job with a 5-minute grace period.

Schedule: Every hour on the hour
Grace: 5 minutes
Alert channels: Email + webhook (Slack/Teams)
Enter fullscreen mode Exit fullscreen mode

Step 2 – Update the check-in call

Replace your DMS URL with the CronObserver token. Example for Linux cron:

# old
curl -fsS -X POST https://deadmanssnitch.com/your-snitch

# new
curl -fsS -X POST https://cronobserver.com/checkin/<token>
Enter fullscreen mode Exit fullscreen mode

Node.js / TypeScript

await runJob();
await fetch("https://cronobserver.com/checkin/<token>", {
  method: "POST",
  headers: { "Content-Type": "application/json" },
  body: JSON.stringify({ status: "success", message: "Job finished" }),
});
Enter fullscreen mode Exit fullscreen mode

Kubernetes CronJob

containers:
  - name: worker
    image: alpine:3
    env:
      - name: CHECKIN_URL
        value: "https://cronobserver.com/checkin/<token>"
    command:
      - sh
      - -c
      - |
        run-job && curl -fsS -X POST "$CHECKIN_URL"
Enter fullscreen mode Exit fullscreen mode

Step 3 – Use payloads and thresholds

CronObserver lets you send structured JSON metadata.

curl -X POST https://cronobserver.com/checkin/<token> \
  -H "Content-Type: application/json" \
  -d '{
    "status": "success",
    "message": "Reports generated",
    "metadata": { "reportId": 42, "duration_ms": 2300 }
  }'
Enter fullscreen mode Exit fullscreen mode
  • Payloads show up in the dashboard for debugging.
  • You can set payload thresholds (e.g., warn if duration_ms exceeds 10,000).

Step 4 – Add synthetic checks (optional)

Instead of waiting for a job to ping you, CronObserver can actively probe your endpoint.

synthetic_check:
  type: httpGet
  url: https://api.example.com/cron/health
  expected_status: 200
  timeout_seconds: 10
Enter fullscreen mode Exit fullscreen mode

Great for verifying queue workers or lambda triggers.

Bonus – Quickstart video

Embed a quickstart snippet directly in your docs or ask CronObserver support for the import template.

Wrap-up

  • Free plan lets you monitor one critical job before committing.
  • Grace periods and cooldowns reduce alert fatigue.
  • Built-in observability integrations (Datadog, New Relic, Prometheus, Sentry, Dynatrace).

👉 Try it now: cronobserver.com/dead-mans-snitch-alternative

Let me know if you need the import CSV – happy to share the template.

Top comments (0)