Queue Depth Is a Weak Alarm on Its Own
Backlog size alone cannot tell you whether customers are waiting too long.
A backlog number tells you how much is waiting. It does not, by itself, tell you whether customers are waiting too long or whether the system is catching up.
A queue has 10,000 messages. Is that an incident?
The number alone cannot tell you. If consumers are processing quickly and messages are arriving faster for a short burst, the system may be healthy. If the oldest message has been waiting for an hour, even a much smaller queue may be hurting a time-sensitive workflow.
Queue depth is useful, but it is not the same thing as user impact. For asynchronous systems, pair volume with age, processing rate, failure rate, and the time the work is allowed to take.
Ask how long the oldest work has waited
For Amazon SQS, ApproximateAgeOfOldestMessage reports the age of the oldest unprocessed message. AWS describes it as approximate, so it is a signal to interpret rather than a perfect accounting value. It can help answer a more operational question: are consumers keeping up with the oldest work that matters?
A practical dashboard might show:
- Visible backlog and in-flight messages
- Age of the oldest message
- Messages received and deleted over time
- Failed processing and dead-letter queue volume
- Consumer capacity and error rate
- A service-level target for how long the work may remain pending
The threshold should come from the workflow. An image thumbnail may tolerate a delay that a payment confirmation or access request cannot. “Alert when depth exceeds 500” is not a policy until someone explains why 500 is dangerous for that workload.
Watch for misleading signals
A queue can drain while customer outcomes are still wrong. A worker may acknowledge a message before completing durable work. Poison messages may cycle through retries. A noisy partition or message group can hide starvation elsewhere. Some queue metrics are approximate and have service-specific semantics.
Define what counts as completion, what is retried, when a message is quarantined, and who owns manual replay. Then alert on the combination of signals that points to a decision: scale consumers, investigate a poison message, pause intake, or communicate an expected delay.
AWS recommends considering oldest-message age alongside visible message count for SQS monitoring. See available SQS CloudWatch metrics and AWS's recommended SQS alarms.
The useful question is not “is the queue big?” It is “which customer promise is at risk, and what signal tells us early enough to act?”
I share practical architecture and technical PM notes at umer-amin.vercel.app.
#Observability #DevOps #CloudEngineering
About the author
- I'm Umer Amin Durrani, an AI Technical Project Manager, DevOps practitioner, brand builder and researcher. I write about Linux, reliable systems, AI agents, software architecture and the decisions behind technical delivery. My work connects research, business goals and practical execution. US registered and mailing address: Umer Amin Durrani, 145 Tyee Dr, PMB 59738, Point Roberts, WA 98281, United States. Operations are based in Karachi, Pakistan.
Comments
Join the discussionOldest-message age has a blind spot right where the post mentions poison messages. In a standard SQS queue, a message that is received three or more times without being deleted moves to the back, and the metric then reports the age of the next message instead. AWS's metrics page says poison-pill messages are excluded from the age metric until they're processed, and that the reordering happens even with a redrive policy in place.
So the age alarm can look healthy while one message has been failing for an hour. I'd pair it with a retry signal: log ApproximateReceiveCount on every receive so a message cycling through retries shows up before it reaches the dead-letter queue, and alarm on ApproximateNumberOfMessagesVisible in the DLQ itself. FIFO queues behave differently, since they don't reorder: a failed message blocks its message group until it's deleted or expires, so there the question is which group is stuck rather than how old the queue is.

