← Use Cases
⚙️ Cron Jobs & Background Workers

Silent job failures
end tonight.

Your nightly invoice job failed at 2am. Your database backup didn't run on Sunday. Your email queue has been stuck for three hours. You found out when a user complained.

Umlogger's missing-data alerts fix this. Each job pings one URL on success. If the ping stops arriving, you get an email. No agents to install. No Prometheus exporters to configure. No PagerDuty bill. Read the cron monitoring guide →

Job health · Live1 alert
nightly-invoice-gen
Every day at 2am · last run 02:00:04
✓ healthy
last duration: 4,830 ms
hourly-email-queue
Every hour · last run 05:00:00
✓ healthy
last duration: 812 ms
weekly-report-export
Every Monday at 6am · last run Never
✗ missed
⚠ Alert sent · Expected within last 7 days, no data received

How missing-data alerts work

This is the key insight that makes Umlogger perfect for job monitoring: instead of checking whether a job ran, you check whether data stopped arriving.

1
Job pings on success
At the end of every successful run, send one HTTP request with the job duration in milliseconds. That's it.
2
Set the expected interval
On the metric detail page, add a missing-data alert: "alert if no data arrives within X hours." Match it to your cron schedule.
3
Silence = alarm
When the job fails, crashes, or simply never runs, no ping arrives. Umlogger emails your team within the window you configured.
4
Chart the duration too
Because you send the duration as the value, you also get a chart of how long each run takes. Spot slowdowns before they become timeouts.

Works in any language, any runtime

If your cron job can make an HTTP request, it can report to Umlogger. Python, Node, Ruby, Go, Bash — one GET at the end of the job is all it takes.

Bash cron job
Python script
Node.js worker
Bash
#!/bin/bash
START=$(date +%s%3N)

# --- your job here ---
python /opt/scripts/invoice_gen.py

DURATION=$(( $(date +%s%3N) - START ))
curl -s "https://data.umlogger.com/api/m?key=pmk_JOB_KEY&value=$DURATION"
Python
import time, urllib.request

start = time.time()

# --- your job here ---
run_weekly_export()

duration_ms = int((time.time() - start) * 1000)
urllib.request.urlopen(
  f"https://data.umlogger.com/api/m?key=pmk_JOB_KEY&value={duration_ms}"
)
Node.js
const start = Date.now()

// --- your job here ---
await processEmailQueue()

const ms = Date.now() - start
await fetch(
  `https://data.umlogger.com/api/m?key=pmk_JOB_KEY&value=${ms}`
)

Not just cron — anything that runs periodically

The same pattern works for any recurring task.

📧
Email queues
Ping after each batch send. Alert if the queue processor stops draining.
💾
Database backups
Confirm daily backups ran. Alert if the backup job is silent for more than 26 hours.
🔄
Data sync jobs
Track how long syncs take. Slowdowns show as rising duration on the chart before they become failures.
☁️
Serverless functions
Lambda, Vercel cron, Cloud Run jobs — all supported. Fire one fetch at the end of the invocation.
🧹
Cleanup tasks
Nightly log rotation, temp file purges, cache invalidation. Know they ran — and how long they took.
📊
Report generation
Weekly PDF reports, analytics aggregations, data warehouse syncs. One ping = confirmation it finished.

Track queue depth — not just job completions

A queue that's growing is a problem waiting to happen. Log the queue depth as a value metric every minute and set a threshold alert for when it exceeds your comfortable ceiling.

Combine it with a job-completion metric and you get a full picture: items entering vs. items processed — without running a metrics sidecar.

// Push queue depth every minute (BullMQ example)
setInterval(async () => {
  const waiting = await queue.getWaitingCount()
  await fetch(
    `https://data.umlogger.com/api/m?key=pmk_QUEUE_DEPTH_KEY` +
    `&value=${waiting}`
  )
}, 60_000)

// Alert configured in Umlogger UI:
// "value exceeds 500 for more than 5 minutes"
// → email the on-call engineer

Find out about failures
before your users do.

42-day free trial. No credit card required. Works with any language or runtime that can make an HTTP request.

Start monitoring jobs →