What this guide covers
Event ingestion lets you accept alerts from external observability tools. Sentry, AWS CloudWatch, Datadog, Grafana, custom JSON. And turn them into Signalog incidents with routing rules. It’s a Pro/Business feature.
By the end of this guide you’ll have:
- An event source set up with a unique ingest URL
- A routing rule that creates incidents from production-fatal Sentry errors
- A working test ping to verify the pipeline
Step 1: Create an event source
Navigate to Events in the sidebar (admin role required). Click New source.
For each source, set:
- Name.
Sentry · production(or whatever describes it) - Provider: sentry, CloudWatch, Datadog, Grafana, or Generic JSON
Save. Signalog gives you a unique ingest URL:
https://your-domain/events/se_abc123def456...
The token in the URL is the only auth. Keep it secret. Rotate it from the source detail page if it leaks.
Step 2: Wire up the source side
Sentry
- In Sentry, go to Settings → Integrations → Webhooks
- Add a new webhook
- Paste your Signalog ingest URL
- Select events:
event.created(and optionallyissue.created) - Save
Sentry will POST a JSON payload to your URL on every matching event.
AWS CloudWatch Alarms
CloudWatch sends alarms via SNS. Set it up:
- Create an SNS topic (or use an existing one)
- Subscribe an HTTPS endpoint to the topic. Your Signalog ingest URL
- CloudWatch confirms the subscription via a one-time token (Signalog handles this automatically)
- Point your alarms at the SNS topic
When an alarm transitions to ALARM (or OK), CloudWatch publishes to the topic and we ingest it.
Datadog
- In Datadog, go to Integrations → Webhooks
- Add a webhook
- Paste your Signalog ingest URL
- In your monitors, add
@webhook-signalogto the notification list
Grafana
- In Grafana, go to Alerting → Contact points
- Add a webhook contact point
- Paste your Signalog ingest URL
- In your alert rules, route to the webhook contact point
Generic JSON
For anything else, POST a JSON payload to the ingest URL. Signalog stores the raw body and you write JSONPath rules to match against it.
curl -X POST https://your-domain/events/gen_xyz... \
-H "Content-Type: application/json" \
-d '{"severity": "fatal", "service": "auth", "message": "token cache miss"}'
Step 3: Configure routing rules
Without rules, every event is logged but no incident is created. Open the source detail page → Routing rules → New rule.
Each rule has:
- Match: field-level conditions (e.g.,
level=fatal AND environment=production) - Outcome: what happens when the rule matches:
- Create incident with a specific severity
- Notify alert channel (Slack, email, etc.) without creating an incident
- Both: create an incident AND notify a channel
- Suppress: explicitly do nothing (useful as a final catch-all)
- Cooldown: minimum gap between successive matches (default 60s) to prevent thrashing
Rules are evaluated in order. First match wins. Drag to reorder.
Example rule chain for Sentry
1. level=fatal → Create P1 incident, page on-call
2. level=error AND tag.env=production → Create P2 incident, notify #ops
3. level=warning → Notify #monitoring (no incident)
4. * → Suppress (catch-all)
The catch-all at the end is good practice. It makes the “no rule matched” case explicit instead of silent.
Match syntax
Available operators:
field=value. Exact matchfield!=value. Not equalfield~regex. Regex matchfield>value/field<value. Numeric comparisonAND,OR, parentheses for grouping- For nested JSON, use dot notation:
tag.environment=prod,extra.user.id=42
Step 4: Test with a payload replay
Every event source keeps a recent-events log (last 50). After your first real event arrives, click any row → Replay: signalog re-runs the routing rules and shows which one would fire.
Use this aggressively when debugging. It’s much faster than triggering real alerts in your source.
For Sentry, you can also send a test event from Sentry’s webhook config UI to verify connectivity end-to-end.
Step 5: Watch the events log
The recent-events log shows:
- ✅ matched (which rule)
- ⚠️ unmatched (no rule fired)
- 🔇 suppressed (explicit suppress rule)
If you’re seeing lots of unmatched events, your rules need broadening. If you’re seeing lots of matched-but-no-incident, the rule is firing but the cooldown is in effect. Adjust the window.
Auto-deduplication
Signalog dedups identical events within a configurable window (default 60 seconds per source). Identity is provider-aware:
- Sentry: dedups on the issue fingerprint
- CloudWatch: dedups on the alarm ARN
- Datadog: dedups on the monitor ID
- Generic JSON: dedups on the rule’s matched fields
The incident’s “child events” counter shows how many events folded into it. If you need to break dedup (the same fingerprint represents two genuinely different incidents), do it from the parent incident page.
Plan gating
Event ingestion requires Pro or Business. Free-tier teams see a banner pointing to the upgrade page when they visit the Events sidebar item.
| Feature | Free | Pro | Business |
|---|---|---|---|
| Event sources | — | ✅ | ✅ |
| Routing rules | — | ✅ | ✅ |
| Recent events log | — | ✅ (50) | ✅ (200) |
| Custom JSONPath rules | — | ✅ | ✅ |
Common gotchas
“Sentry sends events but no incidents are created.” Check the recent-events log. Likely your rules don’t match the actual payload shape. Replay an event to see exactly which rule fires (or doesn’t).
“My rule fires but the incident is duplicated.” The dedup window may be shorter than the source’s burst pattern. Increase it from 60s to 5min and retest.
“I’m being paged for low-severity alerts.” Add a higher-priority level=warning → suppress rule above your catch-all. First match wins.
Next steps
- Understand alert grouping. How Signalog dedups across sources
- Set up the service catalog so events can be routed by service tier
- Configure on-call so paged incidents reach the right person