How it works
Alarm state changes reach Pulse through one EventBridge rule and API destination; other accounts can forward to a central bus.
Prerequisites
- The workspace Admin role. Developers and Viewers can see Resolve Triggers & Outcomes but can’t add or change them. See Roles.
- An AWS account where you can create EventBridge connections, API destinations, and rules.
- At least one CloudWatch alarm in the region you’re setting up.
- The AWS CLI, if you want to test with a simulated alarm (recommended). The caller needs the IAM permission
cloudwatch:SetAlarmState.
Create the webhook in CloudThinker
Open the AWS platform
Basic Info
Production CloudWatch. Click Next.Configure
INSUFFICIENT_DATA now (see Field and severity mapping). Click Next.Advanced
x-api-key, which is what EventBridge sends. Then decide two options:Copy the URL and secret
Raise the rate limit (production)
3600. The default of 1,000 is below what an API destination sending 1 event per second can reach in an alarm storm, and events over the limit are dropped without an error. The Create Webhook dialog doesn’t have this field.Set up EventBridge in AWS
Do these steps in the AWS console, in the same region as your alarms.Create a connection
Create an API destination
1. Make sure you raised the webhook’s rate limit above.Create a rule
cloudthinker-resolve, and under Execution role pick Create a new role for this specific resource (it gets events:InvokeApiDestination).Optional, recommended for production: in the target’s Additional settings, set the retry policy and a dead-letter queue, so alarms that fail delivery during an outage are kept instead of lost. A good starting point is Maximum age of event 1 hour and Retry attempts 10: an alarm older than an hour is rarely worth a fresh investigation. Attach an SQS queue as the dead-letter queue. Click Create rule.Test the integration
The test alarm is treated like a real one. With Auto-investigate on, it opens an incident and CloudThinker starts an investigation. To test delivery only, turn Auto-investigate off on this webhook first (… menu → Edit), and turn it back on after. Don’t pause On duty for this in a live workspace: it stops automatic triage and investigation for every source, not just this one (see What starts an investigation).Force an alarm
YourAlarmName with a real alarm that’s currently OK, and us-east-1 with the alarm’s region. A wrong region fails with an alarm-not-found error. CloudWatch sends an event only when the state actually changes, so an alarm already in ALARM sends nothing. If yours is, set it to OK first, then to ALARM.Check Pulse
Reset the alarm
--state-value OK. CloudWatch then evaluates the alarm normally again. It may also return the alarm to OK by itself at its next evaluation, so an OK signal can arrive before you reset it.The OK event arrives as an Info signal. Pulse’s classifier treats a recovery as not actionable, so it usually doesn’t open a second incident. That check is a model judgment, so a recovery can still slip through to triage. It also doesn’t resolve the incident the ALARM opened. That incident stays open until someone closes it.AWS/EC2) as its service.
Field and severity mapping
The preset reads these fields from the EventBridge event:INSUFFICIENT_DATA flap (a metric gap after a deploy, for example) can start an investigation. To stop that, find the INSUFFICIENT_DATA row in Severity Mapping, open its Maps To dropdown and pick Low or Info. Or turn on Only from a minimum severity and pick High and above.
Pulse’s noise limit (100 alerts a minute) always lets Critical and High through and can drop the rest in a storm. Map any state you can’t afford to lose to High or above.
Want alarms to be critical? Edit the webhook and change the ALARM row in Severity Mapping. The mapping applies to every alarm the webhook receives. To treat production and non-production differently, create two webhooks and two EventBridge rules, each filtered by alarm name prefix (see Send only the alarms you care about). A state with no mapping row falls back to Medium.
Composite alarms and metric-math alarms have no metricStat block, so Service comes out as unknown. If you rely on those alarms, point Service Path at a field they do carry, such as detail.alarmName, and name alarms after their service. Repeats of one alarm group by the alarm’s ARN, whatever Service says. Service still counts: alarms that share a Service value within 6 hours can join one cluster, so two different AWS/EC2 alarms firing together can land in the same cluster. See How signals join a cluster.
Send only the alarms you care about
Narrow the EventBridge rule’s event pattern instead of filtering in CloudThinker. Add adetail block to the base pattern:
More than one region or account
CloudWatch sends alarm events to EventBridge only in the alarm’s own region and account. Pick one of these layouts:Deploy with CloudFormation
This template builds the connection, API destination, rule and dead-letter queue, and outputs the queue URL so you can monitor it. Deploy it to each account and region for the per-region layout (for example with StackSets), or once in the monitoring account for the central bus, withEventBusName set to that bus.
Deploy one stack per webhook in each account and region. To send prod and non-prod alarms to two webhooks from the same region, deploy it twice with different NamePrefix values, and narrow each rule’s pattern (see Send only the alarms you care about).
read -rs doesn’t echo it or write it to shell history):
Forward alarms to a central bus
For the central layout, deploy the template above in the monitoring account withEventBusName set to your bus. Then add two pieces.
In the monitoring account, give the central bus a resource policy that lets your organization put events. Replace the bus name, region, account ID and organization ID:
source and detail-type, so the rule on the central bus matches them unchanged. For more options, see the AWS guides for cross-account and cross-region delivery.
x-api-key header, so the webhook needs Auth Method set to No Authentication, and the URL becomes the only credential. If you use it anyway, subscribe the Webhook URL to the topic with the HTTPS protocol. CloudThinker confirms the subscription for you.Troubleshooting
No signal appears in Pulse
No signal appears in Pulse
- Check the rule: in EventBridge, open the rule’s Monitoring tab. If
Invocationsstays at 0, the pattern isn’t matching (see the next item). - Check the destination: the API destination endpoint must be the exact Webhook URL from CloudThinker. After Regenerate credentials, the URL changes too.
- Check failed deliveries: on the rule’s Monitoring tab, look at
FailedInvocations, then check the SQS dead-letter queue. Messages there carry the HTTP error that came back. - Check Pulse: on Resolve → Pulse, pick the All lane and check the time window selector in the page header (it defaults to Last 7 days). Pulse can also drop an alert as noise, see noise suppression.
The rule never matches
The rule never matches
detail-type value is case-sensitive: CloudWatch Alarm State Change.EventBridge reports 401 or 403
EventBridge reports 401 or 403
401 means the x-api-key header is missing, or the endpoint isn’t a current Webhook URL. A 403 means the key’s value is wrong. The connection’s API key name must be x-api-key and its value must be the API Secret. If you lost the secret, open Resolve → Triggers & Outcomes → Amazon Web Services, open the webhook’s … menu under Signals to Resolve, and choose Regenerate credentials. Then update both the connection’s Value and the API destination’s endpoint, because the URL changes too.Signals arrive but the title or severity is empty
Signals arrive but the title or severity is empty
detail., because that’s where EventBridge puts the alarm. CloudThinker converts SNS alarm messages to the same shape, so paths like AlarmName or NewStateValue never match, even for SNS. An empty service on a composite or metric-math alarm is expected, see Field and severity mapping.Alarms go missing during a storm, or EventBridge reports 429
Alarms go missing during a storm, or EventBridge reports 429
0 means no limit. Events over the limit still get a success response, then are dropped before they reach Pulse, whatever their severity, so EventBridge shows no error. This is a different limit from Pulse’s 100-per-minute noise limit, which always lets Critical and High through.A 429 comes back only at 10 times the hourly limit: at the default 1,000, after 10,000 requests within the same hour. It also comes back after 10 failed authentication attempts within 15 minutes, or while CloudThinker is briefly busy (with a Retry-After header). EventBridge retries a 429 within the rule’s retry policy.Check: drops leave no error, so compare counts. Right after a burst, set the Resolve → Pulse time window to Last 1 hour and read the raw events count in the header. Compare it with the rule’s Invocations metric (its Monitoring tab) over the same hour. Raw events counts every source in the workspace, so a lower number than EventBridge sent means events were dropped.Fix: open the webhook’s … menu, choose Edit, and raise Rate limit (requests per hour). Or narrow the rule’s event pattern. If 401s or 403s came first, fix the secret.An alarm reached Pulse but no RCA started
An alarm reached Pulse but no RCA started