Skip to content

[pull] master from getsentry:master#2000

Merged
pull[bot] merged 61 commits into
KingDEV95:masterfrom
getsentry:master
May 26, 2026
Merged

[pull] master from getsentry:master#2000
pull[bot] merged 61 commits into
KingDEV95:masterfrom
getsentry:master

Conversation

@pull
Copy link
Copy Markdown

@pull pull Bot commented May 26, 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 : )

ryan953 and others added 30 commits May 26, 2026 08:56
…6112)

## Summary
- Inlined the abstract `PluginComponentBase` class directly into its
only two consumers: `PluginSettings` and `IssueActions`
- Both classes now extend `Component` directly with all base class logic
(state management, save/load lifecycle, `renderField`, API client)
copied in
- Deleted `static/app/plugins/pluginComponentBase.tsx`

## Test plan
- [x] TypeScript typecheck passes (`pnpm run typecheck`)
- [x] Existing plugin tests pass (`pluginConfig.spec.tsx`,
`pluginDetailedView.spec.tsx`)
- [x] ESLint passes

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Register `organizations:issue-stream-recommended-sort` as a temporary
feature
flag with `api_expose=True` so the frontend can check it.

This enables per-org enablement via FlagPole for the experimental
recommended
sort added in #111043. The flag will be used to gate showing
"Recommended" in
the issue stream sort dropdown for orgs that opt in.

No behavioral changes — just the flag registration.

fixes
https://linear.app/getsentry/issue/ID-1566/add-feature-flag-for-sort-option
…bject types (#116183)

`GroupSearchViewPermission.has_object_permission` returned `True` for
unrecognized object types (the fallback at the end of the method),
granting access by default. Changed the fallback to return `False` so
unknown object types are denied

Fixes ID-1562
…116184)

`GroupEventJsonView` checked org-level `event:read` scope via
`OrganizationView` but did not verify the user has access to the
resolved group's project. In orgs with closed membership (team-based
access), a user on team A could read raw event JSON (PII, stacktraces,
request bodies) from any project by guessing group IDs. Added
`request.access.has_project_access(group.project)` check after resolving
the group, returning 404 on denial (consistent with the existing
cross-org pattern)

Fixes ID-1563

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Refactors the `flush_segments` to be an orchestration function with unit
testable helpers:

- `_load_flush_candidates`: loading ready flush candidates from queue
shards
- `_acquire_locks_for_flush_candidates`: acquiring per-segment flush
locks
- `_load_segment_data`: loading payload keys and payload bytes
- `_build_flushed_segments`: building producer-ready `FlushedSegment`
objects
- `_record_segment_loss_metrics`: recording segment loss / expiration
metrics

Also adds/moves datamodels (`FlushCandidate`, `FlushedSegment`,
`OutputSpan`) into `buffer_types.py` alongside the existing span buffer
value types.
Add in org id to projects filter, and add a regression test.

Closes BROWSE-519

---------

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

This PR adds in a missing check in the `DiscoverSavedQueryVisitEndpoint`
endpoint.

Closes BROWSE-518

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
## Summary
- Fixes a bug where pasting text into the search bar and clicking "Ask
AI" would double the query text (e.g. "show me errors" → "show me errors
show me errors")
- Root cause: when the entire query is free text, the `initialSeerQuery`
builder filters it out, falls back to the unfiltered query, then appends
`inputValue` again
- Adds `!inputValue` guard to the fallback branch in 4 strategy wrappers
(Logs, Spans, Metrics, Discover Issues), matching the fix already
present in `issueList/issueListSeerComboBox.tsx`

Fixes AIML-2875

## Test plan
- [x] Existing `askSeerComboBox.spec.tsx` tests pass
- [x] Lint passes on all changed files
- [x] Manual: paste a natural language query into Logs/Spans/Metrics
search bar → click Ask AI → query text should appear once, not doubled
- [x] Manual: existing filter + pasted free text (e.g.
`browser.name:Firefox` + paste "show me errors") → Ask AI shows
`browser.name:Firefox show me errors`

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
If a user searches an issue short-id directly, we move them to the issue
details page. However, if the user inputted the short id + any filters,
we wouldn't match on that. Match short ids in those cases by scanning
every query parameter.

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

Adds `RECOMMENDED` to the `IssueSortOptions` enum with a "Recommended"
label and tooltip. The option **only appears** in the sort dropdown when
`?sort=recommended` is already in the URL query param.

before: 
<img width="249" height="57" alt="Screenshot 2026-05-26 at 10 51 20 AM"
src="https://github.com/user-attachments/assets/4f5a9f7f-c252-4090-8078-362ec6d2e0f6"
/>


after:
<img width="310" height="64" alt="Screenshot 2026-05-26 at 10 51 01 AM"
src="https://github.com/user-attachments/assets/63bb5152-7727-4c84-b478-a0e38e50c658"
/>

fixes
https://linear.app/getsentry/issue/ID-1567/fix-none-dropdown-for-sort
…116194)

fix STREAM-1041

Remove the profiles consumer from sentry devserver (that cannot be
supported, up to devinfra to make that happen with their own devservices
stuff), and introduce a new taskbroker + worker instance to replace it.

Taskbroker eventually will get a way to read from many topics, which
would eliminate these extra containers entirely.

Next steps are to roll this out to s4s2, then to prod, and finally
remove the ingest-profiles consumer from code.
Adds a cleanup task to evict `NotificationMessage` rows older than 90
days.
We were previously using the ingest-errors queue by mistake — switch to
post process
…115946)

This makes some clarifying changes to the `SafeRolloutComparator` utility, based on my experience getting oriented to using it. No behavioral changes.

- Rename the internal option-name-generation methods to make it clearer a) that "eval" means "run the experimental code" and b) what is being block- or allowlisted per callsite (either running the experiment or using the results of the experiment).
- Expand the example code in the docstring.
- Tweak docstrings and comments for various methods.
- Rename a few other variables.
- Remove TODOs about creating a dashboard, since that's been done.
- Consolidate imports.
- Create constants for option names in tests, just to cut down on verbosity.
)

While working on #116059, I
noticed that some of our API parameters are marked as UUID, when they
actually accept hex id values, so are technically non-comforming. Adjust
the OpenAPI spec to indicate this, and add a hint that these parameters
are hex ids.

I considered using a more holistic solution by making a new
`OpenAPIParameter`, but decided against it for now, since these cases
are rather limited. If we find that we keep needing to use this form of
hex parameter, we can reconsider

Co-authored-by: Claude <noreply@anthropic.com>
Remove the `AlertRuleSerializer` and `IncidentSerializer` (the actual
serializer serializers, as opposed to the validator serializers) as they
are no longer in use - only places they were "used" is for API responses
(they're unpublished) and a debug email view. A follow up will clean up
the responses e.g. `AlertRuleSerializerResponse` as there are many
imports and this PR is already large.
This endpoint change will address the feedback we've gotten that alert
triggers are more useful when sorted by recent triggers rather than
largest count.

Adds a `sort` query parameter to the group-history endpoint so that the
frontend can modify the sorts. This also changes the default sort to
`('-last_triggered', '-count')` rather than the current `('-count',
'-last_triggered')`.

This supports multiple sorts and ascending/descending, so the frontend
can implement sortable table headers.
Dev-only flag registered Oct 2025, never rolled out to customers. Remove the flag registration and the unreleased gated code paths.
Legacy seer orgs are not required to setup the github integration
Promotes GET /api/0/projects/{org}/{proj}/events/{event_id}/ from
EXPERIMENTAL to PUBLIC.

Removes the legacy api-docs/paths/events/project-event-details.json
since the spec is now generated from the endpoint code. There are some
differences in the serializer response vs the legacy code, most notably
some fields that appear on only error events are now marked as optional
(since they don't appear on transactions).

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

Switches:

* Route path: `explore/profiling/` to `explore/profiles/` with a
`<Redirect>`
* Page title: `Profiling` to `Profiles`

<table>
<thead>
<tr>
<th>Before</th>
<th>After</th>
</tr>
</thead>
<tbody>
<tr>
<td>
<img width="606" height="356" alt="image"
src="https://github.com/user-attachments/assets/60e16e5e-c8a0-432a-8ab4-dfefe75a7e3a"
/>
</td>
<td>
<img width="606" height="356" alt="image"
src="https://github.com/user-attachments/assets/6ac60ac1-2f0a-4d8c-abb1-78eaded8d221"
/>
</td>
</tr>
</tbody>
</table>

Note that user-facing docs like
https://docs.sentry.io/product/explore/profiling still say "Profiling".

Starts on EXP-955.

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

removes the `seer-slack-workflows` and `seer-slack-explorer` feature
flags, releasing both to everyone. all gating logic, flag registrations,
and related tests have been cleaned up.
…es (#116045)

+ Register /explore/replays/ and /explore/replays/:replaySlug/ in
STRUCTURED_CONTEXT_ROUTES so Seer receives structured JSON context
instead of an ASCII screenshot fallback on these pages.

+ The replay list page provides search query, sort order, date range,
and dead/rage click widget visibility. The replay detail page provides
replay metadata including user, browser, OS, duration, error and click
counts, environment, and platform.

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Rename `tools.mypy_helpers.sort_stronger_modules` to
`tools.mypy_helpers.sort_weaklist` so the module name matches the
pre-commit hook id (`sort-mypy-weaklist`) and the rest of the weaklist
tooling (`check_stronglist`, `prevent_weaklist_additions`).

**Backwards-compatible shim**

The old module path stays as a 4-line re-export so getsentry's
[`.pre-commit-config.yaml`](https://github.com/getsentry/getsentry/blob/master/.pre-commit-config.yaml),
which still calls `python3 -m tools.mypy_helpers.sort_stronger_modules`,
keeps working. A follow-up PR will delete the shim once getsentry has
been updated to call `sort_weaklist`.

Made with [Cursor](https://cursor.com)

Co-authored-by: Cursor <cursoragent@cursor.com>
…am (#116079)

Add per-batch and lifecycle logging to the streaming ZIP download
endpoint
to diagnose why 40K-image snapshot downloads fail with HTTP/2 stream
errors
after ~20-25 seconds.

The streaming generator currently has zero observability — the Django
span
closes in ~1s (before the generator runs), and when the stream dies
externally, nothing is logged. We need to see:

- How many batches/images are processed before the stream dies
- Whether there are long gaps between yielded chunks (idle timeout?)
- Fetch latency distribution from objectstore (slow reads?)
- Memory usage over time (OOM kill?)
- How the generator exits: completion, GeneratorExit (client/server
disconnect), or unhandled exception

Log points added:
- `stream_start` — confirms generator is running, PID, memory baseline
- `batch_complete` — per batch: duration, cumulative progress, max yield
gap, fetch latency p50/p99/max, RSS
- `stream_complete` — successful finish with totals
- `stream_error` — unhandled exception with traceback
- `stream_finally` — always fires with exit reason and final stats

This is temporary instrumentation to be removed once the root cause is
found.

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Co-authored-by: getsantry[bot] <66042841+getsantry[bot]@users.noreply.github.com>
This PR moves to using unique ids in `ToolbarVisualize`, when rending in
the DnD context. This PR also migrates handling of deletions to the
built in `deleteColumnAtIndex` function.

Closes EXP-960
cmanallen and others added 25 commits May 26, 2026 13:33
Remove the feature flag and checks. With this change all orgs will be
created via the control scoped endpoint.

Refs INFRENG-187
Pasting long text into the compact comment input in the sidebar
overflows the page horizontally, pushing the submit button off screen.

Also cleans up `mentionStyle` - removes the dead `streamlined` toggle
and `&singleLine` block, consolidates to one set of base styles with an
`inputStyle` override, and stops round-tripping through mentionStyle for
the preview pane CSS.

Fixes a zindex issue where the mention dropdown was behind buttons or
activity
… for clarity (#116203)

Using `elif` in place of `if` for clarity - no change in behavior.
…116219)

Same fix as #116216. When a
caller passes e.g. ?full=false, we get the string `false`, which is
truthy, so we always use the full event serializer rather than the
simple one. Apply the same fix as
#52452, by checking for the
strings "0" and "false" instead.

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

When a caller passes e.g. `?full=false`, we get the full string `false`,
which is truthy, so we always use the full event serializer rather than
the simple one. Apply the same fix as
#52452, by checking for the
strings "1" and "true" instead.

Set up for #116113

Co-authored-by: Claude <noreply@anthropic.com>
moves the general seer agent access check from
`SlackAgentEntrypoint.has_access` to `SeerAgentOperator.has_access`,
mirroring the existing autofix operator pattern. callers now pass
`entrypoint_key=SeerEntrypointKey.SLACK` so the operator gates on both
general and entrypoint-level access.
…gration setup (#114366)

Implement `get_pipeline_api_steps()` on
`GitHubEnterpriseIntegrationProvider` with three steps: installation
config (URL, app credentials, keys), app install redirect (popup-based
GitHub app installation with polling), and a late-bound OAuth step
constructed from the config step's data. Includes serializers for each
step and updates `build_integration()` to handle both legacy and API
state paths.

Ref
[VDY-40](https://linear.app/getsentry/issue/VDY-40/github-enterprise-api-driven-integration-setup)
Just a typo fix, i'll be using this flag for the new activity registry

Fixes SENTRY-5P40
Added a simple check for workflows from other orgs; they _shouldn't_ be
triggered, but the path to workflow lookup is a bit complex and we've
gotten this wrong in the wild.
Also fix existing test helpers so we don't depend on cross-org workflow
triggering in our existing tests.

Fixes ISWF-2691.
Part of codecov/core-engineering#100

This PR removes Codecov line coverage insights from Sentry issue stack
trace frames.
Unnecessary const, spinning off from my activity registry prototype
since it's unrelated to everything else
…nts (#116231)

Add public OpenAPI documentation (`drf-spectacular`) to 5 snapshot API
endpoints, promoting them from `EXPERIMENTAL` to `PUBLIC`.

These endpoints power the Sentry Snapshots feature (visual regression
testing for mobile apps) but were previously undocumented in the public
API spec. This change adds full `@extend_schema` decorators with
operation IDs, parameter descriptions, TypedDict response models, and
example responses so they appear in the generated OpenAPI spec.

**Endpoints documented (7 methods across 5 classes):**
- `GET /organizations/{org}/preprodartifacts/snapshots/{id}/` — Retrieve
snapshot details
- `DELETE /organizations/{org}/preprodartifacts/snapshots/{id}/` —
Delete a snapshot
- `POST /projects/{org}/{project}/preprodartifacts/snapshots/` — Upload
a snapshot
- `GET /organizations/{org}/preprodartifacts/snapshots/{id}/download/` —
Download images as ZIP
- `GET
/organizations/{org}/preprodartifacts/snapshots/{id}/images/{identifier}/`
— Image detail
- `GET /organizations/{org}/preprodartifacts/snapshots/latest-base/` —
Latest base snapshot

**Files changed:**
- **New**: `src/sentry/preprod/api/models/public/snapshots.py` — 11
TypedDict response models
- **Modified**: `src/sentry/apidocs/examples/preprod_examples.py` —
Example responses for all endpoints
- **Modified**: 4 endpoint files in
`src/sentry/preprod/api/endpoints/snapshots/` — `@extend_schema`
decorators, `publish_status` → `PUBLIC`, docstrings

No behavior changes — this is purely additive documentation metadata.

Co-authored-by: Claude <noreply@anthropic.com>
This model frequently blocks relocations for import/export differences,
and I'd like that to not happen anymore.

The `Email` model is populated by signals on create/delete operations to
`UserEmail` it _does not_ synchronize state on updates, and there are
several older user accounts that are missing records in `sentry_email`
that are present in `sentry_useremail` which cause relocations to fail.

By excluding this model from exports, these records won't participate in
the validation checks and can't cause diffs. When the relocation is
processed records will still be stored in `sentry_email` because of the
aformentioned signals.
…16113)

Preparation for publishing the group details endpoint. Specifies
optional fields that are collapsable / expandable on the endpoint and
creates `GroupDetailsResponse` to specify the full typed response, and
adds an example + additional OpenAPI parameters that will be used by
#116119

Co-authored-by: Claude <noreply@anthropic.com>
… from timeline (#116233)

Reverts #115749 to restore
`SEER_PR_CREATED` activity creation in the Seer operator pipeline (fed
by webhook events received into Sentry from Seer).

Hides `SEER_PR_CREATED` activities from the frontend activity timeline
on the issue details page - we continue to rely on
`SET_RESOLVED_IN_PULL_REQUEST` activities for the UI display instead (to
avoid duplicate "PR created" entries).
…ion setup (#114367)

Register GitHub Enterprise in the pipeline registry with three steps: an
installation config form (URL, app ID, OAuth credentials, private key,
webhook secret), a popup-based app install redirect step using
`useRedirectPopupStep`, and the shared `OAuthLoginStep` for final
authorization.

Ref
[VDY-40](https://linear.app/getsentry/issue/VDY-40/github-enterprise-api-driven-integration-setup)
Adds logs when adding a project to Vercel fails so we can see what's
going on.
…116242)

Add two global command palette actions for quickly switching between
environments while preserving the current path and search string.

- **Open in Production**: available on the local dev server (`NODE_ENV
=== 'development'`)
and Vercel preview deploys (`DEPLOY_PREVIEW_CONFIG`). Opens the current
page on
  `https://{org}.sentry.io`.
- **Open in Development**: available in production (`NODE_ENV ===
'production'`) for
  staff users (`user.isStaff`). Opens the current page on
  `https://{org}.dev.getsentry.net:7999`.

Both actions preserve the current pathname and search params — only the
origin changes.

---------

Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: Cursor Agent <cursoragent@cursor.com>
Co-authored-by: Jonas <JonasBa@users.noreply.github.com>
…)"

This reverts commit 91adf04.

Co-authored-by: markstory <24086+markstory@users.noreply.github.com>
- on tables the param wasn't being passed to the table_rpc
- on timeseries the debug wasn't being included in the response meta
…classes (#116243)

Fixing this `InvalidSearchQuery` error message for invalid device class
values.
@pull pull Bot locked and limited conversation to collaborators May 26, 2026
@pull pull Bot added the ⤵️ pull label May 26, 2026
@pull pull Bot merged commit 56ed755 into KingDEV95:master May 26, 2026
14 of 18 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 May 26, 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.