Skip to content

[pull] master from getsentry:master#1816

Merged
pull[bot] merged 65 commits intoKingDEV95:masterfrom
getsentry:master
Mar 23, 2026
Merged

[pull] master from getsentry:master#1816
pull[bot] merged 65 commits intoKingDEV95:masterfrom
getsentry:master

Conversation

@pull
Copy link

@pull pull bot commented Mar 23, 2026

See Commits and Changes for more details.


Created by pull[bot] (v2.0.0-alpha.4)

Can you help keep this open source service alive? 💖 Please sponsor : )

alexsohn1126 and others added 30 commits March 23, 2026 12:03
## Summary
- Add `on_app_mention()` handler to `SlackEventEndpoint` that resolves
the org, checks the `seer-slack-explorer` feature flag, extracts event
data, and dispatches `process_mention_for_slack` task
- Update `post()` to route `app_mention` events to the new handler
- Add stub `process_mention_for_slack` Celery task in
`seer/entrypoints/slack/tasks.py` (full implementation in ISWF-2023)

Ref: ISWF-2018

---------

Co-authored-by: Leander Rodrigues <me@leander.xyz>
Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: Claude Opus 4.6 <noreply@example.com>
The SCM platform is now more tolerant to GitLab integrations'
`external_id` format.
…ard generate (#111301)

Pass `category_key` and `category_value` to `SeerExplorerClient` in the
dashboard generate endpoint so that runs are properly categorized by use
case and organization. This enables cost / usage tracking of dashboard
generation requests


Agent transcript:
https://claudescope.sentry.dev/share/IyJKW8mCxA7WRfW26AW3In8LsGwl3OjMG_FCj72aAsA
Adds `collapse=stats` to the `useGroup` query key so the group details
endpoint skips computing 24h/30d time-series stats. The issue details
page uses Discover queries for its event graph, not the `stats` field
from the group response.

This also benefits the stacktrace preview tooltip, which prefetches
group data via `useGroup` on hover.

- Depends on #111155
Before the image was tooooo big. 

Here's a side-by side of the page at the same browser-window size,
before the bottom was cutoff at this dimension!

| Before | After |
| --- | --- |
| <img width="1512" height="948" alt="SCR-20260322-jslx"
src="https://github.com/user-attachments/assets/b69e56c9-b10a-4e7e-a024-ab7e89ec84da"
/> | <img width="1512" height="948" alt="SCR-20260322-jsmh"
src="https://github.com/user-attachments/assets/2981d2d8-3dc7-452e-ba69-61892daa995f"
/>


It was always responsive though: narrowing the window width, or
shrinking the height scales the image.

Here's a selection of images to show the page at different approx
scales, assuming the image above is the 100% size, these are all
smaller:

| Scale | Img |
| --- | --- |
| 3/4 height | <img width="1512" height="725" alt="seer trial - after
3-4 height"
src="https://github.com/user-attachments/assets/d85c639e-c34d-4c82-8070-730f8caec8f4"
/>
| 1/2 height | <img width="1512" height="580" alt="seer trial - after
1-2 height"
src="https://github.com/user-attachments/assets/619e0d5e-7895-4c4f-b274-e200483a03ba"
/>
| 3/4 width | <img width="1170" height="948" alt="seer trial - after 3-4
width"
src="https://github.com/user-attachments/assets/a4a08a61-ed7a-4c7b-97f4-72424b054e86"
/>
| 1/2 width | <img width="784" height="948" alt="seer trial - after 1-2
width"
src="https://github.com/user-attachments/assets/58109123-93a1-4480-a41c-eddac3ae6719"
/>
| 3/4 of total | <img width="1207" height="760" alt="seer trial - after
3-4 size"
src="https://github.com/user-attachments/assets/7124abef-28a7-4c34-9e94-b8ebde30824c"
/>
| 1/2 of total | <img width="790" height="615" alt="seer trial - after
1-2 size"
src="https://github.com/user-attachments/assets/e033ace1-a874-4437-b8c3-a3a75cfa556f"
/>
This reverts commit e5504b6.

Co-authored-by: GabeVillalobos <5643012+GabeVillalobos@users.noreply.github.com>
Adds `group` param as first-class to metadata
…ct (#111279)

**Before**
<img width="590" height="201" alt="Screenshot 2026-03-22 at 3 57 58 PM"
src="https://github.com/user-attachments/assets/ef39b787-ffd1-4eea-a547-95265ea68bed"
/>


**After**

| Tab | Url |
| --- | --- |
| Overview | <img width="590" height="201" alt="Screenshot 2026-03-22 at
3 57 42 PM"
src="https://github.com/user-attachments/assets/40bf7392-6a95-45f2-b832-76338da26e95"
/>
| SCM | <img width="590" height="201" alt="Screenshot 2026-03-22 at 3 57
48 PM"
src="https://github.com/user-attachments/assets/63a6537e-9f5d-4fdf-8e5e-c640084a629c"
/>
| Autofix | <img width="590" height="201" alt="Screenshot 2026-03-22 at
3 57 50 PM"
src="https://github.com/user-attachments/assets/dd689499-7816-449d-95ac-c88be529c2e6"
/>
| Code Review | <img width="590" height="201" alt="Screenshot 2026-03-22
at 3 57 52 PM"
src="https://github.com/user-attachments/assets/85d36f87-cd8e-4cbc-92e6-8b87399ee52a"
/>
# Description
Signal handlers for cache invalidation. There's not a rollout flag
included here yet, because any exceptions or failures are limited to the
scope of these invalidation methods and it keeps that a little simpler.

When we invalidate the Action Filters / Data conditions:
| Model | Signal | Reason |
|--------|--------|--------|
| WorkflowDataConditionGroup | post_save | When an action filter is
created on a workflow |
| WorkflowDataConditionGroup | pre_delete | When an action filter is
removed from the workflow |
| DataConditionGroup | post_save | When an update to the logic type in
the condition |
| DataCondition | post_save | When a condition on a filter is created or
changed |
| DataCondition | pre_delete | When a condition on the filter being
removed |

## Remaining Work
- [ ] Update the `evaluate_workflows_action_filters` method to read from
the cache with a rollout flag.
…111283)

Follow-up to #110981 which batched nodestore fetches for the group
events endpoint. The batched `get_multi` call reduced 100 sequential
Bigtable RPCs to 1, but the single batch still takes ~8-10s because row
keys are MD5-hashed and scattered across ~100 Bigtable tablets.

This PR adds two things to help understand and reduce that cost:

### 1. Cache observability for `get_multi`

The single-event `get()` already emits `nodestore.get` metrics with
`cache:hit/miss` tags, but `get_multi` had no cache metrics at all. Now
it emits:

```
nodestore.get_multi  cache:hit   amount=<N>
nodestore.get_multi  cache:miss  amount=<N>
```

This lets us measure the actual cache hit rate for batch reads in
production and understand whether increasing the TTL would help.

### 2. Configurable cache TTL

Cache entries were written with no explicit `timeout`, relying on the
backend's `DEFAULT_TIMEOUT` (typically 300s). Since event bodies are
**immutable** — they never change after ingestion — there's no
invalidation concern with longer TTLs.

The new `nodestore.cache-ttl` option (default: 300s) can be tuned upward
via configoptions without a deploy. If production metrics show low hit
rates, increasing to 1-4 hours should improve cache effectiveness for
paginated list views where events are often viewed in quick succession.

### Why this helps

The group events endpoint fetches ~100 events per page. With a 5-minute
cache TTL, events ingested more than 5 minutes ago won't be cached when
the list is first viewed. But once viewed, they'll be cached for
subsequent page loads and adjacent page navigations. A longer TTL
extends this window significantly.

### Files changed

- `src/sentry/services/nodestore/base.py` — metrics in `get_multi`,
explicit TTL in `_set_cache_item`/`_set_cache_items`
- `src/sentry/options/defaults.py` — register `nodestore.cache-ttl`
option

Co-authored-by: Claude Opus 4 <noreply@anthropic.com>
## Summary
- Add `extract_prompt()` to strip the bot's `<@BOT_ID>` mention from
Slack message text while preserving other user mentions as context for
Seer
- Add `extract_issue_links()` to extract `(group_id, event_id)` tuples
by reusing existing unfurl regex patterns from `unfurl/issues.py`
- Add `build_thread_context()` to format Slack `conversations.replies`
messages into a readable transcript for Seer Explorer

ISWF-2019
Found a minor inconsistency with lastTriggered in the process, fixed it.
I'm not entirely certain the legacy action data is valid, but seems
plausible.
…111299)

The `EAPSummaryContentInner` component was using
`TransactionSearchQueryBuilder`, which provides transaction-oriented
field definitions (e.g. `geo.country_code`). Since the EAP page queries
the spans dataset, the search bar should use spans attributes (e.g.
`user.geo.country_code`) for validation and autocompletion.

Replace with `useSpanSearchQueryBuilderProps` +
`TraceItemSearchQueryBuilder`, matching the pattern used across Insights
pages.

Fixes BROWSE-464.

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
…11308)

These checks were lifted to the sidebar so no need for it inside the
drawer.
…ataset (#110742)

Adds integration tests for the new occurrences EAP dataset on
`/api/0/organizations/{org}/events/ ` and `/events-stats/ endpoints`,
 introduced in #109727.

Add `count_unique()` and `last_seen()` columns for occurrences.
…ystem (#111171)

This was auto-converted using the LLM skill

I tested that the toggles are still sending their expected values,
usually a true/false, but sometimes a `medium` or `off`. Looking good!
## Summary
- Add Explorer methods to `SlackEntrypoint`: `from_explorer_mention()`
factory, `has_explorer_access()`, `on_trigger_explorer_error()`,
`on_trigger_explorer_success()`, `create_explorer_cache_payload()`
- Add `SlackExplorerCompletionHook` for handling Explorer run completion
via cached payloads
- Add `SeerExplorerError` notification data, template, and Slack
renderer with tests
- Add `SeerExplorerResponse` notification data and Slack renderer
- Add `SeerOperatorExplorerCache` for Explorer completion hook payloads
- Add `SlackExplorerCachePayload` TypedDict

Closes ISWF-2021

---------

Co-authored-by: Leander Rodrigues <me@leander.xyz>
Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: Claude Opus 4.6 <noreply@example.com>
Add a `snuba_rpc.read_timeout_error` metric. This will allow us better
observability into snuba api health
- The replay code is being absorbed by the databrowsing teams so
changing the ownership to match
- Closes ENG-7101
Autofix redesigns are mostly ready to go. This removes the original
version from the code base.
…1318)

Add a toggle button in the snapshot dev tools panel that lets developers
switch between solo and diff views on snapshots that have diff data.

The button toggles the `?type=solo` URL query parameter — when viewing
a diff snapshot, clicking "View as solo" adds `?type=solo` to show the
raw images without comparison overlay. Clicking "View as diff" removes
the parameter to restore the diff view. The button only renders when
the snapshot has a base artifact (i.e., diff data exists).

This is an admin/dev-only feature, scoped to the temporary dev tools
panel rather than the main header UI.

---------

Co-authored-by: Claude Opus 4.6 <noreply@example.com>
These options were for rollouts, features that don't exist anymore, and
grpc options that we didn't end up needing/using.

Refs STREAM-798
…ions and SeerProjectRepository (#110704)

relates to AIML-2605

Adds dual-write so that all Seer project preference writes also persist
to Sentry's DB (ProjectOption keys + SeerProjectRepository rows), gated
behind the organizations:seer-project-settings-dual-write feature flag.
This is Phase 1 Step 4 of the [Seer preferences
migration](https://www.notion.so/sentry/Tech-Spec-Migrate-Seer-Settings-to-Sentry-Database-3208b10e4b5d80f58ea0d7b77a301e2a)
— once reads are cut over in later phases, the Seer API calls get
removed and these DB writes become the primary path.

We only write to DB if the Seer call succeeded.

---------

Co-authored-by: Claude Opus 4 <noreply@anthropic.com>
Co-authored-by: Claude Opus 4.6 <noreply@example.com>
This doesn't need the relative position anymore
Implements the new menu for when page frame is enabled and hides the
footer.

<table>
<tr>
 <td> Before
 <td> After
<tr>
<td> <img width="678" height="866" alt="CleanShot 2026-03-20 at 17 27
20@2x"
src="https://github.com/user-attachments/assets/9873f451-be8f-4e24-a116-bcdb89587edc"
/>
<td> <img width="672" height="542" alt="CleanShot 2026-03-20 at 17 27
52@2x"
src="https://github.com/user-attachments/assets/db8b5d4b-b53f-4c3b-81aa-b0455b1cbdb1"
/>
</table>
gggritso and others added 25 commits March 23, 2026 15:26
…ifts (#111238)

Wraps each filter selector trigger in a `Container` with a `maxWidth` of
`300px` so that selecting a long filter value doesn't cause the trigger
button to expand and push other elements around in the filters bar as
much. It still will a bit!

Fixes DAIN-1377

Co-authored-by: Claude <noreply@anthropic.com>
…#111278)

Fix primary nav accessibility issues identified through a lighthouse
audit by:
- Changing hover action to use data-attr as opposed to overriding
aria-selected
- Using `aria-current=location` attribute
- Updating reorderable item components to correctly render a ul > li
structure
- Adding test assertions for all secondary navigation lists which
validate the correctness of the generated HTML
- Moving issues supergroups under the `List` component (identified by
the test suite)

The collective set of changes results in no reported violations from
lighthouse for our primary or secondary navigation and improves the
accessibility audit by ~7pts

Fixed DE-1015

---------

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
Use Layout.Page on Feedback page which will apply the correct background
when pageFrame feature is enabled
Update pageframe layout to primary background and be compatible with the
pageframe

---------

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
…quest (#111335)

We're going to use a normal request with an extrapolated server-only
count for the total # of metrics call for a widget. This works because
right now metrics are sampled at 100% so the server only count is a
close approximation of our stored count. Adds a referrer to make sure
this is queryable
…111221)

all cell rpc methods that use the ByCellName resolver have been migrated
to cell_name. We can drop support for region_name now.
)

Closes DAIN-1375. Current dashboard widgets have a very horrible red
banner for error states, and an even more horrible error boundary:

**e.g.,**
<img width="840" height="103" alt="Screenshot 2026-03-19 at 3 34 43 PM"
src="https://github.com/user-attachments/assets/869642cf-fe6f-42fe-b6e2-de46edd57ed0"
/>
<img width="836" height="273" alt="Screenshot 2026-03-19 at 3 04 55 PM"
src="https://github.com/user-attachments/assets/919ea3ca-2fb9-40d9-9ddd-c2514e72186d"
/>

This PR replaces both of them with `Widget.WidgetError` which is the
standard way to handle this.

**e.g.,**
<img width="836" height="279" alt="Screenshot 2026-03-19 at 3 40 22 PM"
src="https://github.com/user-attachments/assets/916b211a-532a-4f74-9186-029ed32ef2bd"
/>

I had to alias `Widget` to `TWidget` to allow importing the `Widget`
component in a few places, but overall, this PR just replaces a bunch of
custom error handling done through render props with a simple
conditional that uses `WidgetError` to render errors.
…111325)

Show the previous filename when hovering over a renamed snapshot image's
filename.

When images are renamed between builds, the UI now shows a tooltip with
the rename
transition (`old_name → new_name`) on hover. Renamed filenames use the
accent
`InlineCode` variant (purple tint) as a visual hint that additional info
is available.

Changes:
- Add `previous_image_file_name` to the `SnapshotImage` TypeScript
interface
- Wrap renamed image filenames in a `Tooltip` showing the before → after
names
- Use accent `InlineCode` inside the tooltip for consistent styling

Closes EME-961


Regular snapshot title UI:
<img width="680" height="427" alt="image"
src="https://github.com/user-attachments/assets/a533449e-876f-48e1-9151-3be1877341a7"
/>

Renamed snapshot title:
<img width="622" height="290" alt="image"
src="https://github.com/user-attachments/assets/62e9aa3e-fc1d-4d76-829e-d82bc664bfe4"
/>

tooltip if you hover the title:
<img width="596" height="102" alt="image"
src="https://github.com/user-attachments/assets/6831466c-62b2-4361-b42e-e8fcbe7e2912"
/>

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
…#111332)

## Summary

Follow-up to #111325 — refactors renamed snapshot items to use
`SnapshotDiffPair` instead of a flat `SnapshotImageResponse` with a
`previous_image_file_name` field.

A rename is conceptually a diff from old image → new image, so the pair
structure naturally models this:
- `base_image` = old filename (looked up by `previous_image_file_name`)
- `head_image` = new filename
- `diff` / `diff_image_key` remain `None` (no visual diff for renames)

### Changes

- **`SnapshotImageResponse`**: Remove `previous_image_file_name` field
(no longer needed in API response)
- **`SnapshotDetailsApiResponse`**: Change `renamed` from
`list[SnapshotImageResponse]` to `list[SnapshotDiffPair]`
- **`CategorizedComparison`**: Same type change for `renamed`
- **`categorize_comparison_images`**: Build `SnapshotDiffPair` for
renamed items by looking up base image by old filename from
`base_images_by_file_name`

Note: `previous_image_file_name` is kept on `ComparisonImageResult` in
`manifest.py` — that's internal transport from tasks → categorizer, not
part of the API response.

## Test plan

- [ ] Existing backend snapshot tests pass
- [ ] Frontend PR (#111325) updated to consume renamed as
`SnapshotDiffPair[]`
- [ ] Manual: renamed items show tooltip with old → new filename

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
the pydantic models RpcOrganizationMapping and
RpcOrganizationMappingUpdate used for rpc now send `cell_name` instead
of `region_name` on the wire

support for both fields was added in
#111039
…tors (#111259)

Metric monitors with percent change thresholds were translating the
value incorrectly. `110` should display as `10% higher`, not `110%
higher`.
+ Add top-level and nested tracing spans around allowed-org selection so
we can measure end-to-end scheduler time and isolate feature flag check
cost.
+ Trying to keep track of time taken by this function as we iterate on
it.

---------

Co-authored-by: GPT-5.4 <noreply@openai.com>
…#111297)

`toPythonString` converted `null`/`undefined` inside arrays to `'None'`
but fell through to `String(null)` → `"null"` at the top level. Python's
`str(None)` returns `"None"`, so when a `groupBy` value is `null`, the
JS-side string didn't match the backend's `"None"`, causing the
breakdown legend to fail to find matching table rows.

Adds a `null`/`undefined` check before the array branch, and refactors
the array item mapping to use recursive `toPythonString` calls so
boolean/null handling is consistent at all nesting levels. Adds unit
tests covering strings, booleans, null, undefined, numbers, and mixed
arrays.

---------

Co-authored-by: Claude Opus 4.6 <noreply@example.com>
- Delete old ExternalIssues component
- Rename StreamlinedExternalIssues to ExternalIssues
…te stories later (#111216)

The sentry & getsentry split is still annoying. I want to throw a bunch
of ui components into stories, but can't do that from getsentry.

So i'm thinking i can move things that don't depend on billing imports
into sentry and unblock stories.
New endpoint similar to the other supergroup ones to specifically fetch
supergroups by a list of group ids.

---------

Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: getsantry[bot] <66042841+getsantry[bot]@users.noreply.github.com>
)

Fix the performance score (wheel) widget layout in dashboards and make
the ring scale to fill its container.

We've had a complaint that the padding around the Score widget is
awkward. It's true! I was tinkering with this, and thought, why not take
this a step further and let the SVG scale with the widget? Kind of like
a Big Number! I also fixed some padding stuff and got rid of the caption
that said "last 7 days" altogether, none of our other widgets have that,
might as well toss it.

**Before:**
<img width="2672" height="1522" alt="Screenshot 2026-03-20 at 6 02
50 PM"
src="https://github.com/user-attachments/assets/51d29d60-86c2-4fd6-a5ae-40634a7dbde5"
/>

**After:**
<img width="2672" height="1522" alt="Screenshot 2026-03-20 at 6 04
20 PM"
src="https://github.com/user-attachments/assets/5848bc6b-e13b-4b9e-a96f-1411447b9884"
/>

Refs DAIN-1383
)

Colocate useScmProviders hook and its spec with the other SCM hooks in
the components subdirectory for consistency. Updates the import in
scmConnect.tsx.

This was PR feedback that was missed in
#110883 (comment)

Refs VDY-19
…#111354)

Temporarily renames the snapshot comparison metrics tag keys from
`org_id`, `project_id`, `app_id` to `temp_org_id`, `temp_project_id`,
`temp_app_id` in both the upload endpoint and the comparison task.

This is to investigate a metrics tagging issue where the current tag
names may be conflicting with reserved or existing tag keys in our
metrics pipeline. The `temp_` prefix isolates these tags to confirm
they're being recorded correctly.

This is a temporary change — once we verify the metrics are flowing
properly, we'll rename them back.
This adds the `tests/sentry/processing_errors` directory to our codeowners file, assigned to the issue detection team because the corresponding `src/sentry/processing_errors` directory is assigned that way. This should fix the codeowners check which is currently failing in all new PRs.
@pull pull bot locked and limited conversation to collaborators Mar 23, 2026
@pull pull bot added the ⤵️ pull label Mar 23, 2026
@pull pull bot merged commit 0207f7f into KingDEV95:master Mar 23, 2026
@github-actions github-actions bot added Scope: Frontend Automatically applied to PRs that change frontend components Scope: Backend Automatically applied to PRs that change backend components labels Mar 23, 2026
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

⤵️ pull Scope: Backend Automatically applied to PRs that change backend components Scope: Frontend Automatically applied to PRs that change frontend components

Projects

None yet

Development

Successfully merging this pull request may close these issues.