Alerting Irm
grafana/skills
Configure Grafana Alerting, Incident Response Management (IRM), and SLOs end-to-end — provisions Grafana-managed and data-source-managed alert rules, contact points (Slack/PagerDuty/email/webhook)…
Reduce Sentry alert fatigue by surgically tuning issue grouping, fingerprint rules, severity mapping, sample rates, before-send filters, sourcemap pipelines, and release-health gates.
$ npx skills add LeoYeAI/openclaw-master-skills --skill sentry-alert-tuner -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install LeoYeAI/openclaw-master-skills sentry-alert-tuner --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/LeoYeAI/openclaw-master-skills.git skills-src && mkdir -p .claude/skills && cp -r skills-src/skills/sentry-alert-tuner .claude/skills/sentry-alert-tuner && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "sentry-alert-tuner" agent skill from https://github.com/LeoYeAI/openclaw-master-skills/tree/main/skills/sentry-alert-tuner into .claude/skills/sentry-alert-tuner/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "sentry-alert-tuner", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/LeoYeAI/openclaw-master-skills/tree/main/skills/sentry-alert-tunerType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add LeoYeAI/openclaw-master-skills --skill sentry-alert-tuner -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install LeoYeAI/openclaw-master-skills sentry-alert-tuner --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/LeoYeAI/openclaw-master-skills.git skills-src && mkdir -p .agents/skills && cp -r skills-src/skills/sentry-alert-tuner .agents/skills/sentry-alert-tuner && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "sentry-alert-tuner" agent skill from https://github.com/LeoYeAI/openclaw-master-skills/tree/main/skills/sentry-alert-tuner into .agents/skills/sentry-alert-tuner/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "sentry-alert-tuner", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add LeoYeAI/openclaw-master-skills --skill sentry-alert-tuner -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install LeoYeAI/openclaw-master-skills sentry-alert-tuner --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/LeoYeAI/openclaw-master-skills.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/skills/sentry-alert-tuner .cursor/skills/sentry-alert-tuner && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "sentry-alert-tuner" agent skill from https://github.com/LeoYeAI/openclaw-master-skills/tree/main/skills/sentry-alert-tuner into .cursor/skills/sentry-alert-tuner/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "sentry-alert-tuner", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/LeoYeAI/openclaw-master-skills.git --path skills/sentry-alert-tuner--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add LeoYeAI/openclaw-master-skills --skill sentry-alert-tuner -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install LeoYeAI/openclaw-master-skills sentry-alert-tuner --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/LeoYeAI/openclaw-master-skills.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/skills/sentry-alert-tuner .gemini/skills/sentry-alert-tuner && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "sentry-alert-tuner" agent skill from https://github.com/LeoYeAI/openclaw-master-skills/tree/main/skills/sentry-alert-tuner into .gemini/skills/sentry-alert-tuner/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "sentry-alert-tuner", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install LeoYeAI/openclaw-master-skills sentry-alert-tunerInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add LeoYeAI/openclaw-master-skills --skill sentry-alert-tuner -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/LeoYeAI/openclaw-master-skills.git skills-src && mkdir -p .github/skills && cp -r skills-src/skills/sentry-alert-tuner .github/skills/sentry-alert-tuner && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "sentry-alert-tuner" agent skill from https://github.com/LeoYeAI/openclaw-master-skills/tree/main/skills/sentry-alert-tuner into .github/skills/sentry-alert-tuner/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "sentry-alert-tuner", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add LeoYeAI/openclaw-master-skills --skill sentry-alert-tuner -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install LeoYeAI/openclaw-master-skills sentry-alert-tuner --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/LeoYeAI/openclaw-master-skills.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/skills/sentry-alert-tuner .opencode/skills/sentry-alert-tuner && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "sentry-alert-tuner" agent skill from https://github.com/LeoYeAI/openclaw-master-skills/tree/main/skills/sentry-alert-tuner into .opencode/skills/sentry-alert-tuner/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "sentry-alert-tuner", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
sentry-alert-tunerReduce Sentry alert fatigue by surgically tuning issue grouping, fingerprint rules, severity mapping, sample rates, before-send filters, sourcemap pipelines, and release-health gates.
Sentry Alert Tuner is an agent skill from LeoYeAI/openclaw-master-skills. Reduce Sentry alert fatigue by surgically tuning issue grouping, fingerprint rules, severity mapping, sample rates, before-send filters, sourcemap pipelines, and release-health gates. Acts as a senior SRE who has nursed Sentry installations through unicorn-scale traffic where a single bad deploy could fire 80,000 alerts. Covers Sentry SaaS and self-hosted (Sentry 24.x), Issues vs Performance vs Replays vs Profiling, integrations rate limiting (Slack, PagerDuty, Opsgenie, Jira), and release-health adoption /…
Its SKILL.md is about 7.3k tokens, which your agent loads only when the skill is triggered. The skill folder holds 3 other files (for example `.clawhub/origin.json` and `_meta.json`).
It sits in DevOps & Cloud, covering Incident response, Monitoring and alerting and Email management. It works with Sentry, Slack, PagerDuty and Jira. The repository describes itself as: 🧠 Curated collection of 1209+ best OpenClaw skills — weekly updated by MyClaw.ai. The licence is MIT.
12 steps, taken from the first numbered list in SKILL.md.
Read from SKILL.md and the folder at commit e5199b5. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
Shell commands in SKILL.md call:
stripeFrom the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md.
From URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Sentry Alert Tuner loads about 7.3k tokens when it runs. Until then it costs about 251 tokens; SKILL.md has 3,217 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from LeoYeAI/openclaw-master-skills at commit e5199b5, republished under its MIT licence (© LeoYeAI). 3,217 words, ~7,338 tokens.
.claude/skills/sentry-alert-tuner/SKILL.md (or your agent's skills folder). This skill also uses 2 other files; get the full folder from GitHub.Tune a Sentry installation so that every alert that fires is worth a human looking at it. Acts as a senior SRE who has owned Sentry for an org with 200+ services, six-figure event volume per minute, and an on-call rotation that has been burned by every form of Sentry noise: sourcemap collapses, third-party widget storms, retry loops, browser extension errors, and the classic "we deployed a typo and got 14,000 alerts" scenario.
This skill does not write detection logic from scratch and does not replace your incident response process. It assumes Sentry is already installed and ingesting events; the job is to make those events actionable. Output is a set of concrete configuration changes (project settings, fingerprint rules, alert rules, SDK init code, CI sourcemap steps) plus a recurring Inbox hygiene playbook.
Invoke when:
Basic invocations:
Tune Sentry for our React + Django stack — alerts are 90% noise We just hit our event quota mid-month, sample rates need rethinking Build a fingerprint ruleset so retries don't spawn 400 issues per outage Set up release-health gates so a bad deploy auto-pauses rollout
Pull the inventory. Use the Sentry API (/api/0/projects/{org}/, /api/0/organizations/{org}/issues/, /api/0/projects/{org}/{proj}/rules/) to dump every project, alert rule, integration, environment, and the top 200 issues by event volume per project. Cache locally as JSON; the audit reruns weekly.
Classify each project by tier. T0 (customer-facing critical path: checkout, auth, payments), T1 (important but not revenue-blocking: dashboard, search), T2 (internal tools, batch jobs, marketing site), T3 (experiments, prototypes). Tier dictates sample rate, alert routing, and release-health strictness — not project type.
Audit the top 50 issues per project. For each, decide one of: keep-as-is, regroup-with-fingerprint, ignore-permanently, filter-at-source (before-send), or fix-the-bug. Most "noise" is actually one of the middle three; only ~10-20% needs an actual code fix.
Write fingerprint rules. Use Sentry's Issue Grouping settings (Project → Settings → Issue Grouping → Fingerprint Rules / Stack Trace Rules). Group by stable signal (route + status code, exception class + module), not by message text (which contains user input, ids, locales).
Write inbound filters. Project → Settings → Inbound Filters covers the boring 60% (browser extensions, web crawlers, legacy browsers, localhost). Turn ALL of them on by default for browser projects. They deduct from quota before ingestion — free win.
Write before-send filters in SDK init. For everything inbound filters can't catch (third-party script noise, retry storms, expected 4xx from form validation). Before-send returns null to drop. This is where the surgical work happens.
Set sample rates by event type and tier. tracesSampleRate, profilesSampleRate, replaysSessionSampleRate, replaysOnErrorSampleRate — each one independent. Errors are always 1.0 (you want all errors); transactions and replays are sampled. Use the formulas in the Performance section.
Tune severity mapping. Most teams leave every alert at default. Build a severity matrix (P0-P4) tied to Sentry alert rule conditions: level, event.tags, release.health.crash_free_rate, frequency thresholds, regressions. P0 pages PagerDuty; P3/P4 only post to Slack.
Wire release-health gates. crash-free-sessions < 99.5% blocks rollout. sessions_errored > X% delta vs prior release triggers an auto-rollback alert. This requires the SDK to emit sessions (default in newer SDKs, opt-in in older).
Lock down sourcemaps. Without sourcemaps, every minified-stack issue is its own group; cleanup is impossible. Audit: every prod release uploads sourcemaps in CI, debug ids match (Sentry CLI 2.x+), and Sentry.init() has a stable release value derived from the same git sha.
Right-size integrations. Slack integration has rate limits (Slack drops messages above ~1/sec per channel) — route P2/P3 to a digest channel, not a live channel. PagerDuty integration: one Sentry alert rule = one PagerDuty service, never multiplex. Jira integration: only for P0/P1 or after manual triage, never auto-create from every new issue.
Implement the Inbox hygiene weekly playbook (see deep section). Inbox is where new issues show up; without weekly hygiene it becomes a 4,000-issue swamp.
Add CI guardrails so future deploys don't undo the work: lint SDK init code for required beforeSend, fail CI if release tag isn't set, block merges that introduce a new Sentry alert without a runbook link.
Schedule the recurring audit. Monthly: re-rank top issues, regroup fingerprints, prune stale alert rules, review tier assignments. Quarterly: re-baseline sample rates, review crash-free thresholds, audit who-owns-what.
Sentry's default grouping is stack-trace-based. It works ~70% of the time. The remaining 30% is where alert fatigue lives. Below are battle-tested fingerprint rules. Apply via Project Settings → Issue Grouping → Fingerprint Rules.
Recipe 1 — Group HTTP errors by route + status: Without this, GET /users/123 and GET /users/124 become separate issues for the same NotFound bug.
error.type:HTTPError http.status_code:404 -> {{ transaction }}-404
error.type:HTTPError http.status_code:5* -> {{ transaction }}-{{ http.status_code }}Recipe 2 — Group third-party SDK errors under one umbrella: Stripe, Segment, Intercom, Datadog RUM, etc. — their errors are not yours, but they fire constantly.
stack.module:"node_modules/stripe/*" -> third-party-stripe
stack.module:"node_modules/@segment/*" -> third-party-segment
stack.abs_path:"*intercom*" -> third-party-intercomRecipe 3 — Collapse network errors by error class, not message: fetch failed: ECONNRESET 10.0.0.42:443 and fetch failed: ECONNRESET 10.0.0.43:443 are the same bug.
error.type:"NetworkError" -> network-{{ error.value | regex:"E[A-Z]+" }}Recipe 4 — Split a megaissue by environment: Sometimes one issue is actually three: the staging variant, the prod variant, the canary variant.
error.type:DatabaseError -> {{ default }}-{{ environment }}Recipe 5 — Group browser extension noise: Inbound filter catches the obvious ones. Fingerprint catches the rest.
stack.abs_path:"*chrome-extension*" -> browser-extension
stack.abs_path:"*moz-extension*" -> browser-extension
stack.abs_path:"*safari-extension*" -> browser-extensionRecipe 6 — Group retries as one issue: Background jobs that retry 5 times shouldn't create 5 events. Tag the event with retry_attempt and group on attempt 1 only.
tags.retry_attempt:1 -> {{ default }}
tags.retry_attempt:* -> retry-noise-{{ transaction }} # send to ignored project or dropRecipe 7 — Group GraphQL operations by operationName, not query string: Default grouping uses the full query, so a 200-line query change becomes a "new issue."
tags.graphql.operation_name:* -> graphql-{{ tags.graphql.operation_name }}Recipe 8 — Collapse i18n / locale variants: Error messages like "User not found (en-US)" vs "Utilisateur introuvable (fr-FR)" are the same bug.
error.type:UserNotFound -> user-not-found-i18nRecipe 9 — Group SSL handshake errors by host class: Per-host fingerprinting is too granular for transient SSL flakes.
error.value:"*SSL*handshake*" -> ssl-handshake-{{ extra.host_class }}Recipe 10 — Split a "catch-all" megaissue by callsite: When Exception got caught at the top of a request handler and lost its real type, explicitly fingerprint by request.url to recover signal.
error.type:Exception transaction:"" -> catchall-{{ request.url | regex:"^/[^/]+" }}Recipe 11 — Don't fingerprint by user-supplied input: Always strip user.id, request.body.*, search query strings before fingerprinting. They explode cardinality.
Recipe 12 — Use stack-trace rules for vendor noise: Stack-trace rules (separate from fingerprint rules) mark frames as +app or -app so Sentry's default grouping ignores vendor frames. Combine: stack-trace rule first to mark vendor frames, fingerprint rule second for what's left.
Most teams have one severity: "an alert fired." Build a five-tier matrix. Map each alert rule to exactly one tier. Routing follows tier, not gut feel.
| Tier | Definition | Sentry conditions | Routing | SLA |
|---|---|---|---|---|
| P0 | Customer-facing outage, data corruption, auth break | level:fatal AND transaction:checkout/* OR release.crash_free_session_rate < 99% | PagerDuty page (urgent), #incidents, status page draft | Ack 5 min |
| P1 | Significant degradation, error budget burn, regression in T0 | level:error AND event.count > 100/5min AND transaction:T0/* OR new issue in release-day window for T0 | PagerDuty page (high), #oncall | Ack 15 min |
| P2 | New issue in T1, sustained error rate above baseline, third-party degradation | New issue assigned to a team channel, event.count > 50/15min for T1 | Slack #team-alerts (live channel) | Triage same day |
| P3 | Anomaly, potential regression, low-volume issue | event.count > 10/hour for T1/T2, regressions of resolved issues | Slack #team-alerts-digest (hourly), Linear ticket | Triage in week |
| P4 | Informational, expected, best-effort | Anything in T2/T3, unhandled-but-explained, deprecation warnings | Email digest weekly OR /dev/null | Optional |
Concrete examples — what each tier looks like in practice:
Stripe charge.create raised AuthenticationError (5+ events in 60s) — payments are down.crash-free-session-rate: 96.4% on release 2026.5.4-canary — release-health gate tripped, auto-rollback triggered.New issue: TypeError: Cannot read 'length' of undefined in /checkout/review — first time seen in checkout path post-deploy.Regression: ConnectionPoolTimeout (resolved 14d ago, now 200 events/5min) — a fix unfixed itself.New issue: SegmentAnalyticsError: timeout (32 events/15min) — third party degraded; should be tracked, not paged.Issue frequency anomaly: AddToCartFailed +250% vs 7d baseline (still <50 events/h) — investigate this week.DeprecationWarning: moment.js used (1,200 events/day) — file as tech debt, do not alert.The mapping is a decision in the alert rule, not a Slack channel pick after the fact. Tag the rule with severity:P1 so it's queryable.
Without a recurring playbook, Sentry Inbox accumulates new-but-ignored issues until the For Review tab has 800 entries and nobody opens it. The agent installs this playbook as a 30-minute weekly slot, owned by a rotating team member.
MONDAY 09:30 — INBOX TRIAGE (30 min, rotating owner)
Step 1 (5 min): Open Inbox → For Review for the team's projects. Sort by Events.
Step 2 (10 min): For each top-20 issue:
- Real bug, fixable: assign to owner, link to Linear/Jira, set priority.
- Real bug, not fixable now: archive with "Until X events in Y days" rule.
- Not a bug, expected: mark Resolved, add fingerprint/before-send rule so it
doesn't recur. The fix is the rule, not the dismissal.
- Third party: tag with `external_dependency:<vendor>`, archive.
- Already-known: link to existing issue, merge.
Step 3 (5 min): Open Issues → Regressed. Investigate any regression of an
issue resolved <30 days ago. Regressions are the #1 most-missed signal.
Step 4 (5 min): Open Releases → latest. Check crash-free-session rate.
If <99.5% (T0) or <99% (T1), file a postmortem ticket.
Step 5 (5 min): Note three numbers in #team-status: new issues, regressions,
crash-free rate. Trend visible to the team without opening Sentry.Archive rules (Sentry's "Archive Until" feature) save the most time. Apply liberally:
The playbook lives in MEMORY, gets re-checked monthly, and the rotation is enforced. Skipped weeks compound.
Default tracesSampleRate: 1.0 will burn through your transaction quota in days for any project with real traffic. Default 0 blinds you to performance regressions. The trick: tier-based sampling with dynamic boost on errors.
Formulas:
errors_sample_rate = 1.0 (always — you want all errors)
traces_sample_rate(T0) = min(1.0, 100k / monthly_transaction_volume)
traces_sample_rate(T1) = min(0.10, 50k / monthly_transaction_volume)
traces_sample_rate(T2) = min(0.01, 10k / monthly_transaction_volume)
profiles_sample_rate = 0.10 * traces_sample_rate
replays_session_sample = 0.001 (session-mode is expensive)
replays_on_error_sample = 1.0 (catch every error replay)Use tracesSampler (function form), not tracesSampleRate (number) for any non-trivial project. It lets you boost sampling for important transactions and drop noisy ones:
Sentry.init({
tracesSampler: (ctx) => {
if (ctx.transactionContext.name?.startsWith('GET /healthz')) return 0;
if (ctx.transactionContext.name?.startsWith('POST /checkout')) return 1.0;
if (ctx.transactionContext.op === 'queue.task') return 0.05;
if (ctx.parentSampled !== undefined) return ctx.parentSampled; // honour upstream
return 0.05; // default for everything else
},
});Dynamic Sampling (Sentry SaaS) does an adaptive version automatically, but only for transactions, only on Business plan and above, and only with caveats: it preserves rare transactions and important tags. If you have it, set tracesSampleRate: 1.0 and let DS shed; if you don't, use tracesSampler with the formula above.
Profile sampling is multiplicative on traces, so profilesSampleRate: 1.0 with tracesSampleRate: 0.05 means you only profile sampled traces. Profile data is the most expensive — 0.10 ratio of transactions is plenty.
Replay sampling has two knobs: session (start a replay on every page load, sampled) and on-error (start a replay only when an error happens). On-error is free signal; turn it to 1.0 for any project where users see errors. Session replay is for product analytics, not error monitoring — keep it ≤0.1%.
Without sourcemaps, every minified production error groups by minified stack — which changes every build. Cleanup is impossible because issues regenerate every release. Sourcemaps are the most-skipped step and the highest-leverage fix.
Required CI steps (one of these per release):
# Modern (Sentry CLI 2.x+, debug ids — RECOMMENDED)
sentry-cli sourcemaps inject ./dist
sentry-cli sourcemaps upload --release="$GIT_SHA" ./dist
# Legacy (release-based, works but fragile)
sentry-cli releases new "$GIT_SHA"
sentry-cli releases files "$GIT_SHA" upload-sourcemaps ./dist --url-prefix '~/static/js'
sentry-cli releases finalize "$GIT_SHA"Bundler plugins (better than CLI for most projects):
@sentry/webpack-plugin (also Vite, Rollup, Esbuild, Next.js, Nuxt, SvelteKit)release from CI env (SENTRY_RELEASE or process.env.GIT_SHA)Verification (every release):
sentry-cli sourcemaps explain <event-id> reveals which sourcemap was/wasn't matchedsentry-cli sourcemaps validate ./dist fails build if maps are missingCommon breakage:
release mismatch between SDK init and CLI upload (most common — both must use the same git sha)sourceMappingURL comment stripped by post-bundler minifier--bundle-sourcemap)server/ vs static/)sourcesContent: true in webpack configThe single most leveraged knob in any Sentry SDK init. beforeSend(event, hint) runs in the SDK before the event leaves the user's machine; returning null drops it entirely. Below are battle-tested filters that ship with every project.
Filter 1 — Drop ResizeObserver loop errors: Browser noise from third-party widgets that monitor element resize. Pure noise.
beforeSend(event) {
const msg = event.exception?.values?.[0]?.value || '';
if (msg.includes('ResizeObserver loop limit exceeded')) return null;
if (msg.includes('ResizeObserver loop completed')) return null;
return event;
}Filter 2 — Drop network errors during page unload: Fetch aborted because the user navigated away — not a real error.
beforeSend(event, hint) {
if (event.tags?.unload === 'true') return null;
if (hint.originalException?.name === 'AbortError') return null;
return event;
}Filter 3 — Drop expected 4xx in form validation: A 400 from the form validation endpoint is correct behavior, not an error.
beforeSend(event) {
const status = event.contexts?.response?.status_code;
const url = event.request?.url || '';
if (status === 400 && url.includes('/api/validate')) return null;
return event;
}Filter 4 — Sample expected retry storms: Background jobs retry; the first retry is the signal, retries 2-5 are noise.
beforeSend(event) {
const attempt = event.tags?.retry_attempt;
if (attempt && parseInt(attempt) > 1) return null;
return event;
}Filter 5 — Strip PII before send (GDPR/HIPAA): Always run scrubbing in beforeSend even with server-side scrubbing — defense in depth.
beforeSend(event) {
if (event.user) {
delete event.user.email;
delete event.user.ip_address;
event.user.id = hash(event.user.id);
}
if (event.request?.headers) {
delete event.request.headers['authorization'];
delete event.request.headers['cookie'];
}
return event;
}Filter 6 — Drop bot traffic: Headless browsers, screenshot services, uptime checkers.
beforeSend(event) {
const ua = event.request?.headers?.['user-agent'] || '';
if (/HeadlessChrome|Pingdom|UptimeRobot|GoogleBot|bingbot/i.test(ua)) return null;
return event;
}Filter 7 — Suppress events from dev/feature branches reaching prod project: Misconfigured DSN.
beforeSend(event) {
if (event.environment !== 'production' && SENTRY_DSN.includes('-prod')) return null;
return event;
}Filter 8 — Drop events during known third-party outage: Wire to a flag service, flip during incident.
beforeSend(event) {
if (window.__suppressSentry === true) return null;
if (event.tags?.dependency === 'stripe' && window.__stripeOutage) return null;
return event;
}Filter 9 — Server-side: drop events from canary deploy that's known broken: Avoid 50,000 alerts during rollback window.
def before_send(event, hint):
if event.get('release') == os.environ.get('CANARY_RELEASE_BLACKLIST'):
return None
return eventtracesSampleRate: 1.0 "until we figure it out". You will not figure it out; you will run out of quota. Use the formula above from day one.event.message. Messages contain user input, ids, locales — every event becomes a new issue. Fingerprint by error.type + transaction + module.release tag in SDK init. Without a release, sourcemaps can't be matched, regression detection breaks, and release-health is empty.environment:production and add a frequency threshold.tracesSampleRate set, tracesSampler ignored. A constant rate samples healthchecks the same as checkout. Use the function form for every project with mixed traffic.user_id, request_id, or session_id makes search slow and inflates tag storage. Use extra data or breadcrumbs instead.environment in init from process.env.NODE_ENV or equivalent; alert rules scope to environment:production.tracesSampler torches the quota in days.Each integration has its own rate limit and failure mode. Unaware routing causes silent message drops at the worst times.
Slack:
#alerts.PagerDuty:
Jira / Linear:
Opsgenie:
Microsoft Teams:
Sentry SaaS (sentry.io):
tracesSampler.Sentry Self-Hosted (24.x docker-compose):
sentry.conf.py: SENTRY_EVENT_RETENTION_DAYS = 90 (default 90; reduce to 30 for cost).ALTER TABLE ... DROP PARTITION for retention.beforeSend reviewed in every SDK init; documented in a shared sentry-init.mdtracesSampler function used for non-trivial projectssentry-cli sourcemaps validate is a required stepbeforeSend, required release, runbook link on new alert rules© LeoYeAI, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
SKILL.md and 2 other files in skills/sentry-alert-tuner of LeoYeAI/openclaw-master-skills.
Open the folder on GitHubat commit e5199b5
Sentry Alert Tuner next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Sentry Alert Tuner this skillLeoYeAI/openclaw-master-skills | 2.2k | — | ~7.3k | Automated safety check: Pass | MIT | |
| Alerting Irmgrafana/skills | 282 | 1 repos | ~1.9k | Automated safety check: Pass | Apache-2.0 | |
| Tool ConnectorZhixiangLuo/10xProductivity | 479 | — | ~925 | Automated safety check: Pass | MIT | |
| Oncall Irmgrafana/skills | 282 | — | ~1.4k | Automated safety check: Pass | Apache-2.0 | |
| Kibana Connectorsaspectrr/deer | 405 | — | ~2k | Automated safety check: Pass | MIT | |
| Axiom SRE Investigatoropenclaw/clawhub | 9.5k | — | ~7.1k | Automated safety check: Pass | MIT |
grafana/skills
Configure Grafana Alerting, Incident Response Management (IRM), and SLOs end-to-end — provisions Grafana-managed and data-source-managed alert rules, contact points (Slack/PagerDuty/email/webhook)…
ZhixiangLuo/10xProductivity
Connect any tool you use at work to your agent — including internal company tools, custom-built systems, deployment portals, incident trackers, internal knowledge bases, HR systems, and commercial…
grafana/skills
Route alerts, run on-call rotations, and drive incidents in Grafana IRM / OnCall — integrations (Alertmanager / Grafana Alerting / generic webhook / PagerDuty), Jinja2 routing + grouping templates…
aspectrr/deer
Create and manage Kibana connectors for Slack, PagerDuty, Jira, webhooks, and more via REST API or Terraform.
openclaw/clawhub
Investigates incidents and production problems with hypothesis-driven debugging, queries Axiom observability data when available, and keeps secrets out of commands and output.
superset-sh/superset
Does a read-only first pass on a possible production incident: gathers deploy, Sentry and health-check signals, proposes a severity and status message, then stops for human approval.
LeoYeAI/openclaw-master-skills
Manages pipelines on a DevOps quality and efficiency platform through its OpenAPI: list workspaces and templates, create, update, run and cancel pipelines, and read run records.
LeoYeAI/openclaw-master-skills
Patches OpenClaw's Feishu extension so an edited document triggers an isolated agent session that reads the doc and replies inline, turning it into a live chat space.
LeoYeAI/openclaw-master-skills
Multi-context memory management system for OpenClaw agents with group-isolated storage, global shared memory, workspace organization, and group-specific skills isolation.
LeoYeAI/openclaw-master-skills
Runs a brand's AI-search visibility work end to end: diagnosing how AI platforms represent it, repositioning it, producing AI-optimized content and monitoring ongoing mentions.
LeoYeAI/openclaw-master-skills
Installs and authenticates the gws CLI, then automates Gmail, Drive, Sheets, Calendar, Docs, Chat and Tasks with ready-made recipes, persona bundles and security audits.
LeoYeAI/openclaw-master-skills
Runs four advisor roles, a fitness coach, nutritionist, data analyst and TCM practitioner, to build a health profile and track workouts, diet and wellness over time.
Categories
Reduce Sentry alert fatigue by surgically tuning issue grouping, fingerprint rules, severity mapping, sample rates, before-send filters, sourcemap pipelines, and release-health gates. Sentry Alert Tuner is an agent skill from LeoYeAI/openclaw-master-skills. Reduce Sentry alert fatigue by surgically tuning issue grouping, fingerprint rules, severity mapping, sample rates, before-send filters, sourcemap pipelines, and release-health gates.
Sentry Alert Tuner fits situations like: alerts are noisy; the on-call rotation hates Sentry; the bill is climbing; issues counts are unreadable.
Run `npx skills add LeoYeAI/openclaw-master-skills --skill sentry-alert-tuner -a claude-code`. Or copy the skill folder (skills/sentry-alert-tuner in LeoYeAI/openclaw-master-skills) into .claude/skills/sentry-alert-tuner in your project. Claude Code loads it when a task matches its description.
Run `npx skills add LeoYeAI/openclaw-master-skills --skill sentry-alert-tuner -a codex`. Or copy the skill folder (skills/sentry-alert-tuner in LeoYeAI/openclaw-master-skills) into .agents/skills/sentry-alert-tuner in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add LeoYeAI/openclaw-master-skills --skill sentry-alert-tuner -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/sentry-alert-tuner, .gemini/skills/sentry-alert-tuner, .github/skills/sentry-alert-tuner and .opencode/skills/sentry-alert-tuner in your project.
Going by SKILL.md and its folder, Sentry Alert Tuner needs the command-line tools its instructions call (stripe).
SKILL.md contains no URLs. Any network use would come from the scripts or tools the agent runs. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.
Sentry Alert Tuner is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 7.3k tokens (SKILL.md is roughly 29k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with Sentry Alert Tuner: Alerting Irm (grafana/skills, 282 stars), Tool Connector (ZhixiangLuo/10xProductivity, 479 stars), Oncall Irm (grafana/skills, 282 stars) and Kibana Connectors (aspectrr/deer, 405 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
LeoYeAI (a GitHub user) maintains it in LeoYeAI/openclaw-master-skills, which has 2,161 GitHub stars. The repository holds 1,235 skills in this directory. The repository was last updated on July 20, 2026.
Source: LeoYeAI/openclaw-master-skills on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.