convops
  • Features
  • How it works
  • Pricing
  • Blog
  • Security
Log inStart free →
convops

Root cause, not noise.

Start free →

Product

  • Features
  • How it works
  • Pricing
  • Blog
  • Security
  • Get started

Compare

  • Vs PagerDuty
  • Vs incident.io
  • Vs Datadog
  • Vs Resolve.ai
  • Vs Rootly
  • Vs Squadcast

Solutions

  • AWS incident response
  • CloudWatch alarm diagnosis
  • AWS alerts to WhatsApp
  • WhatsApp on-call
  • PagerDuty alternative

Connect

  • X (Twitter)
  • LinkedIn

© 2026 ConvOps. All rights reserved.

Built at 2am, for a 2am.

← All posts

Woken Up by a CloudWatch Alarm With No Context

May 10, 2026·6 min read

Your phone buzzes at 3:17am. You grab it, squint at the screen. 'ALARM: CPUUtilization ≥ 80% — api-service.' That's it. A threshold you set months ago, a metric value, and a timestamp. You're now awake, staring at a number, with no idea whether something is on fire or CloudWatch just had a moment.

What a raw CloudWatch alarm actually tells you

A default CloudWatch alarm notification contains the metric name, the threshold it crossed, the current value, and when it crossed it. Four data points. None of them tell you why.

What the alarm includesWhat it doesn't include
Metric name and namespaceWhat the metric was doing for the past hour
Current value (e.g. 94%)Every other metric on the same resource
Threshold crossed (e.g. 80%)What changed in the 15 minutes before it fired
Timestamp of the breachWhether it's still happening right now
Resource identifierWhether this has happened before — and what caused it last time
Alarm state (ALARM)Whether this is a real incident or a 30-second spike that already resolved

You have a signal. You have no diagnosis. Everything useful has to come from somewhere else — and at 3am, you're the one who has to go find it.

What engineers actually do in the next 30 minutes

Most engineers spend 20–40 minutes responding to a context-free alarm. Almost all of that time is spent gathering the context the alarm should have included.

  1. Open the CloudWatch console on your phone — 2 minutes (mobile console is not fast)
  2. Find the alarm, look at the graph, zoom out to find where the spike started — 3 minutes
  3. Open the resource — ECS service, EC2 instance, RDS cluster — 2 minutes
  4. Check current state: is it still at 94%? Did it resolve on its own? — 1 minute
  5. Open Logs Insights, find the right log group, write a query, wait for results — 5–8 minutes
  6. Scan logs for errors around the breach timestamp — 3–5 minutes
  7. Check what deployed recently — CodePipeline, ECR, GitHub — 5 minutes
  8. Ping a colleague on Slack to ask if they touched anything — unknown
Total: 20–40 minutes. Most of it is gathering context that existed at the moment the alarm fired. You're just retrieving it manually, at 3am, half asleep.

The 6 things that actually tell you why it broke

Context, for incident diagnosis purposes, means six specific things. When you have all six, you can usually find the cause in under 2 minutes.

  • Metric trend — what was CPUUtilization doing for the 45 minutes before threshold? A sudden spike points to a trigger event. A slow ramp points to resource exhaustion.
  • Related metrics on the same resource — if CPU is high, is memory also climbing? Is network I/O spiking? One metric never tells the full story.
  • Recent log errors — what was the service logging in the 15 minutes before the breach? OOM kills, connection timeouts, and unhandled exceptions appear here before the metric crosses threshold.
  • What changed — any deploy, config change, IAM policy edit, or Auto Scaling event in the past 2 hours. CloudTrail has this. Most engineers don't check it until they're desperate.
  • Current resource state — ECS running/desired counts, RDS connection count, Lambda concurrency. Is the service still degraded or did it self-heal?
  • Prior history — has this alarm fired before? If it fires every Tuesday at 9am, it's a pattern, not a crisis.

How to add context before it pages you

There are practical things you can do to make on-call less brutal. None of them eliminate the problem — but they cut the cold-start time significantly.

  • Write alarm descriptions that matter. The Description field in CloudWatch supports free text. Use it: 'api-service CPU > 80%. Check ECS task count and recent deploys. Dashboard: [link]. Runbook: [link].' This appears in the SNS notification and saves the first 5 minutes of every investigation.
  • Use alarm names that give you the resource and symptom. 'api-service-cpu-high' beats 'Alarm1'. You read the name before you open anything else.
  • Add a dashboard link to every alarm description. One click from the notification to a dashboard showing the 6 metrics that matter for this service.
  • Tag alarms with the owning team. At 3am you want to know immediately if this is your problem or someone else's.
  • Annotate your deployment pipeline. CodePipeline and GitHub Actions can push annotations to CloudWatch dashboards — a vertical line at deploy time tells you instantly if the alarm and the deploy are correlated.

Related reading

  • → How to find root cause in AWS CloudWatch alerts without an SRE team
  • → MTTR under 5 minutes: what actually moves the needle
  • → The real cost of a 1-hour AWS outage for a 10-person startup

The honest problem no amount of preparation fully solves

Good alarm hygiene helps. But even with a perfect alarm description, a dashboard link, and a runbook — you're still doing the investigation manually. The runbook tells you what to look at. It doesn't look for you.

By the time your brain is awake enough to run a Logs Insights query, you've already burned 10 minutes. The log data from the moment of breach is still there — but you're retrieving it by hand, from a console, while trying to decide if this is worth waking someone else up.

The gap isn't preparation. The gap is that context gathering happens after the alarm, manually, every time.

What it looks like when the context arrives with the alarm

The alternative to gathering context after the alarm fires is gathering it before — automatically, between the alarm firing and the notification reaching you.

When that's working, the message you wake up to looks different. Instead of 'CPUUtilization ≥ 80% — api-service', you get: what the CPU was doing for the past 45 minutes, the three log errors that started appearing 4 minutes before the breach, the ECS task that stopped 12 minutes ago and didn't come back up cleanly, and a suggested fix. You read it in 30 seconds, reply with a number, go back to sleep.

The investigation already happened. You're just reviewing the conclusion.

That's what ConvOps does — it runs the investigation automatically the moment an alarm fires, so the diagnosis arrives with the page. No log diving, no console at 3am, no 30-minute manual investigation.

Frequently asked questions

What should a CloudWatch alarm description include?

Include the resource name, what the metric means in plain language, what to check first, and a link to your runbook or dashboard. Example: 'api-service CPU > 80%. Check ECS running/desired counts, recent deploys. Dashboard: [link]. Runbook: [link].' This appears in the SNS notification and saves the first 5 minutes of every investigation.

Why do CloudWatch alarms fire without any context?

CloudWatch alarms are designed to detect threshold breaches, not to diagnose them. The alarm payload contains the metric name, value, threshold, and timestamp — nothing more. Context (log errors, related metrics, recent changes) has to be gathered separately, which is why most incident response starts with a blank stare at a number.

How long does it take to diagnose a CloudWatch alarm manually?

20–40 minutes for most engineers, most of which is spent gathering context: opening the console, finding the right log group, running a Logs Insights query, checking recent deploys. The actual diagnostic reasoning takes 2–3 minutes once you have all six pieces of context.

What's the fastest way to diagnose a CloudWatch alarm at 3am?

Have the context gathered before it pages you — either via an alarm description with a dashboard link and runbook pointer, or an automated system that pulls metric trends, log errors, and recent changes between the alarm firing and the notification reaching you. The second approach reduces cold-start time from 20 minutes to under 60 seconds.

Should I wake up a colleague when I get a context-free alarm?

Only once you know whether it's a real incident. CPUUtilization at 82% that resolves in 2 minutes isn't worth waking anyone. At 99% with error logs and a stopped ECS task, you wake people. Getting that clarity fast is the entire problem — which is why the quality of your first 5 minutes matters so much.

Related reading

  • → How to find root cause in AWS CloudWatch alerts without an SRE
  • → MTTR under 5 minutes: what actually moves the needle
  • → The real cost of a 1-hour AWS outage for a 10-person startup
  • → The Complete AWS CloudWatch Alarm Setup Guide

Still debugging incidents manually?

ConvOps does this automatically — root cause in under 60 seconds, delivered to WhatsApp or Slack.

Try ConvOps free →See a live demo