Opsgenie shuts down April 2027 - migrate to Pagerly in one click
PagerlyPagerly
← All postsEngineering

The Alert Notification Gap: When Monitoring Tells Nobody

A server died at 00:32 and the team knew at 08:18. Close the alert notification gap so your on-call actually gets woken up.

Pagerly blog cover: The Alert Notification Gap, When Monitoring Tells Nobody

A storage server lost power at 00:32 UTC on a Sunday. Monitoring caught it three minutes later, opened a public incident, and stayed accurate for the next eight hours. Nobody was woken. An engineer opened the status page at 08:18 for an unrelated reason and asked why so many services were red. That is the alert notification gap: the distance between a system knowing something is broken and a human being told. It is the most under-audited failure mode in on-call, because every dashboard you look at during the audit says everything worked.

The incident above is real. It is documented in a detailed public postmortem from the infrastructure provider DanubeData, covering an outage on 17 August 2026 that took down S3 compatible object storage, a container registry, serverless deployments and static site deployments for eight hours and fifteen minutes. Their own summary of the lesson is the sharpest sentence written about on-call this month: monitoring that nobody is woken by is a record, not an alarm.

Most reliability writing in 2026 is about detection. Better instrumentation, better anomaly models, better synthetic checks. That work matters, and teams have gotten good at it. But detection maturity has quietly outrun notification maturity at a lot of organisations, and the result is a class of incident where the mean time to detect is under five minutes and the mean time to acknowledge is measured in hours. This post is about closing that gap: why it opens, how to find it in your own stack before it finds you, and what a pager has to do to earn the word.

What Actually Happened: Perfect Detection, Zero Notification

The mechanics are worth walking through, because the shape repeats across very different stacks.

One machine, four symptoms

A single storage node stopped. It did not panic, did not reboot, did not log a shutdown. The system log simply ends mid sentence. Customer object data was erasure coded four plus two, which on paper survives losing two of six pieces. But the chunks were spread across individual disks rather than across separate machines, and each machine holds many disks. Losing one host removed an average of one and a half chunks per object, and for many objects two or three. Below four chunks an object cannot be reconstructed at all, so reads stopped rather than slowed.

The registry stored its blobs in that object storage, so it went down too. Serverless and static site deployments push and pull through that registry, so they failed as well. Existing workloads kept serving their current version. One sharp edge caught several customers: changing only an environment variable on a serverless container still resolves the image tag to a digest, which still contacts the registry, so even a change that reuses an already pushed image failed.

There is a second lesson buried in there that has nothing to do with notification but deserves saying out loud. Alongside hundreds of terabytes of erasure coded customer data, the cluster kept a few kilobytes of internal bookkeeping records stored as two copies instead. Those two copies were allowed to share a host, and for one record the gateways read at startup, both copies sat on the failed machine. Hundreds of terabytes degraded exactly as designed. A few kilobytes stored with less care because they were small is what turned degraded reads into connection refused. If you run anything similar, audit your smallest pools first.

Three minutes to detect, four hundred and sixty six to notify

None of that is the interesting part. The interesting part is that the status page opened an incident at 00:35, was correct, was public, and stayed up the entire time. The observability worked. The escalation did not exist. Before the incident, a platform alert reached exactly one person by exactly one channel: email. At 00:35 on a Sunday morning, an email is not an alarm. It is a message that will be read after breakfast.

Eight hours and fifteen minutes of downtime, and the fix at the end was a person walking over and pressing a power button. The outage was not caused by a hard problem. It was extended by a missing phone call.

Why the Alert Notification Gap Opens

Teams do not decide to build monitoring that pages nobody. The gap opens through a handful of reasonable decisions that compound.

Detection tools are built to record, not to wake people

Status pages, dashboards, log explorers and metric stores are all pull systems by nature. They are excellent at answering the question "what is broken" once you have already decided to ask. They are structurally bad at the push problem, which is deciding that the question needs asking right now and finding a specific human who will pick up. Many teams wire alerting into the same tool that renders the dashboard, and inherit its pull shaped assumptions without noticing.

Notification preferences quietly become suppression rules

Every mature notification system accumulates the same features: digests, rate limits, quiet hours, per user channel preferences, do not disturb windows. Each one is correct for product notifications and customer emails. Each one is catastrophic on a pager. The failure is rarely explicit. Somebody enables digest mode to cut noise in Q1, and in Q3 a real page gets folded into a 9am summary. Nobody ever wrote a rule that says "suppress outage alarms overnight," but that is the behaviour that emerged.

The pager runs on the infrastructure it is paging about

This is the circular dependency that bites hardest during exactly the incidents you most need paging for. If your alerting service resolves DNS through the cluster that is down, fetches its alert text from a page hosted on the affected infrastructure, authenticates through an identity provider inside the same blast radius, or ships its notifications through a queue in the failed region, then your pager is a component of the outage rather than a response to it. The DanubeData team addressed this specifically by carrying the spoken message inside the outbound call request rather than fetching it from their own servers at call time. That is a small implementation detail with a large blast radius.

One recipient is not a rotation

Sending every alert to a single named person is the most common shortcut in small teams, and it fails in the least dramatic way imaginable. The person is asleep, on a plane, at a wedding, or has a phone in another room. There is no failure event to investigate afterwards, just silence. A rotation with an escalation policy exists precisely so that human unavailability, which is certain rather than probable, is a handled case rather than an outage extender.

Quiet hours are not modelled in most reliability planning

Error budgets, SLOs and incident metrics are almost always computed as flat rates across the week. But the probability that an outage extends past an hour is not flat. It spikes overnight, on weekends, and on public holidays, and it spikes hardest at the intersection of all three. Sunday at 00:32 UTC is close to the worst moment in the week for a team with no real pager. If you have never plotted your acknowledgement times by hour of day and day of week, you almost certainly have a notification gap you have not measured.

How to Audit Your Alert Notification Gap This Week

This audit takes an afternoon and it is one of the highest leverage things an on-call team can do. The rule is simple: you are not testing whether monitoring fires. You are testing whether a human wakes up.

Run a notification fire drill, not a monitoring test

Pick a random weekday evening. Fire a synthetic critical alert through the exact production path a real incident would take. Do not tell the person on call it is coming. Measure wall clock time from trigger to human acknowledgement, and record which channel actually got through. Repeat once at a weekend hour. Most teams that do this for the first time discover their real acknowledgement time is somewhere between three and twenty times their assumed one.

Trace every alert path end to end

Draw the full path from detector to human, listing every hop: the monitoring system, any aggregation or routing layer, the notification provider, the carrier or app, the device, and the human's own settings. For each hop, ask two questions. Does this hop depend on infrastructure that could be part of the outage? And can this hop silently drop or delay the message under any configuration? You are looking for hops that answer yes to either.

Audit the settings that suppress

  • Do not disturb and focus modes. Confirm that your paging app is on the allow list for every person in every rotation, on their actual devices, and re-confirm after OS upgrades.
  • Digest and batching rules. Any rule that groups alerts on a schedule must be provably unable to apply to severity one pages.
  • Rate limits and deduplication windows. Useful for noise, dangerous when a single burst of related alerts collapses into one suppressed notification.
  • Quiet hours and working hours. These belong on notifications, never on pages. Verify the distinction is enforced in code, not in policy documents.
  • Email as a primary path. Treat email as a record, not an alarm. It has no delivery guarantee, no acknowledgement, and no urgency signal.
  • Escalation timeouts. Confirm that an unacknowledged page escalates to a second human, and that the second human is real, current, and not the same person under a different alias.
  • Offboarding drift. Check that no escalation path terminates at someone who left the company. This is astonishingly common and completely silent.

Measure time to acknowledge, separately from time to detect

If your incident metrics collapse detection and acknowledgement into a single number, you cannot see this gap. Split them. Track median and ninety fifth percentile time to acknowledge, sliced by hour of day and severity. The ninety fifth percentile overnight number is the one that tells you the truth. A team with a two minute median and a four hour tail does not have a fast pager. It has a pager that works during office hours.

Design Rules for a Pager You Can Actually Trust

Once you have found the gap, the fixes are mostly design constraints rather than new tooling. Four rules cover the majority of the risk.

A page must not be suppressible

The paging path should be architecturally separate from the general notification system, not a high priority flag inside it. Sharing a code path with digests and preferences means every future feature added to that system is a potential suppression bug on your pager. Separation is what makes "this cannot be silenced" a property rather than a promise.

Carry the payload with the page

Whatever the responder needs to understand the alert should travel inside the notification, not behind a link into infrastructure that may be part of the incident. Service name, severity, what fired, when, and a runbook pointer that resolves somewhere independent. If the only way to learn what broke is to load a page served by the thing that broke, you have built a pager that goes quiet exactly when it matters.

History must never page you

Backfilled incidents, replayed events and postmortem entries written after the fact should be structurally incapable of triggering a call. This sounds obvious until someone imports a year of historical incidents at 2am and every phone in the rotation rings. Build the guard in from the start.

Escalate to a rotation, never to a person

Every page needs a defined next step if it is not acknowledged inside a short window. Primary, secondary, then a channel that reaches the whole team. The escalation policy is the part of on-call that turns human unavailability from an incident cause into a handled case, and it is worth more than any refinement to your alert thresholds.

Automated Recovery Is a Complement, Not a Substitute

The same team also shipped a watchdog that probes each server every minute and can issue a power button press through the hardware management API without a human. It is a reasonable response to an outage whose resolution was literally a button nobody was awake to press, and the way they constrained it is instructive.

Almost all the engineering went into making the watchdog refuse to act. It does not run on the infrastructure it watches. Four independent signals have to agree before it does anything: network reachability, cluster health, reported power state, and workload health. Two or more machines failing simultaneously is treated as a monitoring or network fault rather than as correlated hardware failure, so it will not act during a broad outage. If the hardware cannot confirm a machine is genuinely off, it raises an alert and stops rather than guessing. The decision logic is a single pure function so every rail is covered by tests.

Even with all that, it paged for a healthy machine the next morning because a single dropped network packet hit the one path that could fire before the confirmation window applied. That is the honest shape of automated remediation: it shortens outages, it does not prevent them, and it introduces its own failure modes that themselves need paging. Automation is a good second responder. It is a terrible replacement for a first one.

There is a related trap worth naming. Partway through the incident the team briefly believed the registry had recovered because it returned an authentication response, from a layer that never touches storage. Verify recovery with a request that reads real data through the real path a customer uses. A health check that passes above the broken layer will tell you exactly what you want to hear.

Where Slack Native On-Call Changes the Math

None of the above requires a specific vendor, and the discipline matters more than the tool. But the reason Slack native on-call has become the default shape for this category is that it collapses two of the hops in the alert path.

In a conventional setup, the alert leaves monitoring, goes to a paging vendor, reaches a phone, and then the responder opens a laptop and joins a coordination channel somewhere else entirely. Each transition is a place where context is lost and time is spent. When the rotation, the escalation policy, the page and the incident channel all live in the tool the team already has open, the responder acknowledges and starts working in the same place, and everyone else can see who has it without asking.

This is what Pagerly is built for. Rotations and escalation policies live in Slack or Microsoft Teams, pages go out over Slack, email, SMS, phone call and mobile push so the urgent path is a real phone call rather than a message in a channel someone has muted, and an unacknowledged page escalates automatically to the next person in the rotation instead of sitting unread. Incident channels, commanders and timelines are created from the same place, so the handoff from "someone was notified" to "someone is working on it" does not involve a context switch.

The specific properties that close a notification gap are worth checking for in whatever tool you use:

  • A voice call path that is separate from chat and email, because chat notifications are exactly the thing people mute overnight.
  • Escalation policies with real timeouts so an unacknowledged page moves to a second human automatically.
  • Rotations with override and swap support, so schedules match reality rather than the calendar someone wrote in January.
  • An alert path that does not depend on your own production infrastructure to deliver or to render.
  • Acknowledgement tracking split from resolution tracking, so you can measure the gap this post is about.

The Broader Pattern in 2026

This is not an isolated story. Network monitoring data through August 2026 shows public cloud network outages climbing week over week, and the broader industry conversation has shifted toward the fact that the bottleneck in incident response is rarely detection any more. It is coordination: assembling the right people with the right context quickly. A notification gap is the most extreme version of that bottleneck, where the number of people assembled is zero.

The uncomfortable implication is that a lot of teams are investing in the wrong half of the problem. Adding another observability tool to a stack that already detects failures in three minutes buys you very little. Making sure that a three minute detection reliably becomes a three minute page, at 3am, on a bank holiday, when the primary responder's phone is in another room, buys you the entire tail of your incident duration distribution.

Takeaways

  • Detection and notification are different systems. Build and test them separately, and never assume that an accurate dashboard implies a woken human.
  • Split your metrics. Time to detect and time to acknowledge should be tracked independently, sliced by hour of day. The overnight tail is where the truth lives.
  • Email is a record, not an alarm. Any severity one path that terminates in an inbox has no delivery guarantee and no urgency signal.
  • Make pages unsuppressible by design. Keep the paging path architecturally separate from the notification system that carries digests, quiet hours and preferences.
  • Remove the circular dependency. Your pager must not depend on the infrastructure it pages about, including for the text of the alert itself.
  • Escalate to a rotation. One recipient is a single point of failure in the one system whose entire purpose is not having one.
  • Run an unannounced notification drill. Once a quarter, at an inconvenient hour, through the real production path.
  • Verify recovery through the customer path. A health check above the broken layer will happily confirm a service that is still down.

Closing the Gap

The alert notification gap is unusually satisfying to fix because it is cheap. There is no distributed systems rewrite here, no multi region migration, no new observability vendor. There is an escalation policy, a voice call path that cannot be silenced, a rotation with more than one name in it, and a quarterly drill that proves the whole chain works when nobody is expecting it.

Compare that to the alternative. Eight hours and fifteen minutes of an outage whose actual remedy was pressing a button, extended entirely because the system that knew had no way to tell anyone who could act. Every hour of that was avoidable with an hour of configuration work done in advance.

Go and look at your own alert path this week. Not the dashboard, not the monitoring config, but the last hop: the one between a machine deciding something is wrong and a specific human picking up the phone. That is where your next long outage is hiding.

Sources: the incident described is documented in DanubeData's public postmortem of the 17 August 2026 storage outage. Weekly network and cloud outage counts referenced above come from Network World's 2026 network outage report and internet health check, which tracks ThousandEyes data. Ongoing discussion of incident management practice is collected weekly at SRE Weekly.