Integrations
Sentry
Feed Sentry releases and deploys into AlertINT as change events, and enrich triage with the exception behind the alert.
Sentry answers two triage questions. Enable either or both; they share one connection and token.
| Role | Answers | How |
|---|---|---|
| Change source | Did something just ship? | Polls releases and deploys, records them as change events |
| Error source | Which exception is behind this alert? | Queries issues once per Incident at triage: exception, file:line, blast radius |
- Read-only: AlertINT only sends
GETrequests. It never resolves issues or changes anything in Sentry. - Off by default: with neither role enabled, AlertINT makes no Sentry calls.
Connect#
sentry:
base_url: https://sentry.io # host root; AlertINT adds the API path
org: my-org-slug
token_env: SENTRY_AUTH_TOKEN # variable holding the token, never inline
timeout_seconds: 10 # default
export SENTRY_AUTH_TOKEN="sntrys_..."
Token: create an Internal Integration (Settings → Developer Settings → Internal Integration) with only the scopes you need:
| Scope | Needed for |
|---|---|
project:read |
Change source: releases and deploys |
event:read |
Error source: issues and their latest event |
- The token is the boundary. The MCP tools can read any project the token can. Use a per-project token to limit what an agent reaches.
- Rate limits are per identity; the default polling stays well under them.
Base URL:
| Deployment | base_url |
|---|---|
| Sentry SaaS (US) | https://sentry.io |
| Sentry SaaS (EU) | https://de.sentry.io |
| Self-hosted | https://sentry.your-company.internal |
Change source: what shipped#
Sentry can't push deploys, so AlertINT polls for them and records each one as a change event, next to deploys your CI pushes.
sentry:
# ...connection as above
releases:
enabled: true
poll_interval_seconds: 60 # default
initial_lookback_minutes: 60 # first run looks this far back
release_scan_horizon_days: 30 # older releases aren't checked for new deploys
projects: ["checkout", "payments"] # optional; omit for the whole org
changes:
enrichment:
enabled: true # required: this is what shows changes at triage and over MCP
retention_days: 30 # Sentry changes are pruned like all changes
| Field | Default | Does |
|---|---|---|
releases.enabled |
false |
Runs the poller |
releases.poll_interval_seconds |
60 |
How often to poll |
releases.initial_lookback_minutes |
60 |
First-run look-back |
releases.release_scan_horizon_days |
30 |
Oldest release still checked for new deploys |
releases.projects |
all | Project slugs to poll |
What gets recorded:
- One change per new deploy. A release deployed to
stagingandproductionis two changes, each with its ownenvironment. - A release with no deploys is one
releasechange. - Exactly once, across polls and restarts.
- Labels: the Sentry
projectandenvironment. They match alert labels like any change event; unmatched recent deploys still show, ranked lower.
In triage: deploys appear in the Recent changes block, most relevant
first, with a Δ6m before incident start hint and a link to the release.
When a poll fails (rate limit, network, 5xx), it's logged and retried
next cycle. The sentry health check shows in the log and at GET /health.
Error source: what's erroring#
At triage, AlertINT asks Sentry which errors are firing for this service right now, and whether any is new.
| Adds to triage | Why it matters |
|---|---|
Exception + file:line (deepest in-app frame) |
Points your coding agent at the line |
| Blast radius: level, affected users, in-window event rate | Calibrates severity |
| NEW vs chronic: first seen inside the Incident window, or before | NEW is a likely cause; chronic is more likely a symptom |
- Bounded: one issue search plus at most
max_issuesevent fetches per Incident. - Once per Incident, at triage. Skipped when a known-issue rule short-circuits triage.
- Saved with the Finding, so the evidence pack shows exactly what the model saw.
- No match is a signal too: it suggests the problem isn't in application code.
sentry:
# ...connection as above
issues:
enabled: true
lookback_minutes: 30 # window before the first alert
max_issues: 3 # top issues to include
fetch_timeout_seconds: 15 # for the whole fetch; on timeout the section degrades
live_window_minutes: 60 # default look-back for sentry_issues_list
include_message: true # include the exception message
| Field | Default | Does |
|---|---|---|
issues.enabled |
false |
Runs issue enrichment at triage |
issues.lookback_minutes |
30 |
How far before the first alert to look |
issues.max_issues |
3 |
Top issues to include |
issues.fetch_timeout_seconds |
15 |
Time budget for the whole fetch |
issues.live_window_minutes |
60 |
Default window for sentry_issues_list |
issues.include_message |
true |
Include the exception message everywhere; false removes it from the prompt, storage, and MCP |
Scoping#
| From the Incident's shared labels | Used as |
|---|---|
First of service, project, app, job |
Sentry project (required) |
environment or env |
Environment (optional) |
- Unknown project: noted as "no issues for this scope", not silently dropped.
- No project label: skipped, with the reason logged. AlertINT never guesses.
What leaves Sentry#
| Sent to the LLM, stored, and shown over MCP | Never fetched |
|---|---|
Exception type, culprit, in-app file:line |
Local variables |
| Level, affected users, event rate, first/last seen, NEW flag | Request bodies |
Exception message (only with include_message: true) |
Breadcrumbs, user and context data |
It all stays inside your boundary: your LLM, your database, your MCP server.
Infra vs application: the cross-source tag#
With the Error source on, each analyzed Incident gets one neutral headline in its Sentry section:
| Tag | Means | Headline |
|---|---|---|
matched |
At least one new in-window error coincides with the alert | Sentry: N new in-window error(s) correlated. |
infra-only |
Sentry was checked; nothing new (maybe chronic ones) | Sentry: no new in-window errors for this scope |
| (none) | Sentry is off, or the query degraded | No headline |
The tag is evidence for the model to weigh, not an instruction. infra-only
always means "checked, nothing new", never "not configured".
MCP tools#
| Tool | Answers | Available when |
|---|---|---|
alertint_recent_changes |
What shipped near this Incident? Includes Sentry deploys. See Change events. | Change enrichment is on |
sentry_issues_list |
What's erroring for a project (and environment), live, beyond the triage snapshot? | sentry.issues is on |
sentry_issues_trace |
Full stack traces for up to 10 issue IDs | sentry.issues is on |
- Status filter:
unresolved(default),resolved, orignored(muted). Use the last two to ask "was this seen and handled before?" - Window: without
start/end,sentry_issues_listlooks backlive_window_minutesfrom now. - Project and environment come straight from the Incident's saved Sentry section; no parsing.
- Per-ID errors don't fail a
sentry_issues_tracebatch. - Same privacy shape: frames carry only relative
filename,lineno,function,in_app. Absolute paths are dropped. Each result says the full event stays in Sentry. - Links: Sentry's own issue URL, only when Sentry returns one.
- Untrusted text: culprits, function names, and messages can be planted by anyone who can trigger an error. Treat them as data, not instructions.
What's still erroring for checkout in prod right now?
Show me the full stack trace for the corroborating issue on this Incident.
Was this payments error seen before and already resolved or muted?