Skip to content

[pull] master from getsentry:master#1836

Merged
pull[bot] merged 57 commits into
KingDEV95:masterfrom
getsentry:master
Mar 30, 2026
Merged

[pull] master from getsentry:master#1836
pull[bot] merged 57 commits into
KingDEV95:masterfrom
getsentry:master

Conversation

@pull
Copy link
Copy Markdown

@pull pull Bot commented Mar 30, 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 : )

JonasBa and others added 30 commits March 30, 2026 08:59
Add feedback button to page frame component and place it to the right of
Ask Seer

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

Before it was really hard to scan the list of repos at a page like
`/settings/integrations/github/?tab=configurations`

the "enabled" and "disabled" labels look basically the same. Now we've
removed some bespoke elements, and make it easier to scan the list:

| List size | Before | After |
| --- | --- | --- |
| Short list | <img width="987" height="170" alt="SCR-20260327-okra"
src="https://github.com/user-attachments/assets/33235a6d-0955-4943-8c99-c9be32b6d768"
/> | <img width="977" height="160" alt="SCR-20260327-oknu"
src="https://github.com/user-attachments/assets/189baed1-a7e4-44e6-8b3a-3c864168307a"
/>
| longer | <img width="1167" height="583" alt="SCR-20260327-olag"
src="https://github.com/user-attachments/assets/b15ba1b8-5944-4429-9b45-c036d414ad2d"
/> | <img width="1174" height="581" alt="SCR-20260327-okmi"
src="https://github.com/user-attachments/assets/535b13d4-12e9-4b73-b187-1ef2edf53a7a"
/>

---

I also brought this over to the newer `/settings/repos/` page. Before we
didn't show status at all, and the link to github could be broken
because the integration on the remote side is disabled or deleted
already.
Now we replace the `0/0 repos` count and link to github with the status
label.

| Before | After |
| --- | --- |
| <img width="1148" height="207" alt="SCR-20260327-nuaj"
src="https://github.com/user-attachments/assets/a716235d-a4ca-48fe-9edf-9d913dbcee0c"
/> | <img width="993" height="186" alt="SCR-20260327-ojky"
src="https://github.com/user-attachments/assets/5bc6ed37-2afa-47ed-83c0-42858a2ee372"
/>
…ble (#111790)

Add `tableWidths` to the backend overview transactions table widget to
prevent column overflow.

Before
<img width="1424" height="288" alt="image"
src="https://github.com/user-attachments/assets/1bc1ae9c-a8d0-46d8-8231-358565f438ae"
/>

After
<img width="1407" height="263" alt="image"
src="https://github.com/user-attachments/assets/a2cf8284-f988-4e89-b462-3a079cc9904b"
/>


Refs BROWSE-475
…roup by selected (#111513)

Display the selected metric name as a left-aligned column in the
aggregates table when no group bys are selected.

Refs LOGS-630

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
The snapshot sidebar label fallback chain was `group → image_file_name`,
which meant `display_name` was never shown even when set. This updates
all three label sites to prefer `display_name` first: `display_name →
group → image_file_name`.

Grouping logic (`getImageGroup`) is unchanged — only the displayed label
is affected.

Before:
<img width="1016" height="911" alt="Screenshot 2026-03-30 at 11 09 02"
src="https://github.com/user-attachments/assets/35c5d152-6dab-4199-b455-46e8797ab3be"
/>

After:
<img width="1156" height="1144" alt="Screenshot 2026-03-30 at 10 59 49"
src="https://github.com/user-attachments/assets/470f4d0e-0d3f-4d7f-aa82-2e73fa550310"
/>

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Update the metrics explore tab when the UI refresh flag is enabled:

- Replace the eye icon toggle in the metric toolbar with a letter label
that swaps to a closed eye icon when hidden, matching the pattern used
in the spans tab
- Remove the Samples and Aggregates tabs from the metric panel when
hidden

---------

Co-authored-by: Claude Opus 4.6 <noreply@example.com>
…board configs (#111788)

## Summary
- Add `settings.ts` files to `ai/`, `mobileVitals/`, and `webVitals/`
prebuilt dashboard config folders that were missing them
- Consolidate `queries/constants.ts` into `queries/settings.ts` so
titles and constants live in one place
- All dashboard titles are now centralized in settings files with proper
`t()` i18n wrapping (previously AI and webVitals titles were plain
strings)
- Updated 15 config files to import their dashboard titles from the new
settings files

## Test plan
- [ ] Verify prebuilt dashboards still render correctly with their
expected titles
- [ ] Confirm no regressions in dashboard creation flow

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
… access list (#111667)

Seer Explorer chat endpoints are gated by a list of flags and passes if
at least one is fulfilled. Adds `dashboards-ai-generate` to the list of
flags.
#111676)

Tiny update, renders a placeholder for each chart instead of one big one
which doesn't always match the correct size.
…11755)

Replaces sequential `session.get()` calls in `compare_snapshots` with a
`ContextPropagatingThreadPoolExecutor` (8 workers) that prefetches all
unique
content hashes for each pixel batch concurrently. A per-batch `dict`
cache
keyed by content hash deduplicates fetches — if the same blob appears as
`head_hash` for one pair and `base_hash` for another, it's only
downloaded
once.

Previously, each image pair fetched its head and base images
sequentially,
with no dedup across pairs. For a batch of 50 pairs sharing some hashes,
this could mean 100 individual blocking HTTP round-trips when only ~70
unique hashes exist.

The objectstore `Session.get()` is thread-safe (no mutable instance
state,
urllib3 pool handles concurrency internally), so no changes to the
objectstore client are needed.

Closes EME-828

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Adds a CLI command for quickly creating new organizations with a desired
slug and owning user
…#111791)

There's a state for metric widgets and release health widgets where if
you have multiple y-axes selected, then switch to a big number widget,
we don't trim off the y-axes that are selected, instead we just render
them with a radio button. This is meant for datasets that support
equations, but at the moment a user can get "stuck" in the big number
widget flow since this delete button is hidden. I figured we should just
show it if there are more than 1 fields, even if equations aren't
supported.

One day we should fix how big numbers are stored if there are multiply
y-axes, but this just patches the behaviour so we can release
multi-metric selection because I imagine it'll raise feedback.
…flow (#111738)

This PR addresses a `KeyError: 'oa2'` that occurred in the
`/oauth/authorize/` endpoint when an unauthenticated user attempted to
log in during an OAuth authorization flow.

**Root Cause:**
The `_logged_out_post` method in `oauth_authorize.py` calls
`request.session.cycle_key()` to prevent session fixation attacks.
However, `cycle_key()` regenerates the session ID and, in doing so, was
inadvertently clearing the OAuth payload stored under
`request.session["oa2"]`. Consequently, when the code attempted to
access `request.session["oa2"]["uid"]` immediately after `cycle_key()`,
it resulted in a `KeyError`.

**Solution:**
The fix involves preserving the `oa2` payload across the `cycle_key()`
operation. Before `request.session.cycle_key()` is called, the existing
`request.session["oa2"]` data is retrieved and stored in a temporary
variable. After `cycle_key()` has regenerated the session, this saved
payload is restored to the new session, and the `uid` is updated with
the authenticated user's ID. Finally, `request.session.modified` is set
to `True` to ensure the changes are persisted.

This approach maintains the security benefits of `cycle_key()` while
ensuring the necessary OAuth context is not lost during the login
process.

<!--

  Sentry employees and contractors can delete or ignore the following.

-->

### Legal Boilerplate

Look, I get it. The entity doing business as "Sentry" was incorporated
in the State of Delaware in 2015 as Functional Software, Inc. and is
gonna need some rights from me in order to utilize my contributions in
this here PR. So here's the deal: I retain all rights, title and
interest in and to my contributions, and by keeping this boilerplate
intact I confirm that Sentry can use, modify, copy, and redistribute my
contributions, under Sentry's choice of terms.

Co-authored-by: sentry[bot] <39604003+sentry[bot]@users.noreply.github.com>
Co-authored-by: michelletran-sentry <167130096+michelletran-sentry@users.noreply.github.com>
…ERS associations (#111693)

Attempting to fix task timeouts in
https://sentry.sentry.io/issues/6731345393?project=1 &
https://sentry.sentry.io/issues/6869524816?project=1.

Replaces O(n^2) `reduce(or_, [Q(external_name__iexact=...) ...])` query
construction with a single `Lower()` + `__in` query, and deduplicates
names prior to querying. Batches per-user access checks (3 queries per
user -> 3 queries total) and per-team access checks (1 query per team ->
1 query total).

Adds tests to verify correct behavior with case-insensitive matching &
handling of duplicate users/teams.
…1268)

WorkflowFireHistory doesn't have any children, so we can do simple
query-based deletion.
It has an index on date_added now, so this should be relatively
efficient. 10k at a time might not be enough to make a dent, but we can
run a one-time cleanup to help if we wish.

It isn't yet listed explicitly in the task config, so this is a no-op.
…ion (#111663)

Instead of updating the timestamp when the job is triggered, wait until
the completion webhook fires. This ensured that it only updates when we
know there is at least a root cause.
The goal of this PR is to validate the filter keys on any trace item
based search query builder. To do this we've introduced a new API
endpoint that accepts in a list of attributes and checks to see if they
exist and are valid.

We trigger this with a useQuery that runs on mount, and whenever the
user modifies the query. We also have guards in place to ignore running
the validation if the user is just modifying the filter values as those
don't need to be validated, reducing the amount of calls we make.

Validation is currently gated behind this flag:
#111752

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
…f monitors (#111482)

Change size analysis diff monitors to use sequential (n-1) comparisons
instead of git-based (merge-base) comparisons. When a new build arrives,
each diff-threshold monitor (`absolute_diff`, `relative_diff`) now
resolves its base by finding the most recent prior artifact matching the
detector's query filters and structural identity (`app_id`,
`artifact_type`, `build_configuration`), ordered by `date_added`.

Previously, monitors were evaluated inside the git-based comparison path
(`_run_size_analysis_comparison` → `maybe_emit_issues`), which meant:
- Artifacts without git metadata (no `commit_comparison`) never
triggered monitors
- All diff detectors shared a single git-derived base, even if they had
different query filters
- Monitor evaluation was coupled to the status check comparison flow

Now the two paths are independent:
- **Git path** — persists `PreprodArtifactSizeComparison` records and
triggers status checks. No longer evaluates monitors.
- **Sequential path** — `maybe_emit_issues_from_diff_size_results` runs
unconditionally after the git block (even without git metadata). Each
detector resolves its own base via `get_sequential_base_artifact`, with
batch optimization (one DB lookup per unique query string across
detectors).

`absolute` threshold monitors are unaffected — they're already handled
separately by `maybe_emit_issues_from_absolute_size_results`.

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Shows an inline hint below the issue detection selector when Absolute
Diff or Relative Diff is chosen, clarifying that comparisons use the
previous build matching the monitor's filters, `platform`,
`package_name`, and `build_configuration`.

Uses `IconInfo` + `Text` + `InlineCode` for a lightweight presentation
that doesn't compete with the form controls.

<img width="2460" height="710" alt="CleanShot 2026-03-26 at 16 30 53@2x"
src="https://github.com/user-attachments/assets/e0e7ce7a-1421-4d51-89b5-9d56168fa65d"
/>

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

<img width="2524" height="472" alt="CleanShot 2026-03-30 at 10 09 42@2x"
src="https://github.com/user-attachments/assets/e8a961a1-dad7-49bb-a105-35a8ee627461"
/>


adds the UI into
http://127.0.0.1:8000/settings/sentry/projects/launchpad-test-ios/mobile-builds/
for enabling/disabling status checks for snapshots as well as two extra
checks
… flag (#111518)

Hide the unsortable telemetry columns (Logs, Spans, Errors) from the
trace metrics samples table when `canUseMetricsUIRefresh` is enabled.

This is the first step in some changes to the samples table as part of
the metrics UI refresh.

Refs LOGS-631

---------

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

We want to avoid querying in 'serialize', as it's almost always more
efficient to do it in batches in get_attrs.
Now that clear_cell_cache is deployed everywhere, switch the outbox
handler for SENTRY_APP_UPDATE to dispatch clear_cell_cache instead of
clear_region_cache.
note: this is behind a feature flag for safety, the default is unchanged
(no multi-cell) and merging the code should be a no-op
Also adds TODO comments and details about the user endpoints that need
to be changed:
- UserRegions should be deprecated
- UserOrganizationsEndpoint needs to move to control
Removing the sticky column on the metrics aggregates table as now users
can select multiple aggregates so having that column be sticky isn't the
best UX anymore.

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Zylphrex and others added 25 commits March 30, 2026 14:33
When creating PRs, we should allow passing a specific repo that we want
to create PRs for.
Fixes to the new stack trace component's frame header and tooltip
behavior to match the old component.

- Show full absPath URL for third-party JS frames from different domains
instead of just the relative filename
- Suppress `:0` line/column numbers that native platforms use to
indicate missing source info
- Open the "leaving Sentry" confirmation modal when clicking external
URLs in the tooltip instead of navigating directly
- Improved tests: replaced test-id selectors with
`getByText`/`getByLabelText`/aria-labels, added fake timers for tooltip
tests, added typed mock responses, and added coverage for Java module
priority and third-party frame display

displays the full url instead of path for some minified cases again

<img width="864" height="137" alt="image"
src="https://github.com/user-attachments/assets/8df81300-1e08-4660-b2c3-0fbeb9527eed"
/>

rename "File" to "Absolute Path"

<img width="856" height="185" alt="image"
src="https://github.com/user-attachments/assets/678eb655-a2f6-40e1-9bf0-b6d9f07f5b35"
/>
The shared/public issue view (`/share/issue/:id`) used generic event
components that were designed for the full issue details page. These
components carried dead code paths, rendered sections for data the
backend never sends, and pulled in heavy dependencies like the issue
details context.

This PR co-locates the rendering logic with the shared view, only
renders what `SharedEventSerializer` actually provides, and aligns the
`SharedViewOrganization` type with the backend response.

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Adds a new CLI command to create projects, attached to the given
organization
Commands run:
```
# Add return types to test methods within classes
rg -ls 'def test.*\(self\):' tests/sentry | xargs sed -E -i '' -e 's/def test(.*)\(self\):/def test\1\(self\) -> None:/'

# Add return types to setup methods within classes
rg -l 'def setUp\(self\):' tests/sentry | xargs sed -i '' -E -e 's/def setUp\(self\):/def setUp(self) -> None:/'

# Add return types to toplevel test functions
rg -ls 'def test.*\(\):' tests/sentry | xargs sed -E -i '' -e 's/def test(.*)\(\):/def test\1\(\) -> None:/'

# Type check, only minor errors (addressed in separate commit)
mypy
```
<!-- Describe your PR here. -->

<!--

  Sentry employees and contractors can delete or ignore the following.

-->

### Legal Boilerplate

Look, I get it. The entity doing business as "Sentry" was incorporated
in the State of Delaware in 2015 as Functional Software, Inc. and is
gonna need some rights from me in order to utilize my contributions in
this here PR. So here's the deal: I retain all rights, title and
interest in and to my contributions, and by keeping this boilerplate
intact I confirm that Sentry can use, modify, copy, and redistribute my
contributions, under Sentry's choice of terms.
…ter params (#111800)

When the URL contained any dashboard filter key (e.g. `release=`),
`getDashboardFiltersFromURL(location)` returned a non-null object
containing only that key. The nullish coalescing (`??`) pattern then
skipped `dashboard.filters` entirely, dropping any saved global filters
that weren't in the URL.

For example, navigating to
`/dashboard/1859247/?project=11276&release=&statsPeriod=90d` would cause
the `release=` param to make `getDashboardFiltersFromURL` return
`{release: [""]}` — non-null — so the `??` never fell back to
`dashboard.filters` which held the saved `globalFilter` entries.

Added a `getMergedDashboardFilters(savedFilters, location)` utility that
spreads saved filters as a baseline and lets URL filters override
per-key. Replaced all 5 call sites that used the old `??` pattern.

Fixes DAIN-1435

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
This PR just adds a feature flag gated nav item for Errors and registers
the new explore routes!

there's nothing much to see here but if you're curious:

<img width="834" height="611" alt="image"
src="https://github.com/user-attachments/assets/b217b5e8-6d72-4e5d-8f0a-fb3da8bcad06"
/>
…atus_check task (#111798)

Add a Snapshots - Status Checks settings panel to the preprod project
settings page with three toggles: enabled, fail on added, and fail on
removed. Wire up these project options in the backend so the snapshot
status check task respects them.

related PR: #111794

Closes EME-911
…111719)

Eagerly fetches supergroup assignments in the issue list overview to
block the stream from rendering until grouping data is available,
preventing pop-in. Supergroup rows now show aggregated stats (last seen,
age, trend chart, events, users) from member groups and align to the
same column grid as regular issue rows.

Removes the previous experiment.

---------

Co-authored-by: Charlie Luo <cvxluo@gmail.com>
…111529)

## Summary

Visual polish and analytics for the SCM platform features step (step 2
of 3), aligning with Figma and following patterns from VDY-22.

**Layout**: Use ScmStepHeader/ScmStepFooter, LayoutGroup for smooth
transitions between detected and manual picker sections.

**Platform cards**: Larger icons (28px), equal-width grid, skeleton
loading state, "skip detection" bail-out during slow detection, error
fallback to manual picker.

**Feature cards**: Match Figma sizing (padding, gaps, font sizes), 3px
bottom border on unselected cards, equal-height rows, centered heading
with grid areas.

**Manual picker**: Replace CompactSelect with Select + virtualized
MenuList (react-select re-renders all options on hover, causing lag with
130+ platform icons).

**Analytics**: Step viewed, platform selected (detected vs manual),
feature toggled, change platform clicked, continue with
platform/features params.

**Shared components**: Extract ScmSearchControl (was duplicated) and
ScmVirtualizedMenuList (stopgap until a Combobox scraps component
exists).

Closes VDY-24

## Figma

- [Recommendations
state](https://www.figma.com/design/bPNQPnm9R5Og1mTbAbdauL/Value-Discovery-%F0%9F%94%AD?node-id=265-4756&m=dev&focus-id=480-2309)
- [Manual
state](https://www.figma.com/design/bPNQPnm9R5Og1mTbAbdauL/Value-Discovery-%F0%9F%94%AD?node-id=265-4756&m=dev&focus-id=503-4206)

## Test plan

- [ ] 15 unit tests passing (4 new analytics, 1 error fallback)
- [ ] Visual: both Figma variants match (recommendations + manual)
- [ ] Analytics events fire correctly in browser console
- [ ] Detection error falls back to manual picker
- [ ] Slow detection shows loading indicator with skip link
This passes the phrase FIXES PROJ-123 so the created PR is linked back
to the issue.
…ation (#111758)

we have fully migrated to cell_name on the wire now
- the feedback buttons seem to have grown, re-align them
- remove check for hasStreamline since that feature is now always
enabled
- Remove the `commitRow` render prop — every call site passed the same
`CommitRow` component
- Reflect the actual API shape of committers w/ `group_owner_id`

before

<img width="735" height="122" alt="image"
src="https://github.com/user-attachments/assets/ffb873b2-d599-44af-a5ac-3247f5700754"
/>

after - the feedback is slightly further from the next line of text

<img width="726" height="131" alt="image"
src="https://github.com/user-attachments/assets/42cab07a-cec6-4ccc-8f7c-6ab8fcee403f"
/>

how they looked when they were added
#99056

---------

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

Fix repo selection in the SCM onboarding connect step to handle the race
with the background `link_all_repos` task.

After a GitHub integration is installed, `link_all_repos` runs async and
registers all repos. The old approach cached existing repos on mount and
checked that cache before deciding to POST. This broke because the cache
was often stale (task still running) and the repos endpoint is paginated
(specific repo might not be on page 1).

New approach:
- GET first with a targeted query filtered by repo name (sidesteps
pagination)
- POST only if the repo doesn't exist yet

The old code also hid (soft-deleted) repo records when the user
deselected or switched repos. This made sense when repos were manually
registered one at a time, but with `link_all_repos` auto-registering
everything, hiding repos on deselect was counterproductive -- it removed
records the background task created, causing them to disappear from the
integration settings page. Repo selection is now just a context pointer
with no side effects on the repo records themselves.

Also switches to `queryClient.fetchQuery` + `fetchDataQuery` for the
imperative GET instead of deprecated `Client.requestPromise`.

Replaces #111699 (closed due to CODEOWNERS auto-review noise from base
change).
…ract action data (#111689)

The initial rendering logic was mostly ok, but had a couple of small
bugs which result in data rendering incorrectly for WFE alerts.

This updates the render code, example render data, and even query logic
to be closer to our current production alerting.
## Summary
- The `telemetry_live_search` tool formatter in Seer Explorer was
missing a case for the `metrics`/`tracemetrics` dataset, causing metrics
queries to display as "Queried spans" instead of "Queried metrics".

## Test plan
- [x] Open Seer Explorer and run a natural language query targeting
metrics (e.g. "Show me the count of all metrics in the last hour")
- [x] Verify the tool output label reads "Querying metrics" / "Queried
metrics" instead of "Queried spans"

---------

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

Tracks when a seer session returns a failed status on generating
dashboards, indicating upstream failure (not the same as invalid
dashboard).
## Summary
- Add "Metrics" to the list of supported search strategies in the
`SearchAgentStartSerializer` help text

Depends on #111587

## Test plan
- [x] Verify help text includes Metrics as a valid strategy option

---------

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…n WorkflowEngineActionSerializer (#111771)

The O(N) querying from MetricAlertRegistryHandler.target is a notable
performance problem.
This change allows for batching that should be much more efficient.
…or (#111760)

The API docs for creating a workflow don't list that you can pass in a
list of `detectorIds` to connect the workflow to because it uses a
separate `BulkWorkflowDetectorsValidator`. We have this same problem
with the create a detector API but this PR does not cover that. Outside
of hardcoding something in the endpoint description about it the
simplest way to achieve the goal of having all the possible options in
the docs was to do the bulk validation inside the `WorkflowValidator`,
so this PR moves the code into the main validator instead of having it
happen in 2 different places.
@pull pull Bot locked and limited conversation to collaborators Mar 30, 2026
@pull pull Bot added the ⤵️ pull label Mar 30, 2026
@pull pull Bot merged commit 3fc3baa into KingDEV95:master Mar 30, 2026
11 of 16 checks passed
@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 30, 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.