“We have monitoring, but no alerts” — this situation is worse than “no monitoring at all” because it creates a false sense of security.
The causes of monitoring failure generally fall into a few categories, and most can be detected in advance. Below, we detail the causes and preventive measures for each.
Cause 1: Monitoring Placed on the Monitored Object Itself
| Practice | Problem |
|---|---|
| Monitoring scripts run on the server itself | If the machine goes down, the script stops running |
| Alerts sent via local cron jobs | Cannot send if the network is down or the machine crashes |
# Typical Problem: Local Cron + Local Email Sending
0 * * * * /root/check.sh | mail -s "Alert" ops@example.com
# Machine crashes → Cron doesn't run → No alert is sent
Prevention: Maintain at least one external monitoring path. Probes independent of the monitored object are the only way to generate alerts when the entire server fails.
Cause 2: Alert Fatigue Leading to Suppression
This is the most common form of failure, and also the most ironic: the monitoring system is working, but humans have stopped paying attention to notifications.
| Phenomenon | Consequence |
|---|---|
| Tens of useless alerts per day | Notifications set to Do Not Disturb |
| Alerts triggered by minor fluctuations | Quickly ignored by everyone |
| Inability to distinguish severity levels | Important alerts get drowned out |
Improvement Methods:
① Set consecutive failure thresholds (e.g., alert only after 3 consecutive failures)
② Implement grading: Info / Warning / Critical
③ Only send notifications for items requiring human intervention; log the rest
# Example: Alert only after consecutive failures
# Check three times; return non-zero only if all fail
for i in 1 2 3; do
curl -sf -m 5 https://example.com/ > /dev/null && exit 0
sleep 5
done
exit 1
“Alert fatigue” is the number one cause of monitoring failure. One rule that never produces false positives is far more useful than ten rules that frequently do.
Cause 3: Unreasonable Threshold Settings
| Problem | Manifestation |
|---|---|
| Thresholds too loose | Issues occur without triggering alerts |
| Thresholds too strict | Frequent false alarms |
| Check intervals too long | Short-term faults are missed |
Common Configuration Issues:
Disk alert at 95% → Too late, insufficient time to handle
Check interval 10 mins → Misses faults lasting less than 5 minutes
CPU alert at 90% → Should also monitor sustained usage around 70%
# Reasonable Check Intervals
# Availability checks: 60 seconds (too short is unnecessary, too long misses issues)
# Resource metrics: 5 minutes
# Certificate expiry: Daily
Cause 4: Alerts Not Reaching Recipients
| Problem | Check |
|---|---|
| Email flagged as spam | Send a test email to confirm |
| Bot Webhook URL changed | Re-verify the endpoint |
| Recipient removed from group | Confirm membership status |
| Service provider limits reached | Review sending logs |
# Regularly test alert channels (this maintenance step is often overlooked)
echo "Test Alert" | mail -s "Monitoring Test" ops@example.com
# Or trigger a test notification
Alert channels must be tested regularly. While configurations may seem static, environments change (URLs change, groups dissolve, tokens expire).
Cause 5: Incomplete Monitoring Coverage (Blind Spots)
| Often Missed Items | Why |
|---|---|
| Certificate Expiry | Everything works until expiration; without monitoring, you rely on user reports |
| Backup Success Status | Failures are silent |
| Inode Usage | Not visible with just `df -h` |
| Outbound Connections | Signal of compromise |
| Third-party Dependencies | If their service goes down, yours is affected too |
# Add these checks
openssl s_client -connect example.com:443 -servername example.com </dev/null 2>/dev/null
| openssl x509 -noout -enddate # Certificate
find /data/backup -maxdepth 1 -type d | sort | tail -1 # Latest backup
df -i # Inode usage
How to Detect Monitoring Failure in Advance
① Conduct Regular “Failure Drills”
Procedure (in a controlled environment):
① Stop a service and check if the alert arrives within the expected timeframe
② Confirm receipt, then restore the service
③ Record the actual alert latency
This exposes:
- Whether detection is active
- If thresholds are reasonable
- If channels are reachable
- If notifications are actually seen
Without drills, you will never know if monitoring is truly working. Configuration does not equal functionality.
② Check “Last Alert Time”
# If a monitoring system hasn't sent any alerts for a long time, two possibilities exist:
# ① The system has been very stable (Good)
# ② The monitoring has stopped working (Bad)
# Use drills to distinguish between these two scenarios
③ Monitor the Monitoring System’s Own Status
# Is the monitoring service still running?
systemctl status uptime-kuma # Or your corresponding monitoring service
docker ps | grep uptime
# Are probe tasks executing? (Check the last check time)
# Verify in the monitoring interface that the "Last Check Time" is recent
Decision Tree
Why No Alert?
├─ Monitoring is co-located with the target → Add an external monitoring path
├─ Too many alerts leading to suppression → Use consecutive failure counts + grading to reduce noise ← Most Common
├─ Unreasonable thresholds → Adjust (Disk 95% is too late, 10-min interval is too long)
├─ Channels unreachable → Send regular test notifications
├─ Blind spots in coverage → Add checks for certificates, backups, inodes, outbound traffic
└─ Prevention
└─ Regular failure drills: Stop service → Check if alert arrives → Record latency
Scenario Walkthrough: Service Down for Two Hours, Zero Alerts
Situation: The site was unavailable for two hours. During this time, the monitoring system showed status as “Normal,” and no alerts were generated. The issue was first identified through user feedback.
- First, confirm if monitoring was actually running →
Checked process status and found the monitoring process itself had stopped.
The failure of the monitoring system was not being monitored by anything. - Trace when it stopped →
It stopped earlier than the incident start time, meaning monitoring failed before the outage occurred. - Understand why “no alerts” happened →
The component responsible for generating alerts no longer existed, so naturally, no alerts were sent. - Include the monitoring system itself in the scope →
Have an external location check the monitoring system’s heartbeat; someone must know if it stops. - Independently verify alert channels →
Even if monitoring runs, if the channel is broken, the result is the same: no alerts received. - Verify with an active downtime drill →
Create a real instance of unavailability to confirm the end-to-end link works.
# Check if monitoring is still alive—the most easily overlooked scenario
systemctl is-active monitoring_service_name
pgrep -x monitoring_process_name >/dev/null && echo running || echo DOWN
# Verify true status externally and compare with monitoring conclusions
curl -sS -o /dev/null -w '%{http_code} %{time_total}sn' https://example.com/
# Self-test alert channel (if monitoring runs but channel fails, result is same: no alert)
curl -sS -X POST alert_channel_url -d 'text=self_test(ignore)' -o /dev/null -w '%{http_code}n'
# Heartbeat: External location checks if monitoring is alive
curl -sS -o /dev/null -w '%{http_code}n' http://monitoring_address:port/
Root Cause: The monitoring system itself stopped running and went unnoticed.
It observes all objects but is observed by nothing—so after its failure,
all anomalies became blind spots.
Two Key Takeaways:
- The monitoring system itself must be independently checked externally; someone must know if it fails.
Having another location check its heartbeat is the only way to cover this blind spot. - “Long periods without alerts” should be treated as an anomaly signal, not proof of health.
Silence has two possibilities: everything is fine, or the thing responsible for speaking has stopped working.
Monitoring Self-Check Checklist
| Check Item | How to Check | Pass Criteria |
|---|---|---|
| Are monitoring points independent of targets? | Check probe deployment location | Not on the same machine/network |
| Do alerts actually reach recipients? | Trigger manually | Humans receive them via normal channels |
| Are thresholds reasonable? | Compare with normal period data | No false positives, no missed detections |
| Is there alert fatigue? | Check recent alert volume vs. read rate | Critical alerts are not drowned out |
| What are the blind spots? | List key items not monitored | Clear and acceptable list |
| Are backup tasks included in monitoring? | Check if failures trigger alerts | Alert if execution fails |
The first item is root-cause level:
Placing the monitoring program on the same machine as the monitored object means both disappear together upon failure.
This is the most common cause of “server down for two hours with no one knowing.” The standard is strict: probes must be able to independently observe target failure.
# Alert Channel Self-Test: Send a test message to ensure delivery
curl -sS -X POST alert_channel_url -d 'text=monitoring_self_test(ignore)' -o /dev/null -w '%{http_code}n'
# Is the monitoring task itself still running? (Must know if monitoring fails)
systemctl is-active monitoring_service_name
pgrep -x monitoring_process_name >/dev/null && echo 'running' || echo 'DOWN'
# Active external probe (simulate external perspective)
curl -sS -o /dev/null -w '%{http_code} %{time_total}sn' https://example.com/
# Did backup tasks actually succeed? (The most silently failing item)
ls -lt /backup_dir | head -5
find /backup_dir -name '*.sql.gz' -mtime -1 | wc -l
The last command corresponds to the last row in the table.
Backup failure is the only fault that does not expose itself:
If a service crashes, users complain; if backups fail, you only find out on the day you need to restore.
Therefore, “backup success status” must be an independent alert item,
not assumed to be running daily.
Three Practices to Keep Monitoring Effective
- Conduct regular alert drills: Actively create a controlled failure to confirm the end-to-end alert chain works.
- Separate critical and non-critical alert channels: Prevent overall suppression due to being overwhelmed by notifications.
- Review thresholds quarterly: After business volume changes, original thresholds are often no longer applicable.
8 Common Pitfalls
- Deploying monitoring on the monitored machine: Fails together during outages.
- Too many alerts leading to suppression: The most common failure mode.
- Alerting on single failures: False alarms from jitter.
- Thresholds too loose: Issues occur without triggering.
- Check intervals too long: Short-term faults are missed.
- Not testing alert channels: Changes go unnoticed.
- Not monitoring certificates and backups: These failures are the most隐蔽 (hidden).
- No drills after configuration: Cannot confirm if alerts actually work.
Real Customer Feedback (From Cloud Market Reviews and Consultations for Similar Products)
The following excerpts are taken from real buyer reviews and consultations for similar operations services on Alibaba Cloud / Tencent Cloud / Huawei Cloud Cloud Markets (providers include our store and peers, provided for reference only, not fictional tickets from this site):
27***97 2020-08-15 5.0 Affordable Price | Complete After-sales | Patient & Professional Second visit. Good support.
28***05 2021-06-06 5.0 Secure & Reliable | Complete After-sales | Skilled Technician (User did not fill in comment content) 10***31 2021-06-06 5.0 On-time Delivery | Affordable Price | Skilled Technician (User did not fill in comment content) 10***31 2021-06-05 5.0 Affordable Price | Secure & Reliable | Complete After-sales Easy to use. Helped me handle several abnormal processes.
10***44 2026-09-09 5.0 Comprehensive Features | User-Friendly Product | Clean Interface Easy to use. Supports the latest WordPress 7.1 system