OTOMY
SERVER CONFIGJune 9, 20266 min

Server Monitoring: Setting Up Reliable Automatic Alerts

A server going down without warning means lost revenue. Here's how to set up server monitoring with automatic alerts that wakes you up before your customers notice.

M

By

Melissa Slimani

Server Monitoring: Setting Up Reliable Automatic Alerts

Why Server Monitoring with Automatic Alerts Is Not Optional

An e-commerce site going down at 2 PM on a Tuesday costs an SMB between €500 and €5,000. A backend API silently choking for 3 hours means corrupted data and frustrated customers. Server monitoring with automatic alerts isn't a DevOps luxury — it's business insurance.

The problem? Most SMBs configure alerts once, get flooded with false positives, mute the notifications, and end up blind the day it actually matters.

This guide shows you how to build an alerting system that's reliable, tiered, and actionable — not just another dashboard nobody checks.

The 4 Critical Metrics to Monitor First

Before tools, let's talk strategy. Monitoring everything means monitoring nothing. Focus on these 4 pillars:

  • Uptime: Is your server responding? HTTP checks every 60 seconds minimum
  • CPU/RAM usage: Warning threshold at 80%, critical at 95%
  • Disk space: The silent killer — alert at 85% utilization
  • Response time: If your API takes more than 2s, users leave
# Quick example: disk check with alert
DISK_USAGE=$(df -h / | awk 'NR==2 {print $5}' | sed 's/%//')
if [ "$DISK_USAGE" -gt 85 ]; then
  curl -X POST https://your-webhook.com/alert \
    -d '{"severity": "warning", "message": "Disk at '$DISK_USAGE'%"}'
fi

Recommended Architecture: Our Monitoring Stack

At Otomy, here's the architecture we deploy for our SMB clients:

Collection Layer: Netdata + Prometheus

Netdata installs in one command and provides granular real-time monitoring:

bash <(curl -Ss https://my-netdata.io/kickstart.sh)

For more complex setups (multi-server, Kubernetes), Prometheus with node_exporter remains the gold standard:

# prometheus.yml - basic configuration
scrape_configs:
  - job_name: 'node'
    static_configs:
      - targets: ['prod-server:9100', 'staging-server:9100']
    scrape_interval: 30s

Alerting Layer: Alertmanager + n8n

This is where the magic happens. Prometheus Alertmanager handles deduplication and routing, but we add n8n as an intelligent alert orchestrator:

  1. Alertmanager sends a webhook to n8n
  2. n8n checks severity and time of day (no SMS at 3 AM for a warning)
  3. n8n routes to the right channel: Slack for warnings, SMS/call for critical
  4. n8n logs the alert to Supabase for history and analysis

Notification Layer: Tiering to Prevent Fatigue

Here's our notification matrix:

Severity Channel Escalation Delay
Info Grafana dashboard only None
Warning Slack #ops + email 30 min → SMS
Critical SMS + Slack + PagerDuty call 5 min → manager escalation
Fatal Immediate call + Supabase incident Instant

n8n Configuration: The Intelligent Alert Workflow

Here's the n8n workflow we use in production:

Node 1 — Webhook Trigger: receives the Alertmanager payload

Node 2 — Switch: routes based on severity

Node 3 — IF (time-based): between 10 PM and 7 AM, only critical/fatal alerts trigger SMS

Node 4 — Claude AI (optional but powerful): we send the alert context to Claude AI via API to get a plain-language diagnostic suggestion

{
  "prompt": "Server prod-01, CPU at 97% for 10 min, RAM at 82%, 3 active Node.js processes. What is the likely diagnosis and recommended action?"
}

Node 5 — Notification: enriched message sent to Slack with AI diagnosis

Node 6 — Supabase Insert: complete log for post-mortem analysis

The 5 Fatal Mistakes to Avoid

1. No Progressive Thresholds

Don't set a single alert at 90% CPU. Configure: 70% (info), 80% (warning), 95% (critical). Context changes everything.

2. Alerts Without Context

A message saying "High CPU" is useless. Include: which server, what value, for how long, which processes are consuming resources.

3. No Silence Periods (Inhibition)

During a planned deployment, your alerts should stay quiet. Configure maintenance windows in Alertmanager:

inhibit_rules:
  - source_match:
      alertname: 'DeploymentInProgress'
    target_match_re:
      severity: 'warning|info'

4. Single Notification Channel

If everything goes through email, nothing is urgent. If everything goes through SMS, everything gets ignored. Tier your notifications.

5. Never Testing

Every month, trigger a fake critical alert. If nobody responds within 5 minutes, your system is broken.

Monitoring for Vercel and Serverless Projects

For applications deployed on Vercel, traditional server monitoring doesn't apply. Here's our approach:

  • Vercel Analytics for serverless function response times
  • Checkly or UptimeRobot for synthetic monitoring (external HTTP checks)
  • n8n querying the Vercel API every 5 minutes to detect failed deployments
  • Slack alerts if P95 response time exceeds 3 seconds

Deployment Checklist

Before considering your monitoring operational, validate every item:

  • Netdata or Prometheus installed on every server
  • Alertmanager configured with at least 3 severity levels
  • n8n workflow tested end-to-end
  • Slack + SMS notifications configured and verified
  • Alert logs stored in Supabase
  • Critical alert test completed with the team
  • Runbook documented: for every alert, a procedure
  • Monthly alert review scheduled

Final Thoughts

Server monitoring with automatic alerts isn't a one-time project. It's a living system that must evolve with your infrastructure. Start simple — Netdata + n8n + Slack — then add Prometheus, Grafana, and AI-powered analysis as your infrastructure grows.

At Otomy, we configure this type of stack for SMBs across France and Algeria. Well-designed monitoring is the difference between "we had a 3-hour incident" and "we fixed the problem before anyone noticed."

OTOMY

Ready to automate your business?

Book a free call — 30 minutes to identify what we can automate for you.