Skip to content

[pull] master from getsentry:master#1999

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

[pull] master from getsentry:master#1999
pull[bot] merged 17 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 : )

priscilawebdev and others added 17 commits May 26, 2026 12:44
## Summary

- Replace the emotion `styled` wrappers (`ToolTagsContainer`,
`ToggleButtonWrapper`, `ToggleButton`) in `toolTags.tsx` with `Flex` and
`Container` from `@sentry/scraps/layout`, moving the layout props onto
the JSX.
Apply a hard 10k row cap in DataExportEndpoint._parse_limit so every
request that is not from UI, is bounded regardless of dataset. Requests
with no limit or with limit > 10k are clamped to 10k.

Larger exports were both unreliable in practice ("broken and hammers
infrastructure") and unnecessary as a self-serve path: GDPR
data-portability requests are handled out-of-band via
sentry.io/contact/gdpr/.

### Callout:
1. This change silently clamps the limit to 10k and doesn't raise 400
error.
Adds `curly: 'error'` to the prettier config block in
`eslint.config.ts`.

Ran `pnpm fix:eslint` — no violations found across the codebase, so this
is a config-only change.

Co-authored-by: Ryan Albrecht <ryan.albrecht@sentry.io>

---
[View Session in
Sentry](https://sentry.sentry.io/traces/?project=4510944073809921&query=gen_ai.conversation.id%3A%22slack%3AC0B63QA6RGA%3A1779771176.631419%22)

---------

Co-authored-by: sentry-junior[bot] <264270552+sentry-junior[bot]@users.noreply.github.com>
Co-authored-by: Cursor Agent <cursoragent@cursor.com>
Co-authored-by: Ryan Albrecht <ryan@ryanalbrecht.ca>
## Summary

Make `_should_use_agent` in `GroupAutofixEndpoint` unconditionally
return `True` so the autofix endpoint always routes through the
agent-based (explorer) path, regardless of the `mode` query param or
feature flags. Drops the now-unused `features` import.


Agent transcript:
https://claudescope.sentry.dev/share/o7uBoZiDFmNh4_ZzyLNUB9epA8vaB4MXV2meWHZbUYw
oxfmt has TOML support and picks up `pyproject.toml`, which conflicts
with Python tooling (`prek`/`ruff`) that owns that file. `pnpm
fix:format` ends up reformatting it, then `prek` fights it back.

Adding `pyproject.toml` to `ignorePatterns` in `.oxfmtrc.json` keeps
them from stepping on each other.

Action taken on behalf of Ryan Albrecht.

---
[View Session in
Sentry](https://sentry.sentry.io/traces/?project=4510944073809921&query=gen_ai.conversation.id%3A%22slack%3AC8V02RHC7%3A1779803895.919769%22)

Co-authored-by: sentry-junior[bot] <264270552+sentry-junior[bot]@users.noreply.github.com>
Co-authored-by: Ryan Albrecht <ryan.albrecht@sentry.io>
…116173)

On each segment processed we call the `_create_models` function. This
writes the environment, release, release environment, and release
project environment models. It also calls the `record_latest_release`
and `record_release_received` functions which perform their own write
operations. These operations are executed once per project, release,
environment, distribution quad. Subsequent requests read the cache and
discard the result.

The consequence is a persistent [span
waterfall](https://sentry.sentry.io/explore/traces/trace/f2123ba223d341f29ef13bb556aa636c/?aggregateField=%7B%22groupBy%22%3A%22transaction%22%7D&aggregateField=%7B%22yAxes%22%3A%5B%22count%28span.duration%29%22%5D%7D&field=id&field=span.name&field=span.description&field=span.duration&field=transaction&field=timestamp&mode=samples&node=span-98672b0db30527e5&project=1&query=transaction%3Aspans.consumers.process_segments.process_segment&sort=-span.duration&source=traces&statsPeriod=24h&targetId=98672b0db30527e5&timestamp=1779692438)
repeated for every segment. Average processing time is [15
milliseconds](https://sentry.sentry.io/explore/traces/?aggregateField=%7B%22groupBy%22%3A%22transaction%22%7D&aggregateField=%7B%22yAxes%22%3A%5B%22avg%28span.duration%29%22%5D%7D&field=id&field=span.name&field=span.description&field=span.duration&field=transaction&field=timestamp&mode=samples&project=1&query=transaction%3Aspans.consumers.process_segments.process_segment%20span.name%3Aspans.consumers.process_segments.process_segment&sort=-span.duration&statsPeriod=24h)
and total span volume is measured in the
[billions](https://sentry.sentry.io/explore/traces/?aggregateField=%7B%22groupBy%22%3A%22span.op%22%7D&aggregateField=%7B%22yAxes%22%3A%5B%22count%28span.duration%29%22%5D%7D&field=id&field=span.name&field=span.description&field=span.duration&field=transaction&field=timestamp&field=span.op&mode=aggregate&project=1&query=transaction%3Aspans.consumers.process_segments.process_segment&sort=-timestamp&statsPeriod=24h)
which is mostly driven by these duplicate iops.

We can do better! Given a (project, environment, release, distribution)
quad we can record that it has been previously processed and skip future
processing. This saves up to 11 I/O operations per duplicate request.
However, there is a catch. Releases would like their `last_seen` value
updated once every 60 seconds. We record the event timestamp of the quad
and only update the release once the latest event's timestamp exceeds
the 60 second floor. The update of the release's last_seen value has
been optimized as well to skip certain operations which do not care
about the 60 second refresh interval.

Its understood that this section of the processing pipeline is very hot.
The design of the pull request is intentionally low impact. A cache is
lazily constructed on the first message processed. The memory usage of
the cache is bounded to 100 bytes * `max_size`. The cache is not
distributed to other processes or consumers through Redis (though a
tiered caching strategy is a desirable follow-up). This means we will
query Redis more than the theoretical minimum. Observation of the local
cache's cache hit ratio will inform us whether adding distributed
caching is worthwhile. Its absence means we are not making any
additional requests to Redis and this change can not decrease total
throughput.
## Summary

Add `process_profile_from_kafka` task for taskbroker's passthrough mode
(STREAM-882). This allows taskbroker to read directly from the
`ingest-profiles` Kafka topic and dispatch tasks without a separate
consumer.

- New task `process_profile_from_kafka` in
`ingest.profiling.passthrough` namespace
- Refactored shared logic into `_process_profile_message`
- ~Removed base64 encoding - tasks now accept bytes directly~ separate
pr
- Use Kafka headers for killswitch/sampled when available

## Dependencies

Depends on getsentry/taskbroker#623 for exposing Kafka headers to tasks.

## Test plan

- [x] Existing consumer tests pass
- [ ] Integration test with taskbroker passthrough mode

ref STREAM-882
## Summary
- Bumps the widget `description` validator from 255 → 350 chars to fit
the longest prebuilt widget description (271 chars, mobile vitals **App
Starts**) plus buffer.
- The 255 cap was a legacy artifact of the old
`CharField(max_length=255)`; the column is now `TextField`, so this is a
serializer-only change.

DAIN-1693
…16175)

Two small tweaks to the People section in issue details:

**`ParticipantList` wrapper.** The wrapper `<div>` around the avatar
trigger established an inline formatting context, which reserves
descender space below the inline-block `Button`. That made the trigger
element a few pixels taller than the visible avatars, pushing the
"participating" / "viewed" label below the visual center of the avatar
row. Swapping the wrapper to a `<Flex>` removes the inline formatting
context, so the trigger collapses to the Button's actual height and the
labels sit vertically centered with the avatars.

**Row spacing.** The participating and viewed rows were rendered as bare
siblings with no spacing between them. Wrapped them in a `Flex
direction="column"` with a gap so they get a bit of breathing room.
…116164)

## Summary

Follow-up to #116162. Now that `_should_use_agent` always returns
`True`, the legacy autofix code path is unreachable. This PR removes it.

- Drop the `_should_use_agent` routing method, `_post_legacy`,
`_get_legacy`, and `AutofixRequestSerializer`.
- Inline `_post_agent` / `_get_agent` into the now-single-caller `post`
/ `get` methods.
- Remove imports that were only used by the legacy path
(`trigger_legacy_autofix`, `get_autofix_state`, `Organization`,
`RepositoryProjectPathConfig`, `Repository`,
`get_sorted_code_mapping_configs`, `user_service`, `cache`).
- Delete the legacy and explorer-vs-legacy routing test classes;
simplify the remaining explorer tests to drop the no-longer-meaningful
`mode=explorer` URL param and feature-flag loops.

Net: 2 files changed, 173 insertions, 1306 deletions.


Agent transcript:
https://claudescope.sentry.dev/share/SqDAC8UBY8YUaDzBnlmada7CGxiZ8RuLvMQmcFxfks4
Switches the pipeline integration buttons from the label-swap / disabled
pattern (`Submitting...`, `Authorizing...`, `Installing...`) to the
`busy` prop on `Button`. The steady-state label stays visible, the
spinner overlay communicates progress, and consumers get
`aria-busy="true"` for assistive tech.

`form.SubmitButton` is updated to OR `busy` from props with its internal
`isSubmitting` state, matching how `disabled` is already merged. This
lets pipeline steps drive the busy state from `isAdvancing` while still
respecting normal form submission.

Excludes the GitHub Enterprise and Vercel backend pipelines, which are
still pending in unmerged PRs.
…iteTable (#115884)

Prior to this area of work, `LogsInfiniteTable` could use either a
_contained_ virtualizer (non-expanded mode) or _window_ virtualizer
(expanded mode). Now that we're always constrained to the page, I
suspect we can stick with just _contained_.

Trying this out, it seems to work effectively the same. Which I think
makes sense: that the table is now always constrained to a parent
element & size.

As a part of this, I also removed the `expanded` prop. All but one uses
of the table were using it, and it didn't do much else beyond changing
the `overscan` amount.

Closes LOGS-813.
…spatch (#115511)

Adds retry support for data forwarders, needed a bit of legwork to make
it safer.
- The existing path is not touched ** (except for the serialization of
SQS events, see comment)
- A rollout option will let us control the task output
- A set of new methods `get_task_payload` and `forward_event_from_task`
have been implemented on the forwarders.

Refs ISWF-2406

---------

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

Adds `kblayouts_iphone.dat` to
`FileIOMainThreadDetector.IGNORED_SUFFIXES` to suppress false File IO on
Main Thread issues from the plural `KBLayouts_iPhone.dat` keyboard cache
file used on newer iOS versions

fixes ID-1564

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

Replace the custom \`useFetchSequentialPages\` hook with TanStack
Query's built-in \`useInfiniteQuery\` + \`useFetchAllPages\` in
\`useReplayData\`. This removes a bespoke pagination abstraction whose
only consumer was replay data fetching, letting us rely on the standard
infinite query pattern the rest of the codebase already uses.

**Replay error pagination rewritten**

Both the extra-errors and platform-errors sequential fetches now use
\`useInfiniteQuery\` with \`useFetchAllPages\` to auto-paginate. The
query options are declared inline via \`apiOptions.asInfinite()\`
instead of being generated by a callback factory, and the \`replayEnd\`
timestamp is memoized and shared between both queries.

**\`useFetchSequentialPages\` deleted**

The hook, its spec (228 lines), and its storybook file are removed. The
cross-reference in \`useFetchParallelPages\` is updated to point at the
new pattern.

---------

Co-authored-by: Claude Opus 4 <noreply@anthropic.com>
@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 58b055d into KingDEV95:master May 26, 2026
0 of 3 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.