Skip to content

[pull] master from getsentry:master#1820

Merged
pull[bot] merged 38 commits intoKingDEV95:masterfrom
getsentry:master
Mar 24, 2026
Merged

[pull] master from getsentry:master#1820
pull[bot] merged 38 commits intoKingDEV95:masterfrom
getsentry:master

Conversation

@pull
Copy link

@pull pull bot commented Mar 24, 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 : )

edwardgou-sentry and others added 30 commits March 24, 2026 11:59
…111377)

- Removes the initial dashboard generation prompt modal
- Adds `CreateFromSeerPrompt` component to handle initial prompt which
displays as a full screen page
Small cleanup for spans buffer:
- Removes `self._distributed_payload_keys_map` from `SpansBuffer` to
eliminate coupling between `_load_segment_data` and
`done_flush_segments`.
  - Removes `_apply_per_trace_limit` (unused)

Also adds RedisCluster to distributed tests.
…lta tests (#111372)

Rather than writing slightly different diff code in each test, we can
extract the diffing logic and share it.
There are open source things we could involve here, but it isn't hard to
do it ourselves, and by keeping it fairly tightly constrained it should
be easy to import something more sophisticated if necessary.

Note: this does include a serializer change to avoid a flagged diff
where there was a type difference, but it seemed small enough to not
merit a spin-off pr.
Implementation plan is now just plan and fix the issue is now start
analysis
Fixes this CSP violation on local dev and self-hosted:

<img width="1217" height="783" alt="image"
src="https://github.com/user-attachments/assets/cfa82e34-86f3-445f-be44-5bce818e4160"
/>
Implement the `SCM_PLATFORM_FEATURES` onboarding step -- the second step
in the SCM-first onboarding flow where users select a platform and
features after connecting their SCM.

## What it does

Two variants depending on whether the user connected their SCM in the
previous step:

**SCM connected:** Calls the platform detection API to identify
platforms from the repository. Detected platforms are rendered as
selectable cards with the first auto-selected. Falls through to manual
selection if detection returns no results.

**Skipped SCM:** Shows a searchable dropdown for manually picking from
100+ platforms. Base languages (JavaScript, Python, etc.) trigger a
framework suggestion modal.

Both variants share a feature selection card grid. Error Monitoring is
always on. Available features are filtered by
`platformProductAvailability` and gated by the user's plan via
`getDisabledProducts` (disabled features show a tooltip with the
reason). Profiling requires tracing -- enabling profiling auto-enables
tracing, disabling tracing auto-removes profiling. Gaming/console
platforms are blocked when not enabled for the org.

## How state flows

Platform and feature selections use derived state locally (e.g.
`selectedPlatform?.key ?? detectedPlatformKey`) and are persisted to
`OnboardingContext` in the Continue handler. Platform detection is
pre-warmed in `SCM_CONNECT` via React Query cache sharing.

## New files

- `useScmPlatformDetection.ts` -- hook wrapping the platform detection
API
- `scmFeatureSelectionCards.tsx` -- 2-column feature card grid with
heading and count
- `scmFeatureCard.tsx` -- individual feature card with icon, checkbox,
and tooltip
- `scmPlatformCard.tsx` -- detected platform card with platform icon and
name
- `scmCardButton.tsx` -- shared unstyled button primitive for card click
semantics
- `detectedPlatform.ts` (fixture) -- test fixture for detected platform
data

## Follow-up

[VDY-30](https://linear.app/getsentry/issue/VDY-30) -- sync feature
selections from context into SetupDocs URL params.

Refs VDY-23
Updates page frame mobile navigation to show the primary navigation we
use on desktop and moves the primary footer items onto the mobile top
navigation.

This got a bit hairy with the styling overrides, but is a consequence of
us toggling the styling between mobile and desktop styling at runtime.
That design hits its limitations once we start to introuduce more than
two variants, and I'm not happy. That said, I am ok with this idea
because the new nav won't require us to keep that distinction (see
screenshots). Since the new primary and secondary navigation styles
match in desktop and mobile, it means that once this flag is released,
we will be able to simplify this to just the desktop navigation and the
top menu bar

<table>
<tr>
 <td>
<img width="2274" height="1726" alt="CleanShot 2026-03-23 at 21 16
40@2x"
src="https://github.com/user-attachments/assets/56ef3b10-f87c-4969-9c06-135211e28f12"
/>

 <td>
<img width="1160" height="1728" alt="CleanShot 2026-03-23 at 21 16
53@2x"
src="https://github.com/user-attachments/assets/eae254ee-1083-40d5-803e-b7582d940421"
/>

 <td>
<tr>
 <td>
<img width="1404" height="640" alt="CleanShot 2026-03-23 at 21 17 25@2x"
src="https://github.com/user-attachments/assets/baccd449-b65f-4e64-bea8-82f749deeefe"
/>

 <td>
<img width="1402" height="1728" alt="CleanShot 2026-03-23 at 21 17
40@2x"
src="https://github.com/user-attachments/assets/a370cf2d-9a46-4d44-ac77-f21e6ef8778a"
/>

 <td>
<img width="2286" height="1726" alt="CleanShot 2026-03-23 at 21 17
54@2x"
src="https://github.com/user-attachments/assets/d8e06f42-760f-4ad1-84fb-0850e9dac1cd"
/>

</table>

---------

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
This flag is fully rolled out. Remove the flag registration, endpoint
feature gate, and simplify all gated code paths: breakpoint detection in
trends widgets and charts is now always enabled, dead filter conditions
and unused imports are removed.

<!-- Describe your PR here. -->

---------

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

Use the `scheduleMicroTask` pattern — already in use for `onEditWidget`
— to measure the duration between the edit dashboard button click and
the next re-render, emitting a `dashboards.dashboard.onEdit`
distribution metric.

Refs DAIN-1372

Co-authored-by: Claude Sonnet 4.6 <noreply@example.com>
…pan summary (#110739)

## Summary

- Creates `usePrebuiltDashboardUrl` hook in `dashboards/utils/` that
builds URLs for prebuilt dashboards with page filters (project,
environment, date range) and dashboard filters (release, global filters)
serialized as query params
- Updates `SpanSummaryLink` to link to prebuilt dashboards (instead of
module pages) when platformized insights is enabled, passing
`span.group` as a temporary global filter
- Adds `applyDashboardFilters` helper that auto-sets `isTemporary: true`
on all global filters

## Test plan

- [ ] With platformized insights enabled, click "View Summary" on a DB
span in the trace drawer — verify it navigates to the Backend Queries
Summary prebuilt dashboard with `span.group` and page filters in the URL
- [ ] Same for a resource span — verify it navigates to the Frontend
Assets Summary prebuilt dashboard
- [ ] With platformized insights disabled, verify "View Summary" still
falls back to the module summary route
- [ ] Verify `globalFilter` query param includes `isTemporary: true`

BROWSE-435

---------

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

This should hopefully be the last of the big default-to-named refactor
PRs. It covers all remaining `export default`s of static constructs:
i.e. classes, enums, functions, identifiers, interfaces, type aliases,
and variables. Dynamic ones such as call expressions (`export default
withApi(MyComponent)`) are not covered as they would take much more work
to automate with renames.

Because this one "only" had a few dozen removed `export default`s, I did
the touchups by hand. It was find-and-replaces, with some subsequent
cleanups caught by linting and/or type-checking.

In `static/app` excluding mocks, this reduces:

* `export default \w+`: from ~575 to ~535
* `import \w+ from`: from ~3.8k to ~3.4k

The lint rule changes are stacked on this PR in #111070.

Starts on ENG-7107
Same idea as #111039 for the
rest of the rpc dataclasses

merge only after successful deploy on
#111039 first
Noticing that app-backend is getting tagged for changes in miscellaneous
seer tasks (e.g.
https://github.com/getsentry/sentry/pull/111375/changes). Split
seer-related tasks into a separate folder, similar to the other tasks in
`src/sentry/tasks`.

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

When a numeric value is very small (less than 0.0001), the field
renderer and dashboard widgets were silently rounding it to 0 due to
fractional digit capping. This was misleading — e.g. the Jobs widget
could show "0 failed jobs" when the actual rate was tiny but nonzero.

**e.g.,**

<img width="396" height="88" alt="A"
src="https://github.com/user-attachments/assets/9a186af2-4a9a-4d89-b96b-a01a5dd321b8"
/>


Values below the minimum representable threshold now display as
`<0.0001` instead of `0`. A tooltip on hover shows the locale-formatted
actual value so users can still see the precise number if needed. This
is the pattern we also follow for other value types, like rates.

**e.g.,**
<img width="396" height="78" alt="Screenshot 2026-03-20 at 12 13 58 PM"
src="https://github.com/user-attachments/assets/f9d1a9c0-056a-4baf-bacc-4e1ba912a6fe"
/>

Longer term, when we come back and talk about how we want to format
numbers across the product, we'll come back to this decision. There's a
decent chance we'll be using scientific notation, for example.

Fixes DAIN-1378

---------

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

Add TRACE_METRIC_BYTE to DataCategory enums, DATA_CATEGORY_INFO with
bytes formatting, and gate visibility behind canUseMetricsStatsBytesUI
…111417)

Adds more descriptions to artifact schema for dashboard generation
- Adds an issue preview to the metric monitor form
- Refactors the issue preview component to use SimpleTable and thus look
more similar to the actual issue stream
- Add support for sending "assignee" to the issue preview
- Add a reusable issue preview section wrapper since should look the
same in most detector forms
…an (#111397)

## Summary

- Widens the `GroupBy.value` type in the timeseries widget types to
accept `number` and `boolean` in addition to the existing `string | null
| Array<...>` types
- Prepares the frontend for a backend change that will return real typed
values from the `events-timeseries` endpoint instead of always
stringifying groupBy values

All existing consumers already handle these types safely —
`toPythonString` normalizes bools/numbers, formatters have null/array
guards, and no direct `===` string comparisons exist against
`groupBy.value`.

Fixes BROWSE-468

---------

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

Extract `EAPSpansQueryBuilder` into a shared component and wire up
search/filtering in the Sample Events tab when using EAP mode. The spans
table now respects the search query from URL params, and non-applicable
controls (percentile filter, Open in Discover) are hidden in EAP mode.

Fixes BROWSE-463.

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
…ueries dashboard (#111433)

The "Queries by Time Spent" widget on the backend overview prebuilt
dashboard was filtering by `db.system:[postgresql,mysql,...]` while the
queries prebuilt dashboard used `span.category:db has:span.description`.
This mismatch meant users could see data on the queries dashboard but a
blank widget on the backend overview (or vice versa).

This extracts the shared filter into `queries/settings.ts`
(`BASE_FILTERS` / `BASE_FILTER_STRING`) and uses it consistently across
the queries dashboard, query summary dashboard, and backend overview.

Fixes DAIN-1398
Promotes CMD+K action to primary nav when page-frame is enabled and
replaces the help menu search when cmd+k supercharged flag is enabled

<img width="708" height="117" alt="CleanShot 2026-03-24 at 11 12 18"
src="https://github.com/user-attachments/assets/3c785256-8d94-4227-91ca-076ec6a333ee"
/>

<img width="147" height="186" alt="CleanShot 2026-03-24 at 11 12 13"
src="https://github.com/user-attachments/assets/8cf2f52e-6a4d-4ce1-a938-ce5668df7d54"
/>

Pending feature flag release, but this fixes DE-722

---------

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
+ Removing this span inside since it's not needed due to top level span.
…111438)

## Summary
- On the AI agents prebuilt dashboard, the trace ID in the traces table
now links directly to the trace view with the **AI Spans** tab selected,
instead of opening a drawer.
- Adds a `linkToTraceView` prop to `TracesTable` to support this
behavior while preserving the existing drawer behavior on the agents
insights page.

Fixes DAIN-1397

## Test plan
- [ ] Navigate to the AI agents prebuilt dashboard
- [ ] Click a trace ID in the traces table
- [ ] Verify it navigates to the trace view with the AI Spans tab active
- [ ] Navigate to the agents insights page and verify the trace ID still
opens the drawer
When there was no data, the confidence footer message would read "0 data
point" or "0 log", etc instead of "0 data points"

This PR changes it so when we look at the sample count, or normal count,
or total count, we include `0` in the criteria for displaying a plural
message.
…111241)

will be used to route org provisioning to the right cell from a locality
Some routes like /tags/ are rendered in the drawer for the new UI so can
be deleted completely. Other routes are still rendered in the main
content but reference useHasStreamlinedUI.
…ports (#111070)

Backing lint rule change for #111065. It covers all remaining `export
default`s of static constructs: i.e. classes, enums, functions,
identifiers, interfaces, type aliases, and variables. Dynamic ones such
as call expressions (`export default withApi(MyComponent)`) are not
covered as they would take much more work to automate with renames.

Fixes ENG-7107.
JonasBa and others added 8 commits March 24, 2026 13:05
Mobile navigation changes should not affect user's desktop preferences.
This PR mitigates this by wrapping the secondary navigation using
in-memory expanded/collapsed state as opposed to reusing the desktops
localStorage persisted state

---------

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-authored-by: Claude Sonnet 4 <noreply@example.com>
New stack trace component (non-native):
- no longer uses a mix of emotion and global styles
- [stories for many of the complex
states](https://sentry-9kfjix4ca.sentry.dev/stories/product/components/stacktrace/stacktrace/)
- A few contexts instead of prop drilling
- Frame content does not render until opened, speeding up issue details
render speed on large 100+ frame stack traces.
- The regular opportunities that show up when re-writting, like using
our <Grid> <Flex> components
- Styles are no longer shared with native frames which has made them
historically difficult to touch, since you had to look at the variations
of regular errors and native errors.

Components are now broken into IssueStackTrace and StackTrace. **All
fetch requests** happen in IssueStackTrace and StackTrace components are
somewhat designed to be compostable. It got tricky in there.
Add launchpad topics to sentry's Topic enum so we can use it.

Requires getsentry/getsentry#19642
Requires getsentry/sentry-kafka-schemas#477
…ule (#111451)

Add a `ThreadPoolExecutor` subclass that automatically propagates
`contextvars.Context` to worker threads via
`copy_context()`/`ctx.run()`. This ensures Sentry SDK scopes,
OpenTelemetry trace context, and any other context variables are
available in worker threads without manual scope passing.

Python's `ThreadPoolExecutor` doesn't propagate `contextvars.Context` to
worker threads. Since Sentry SDK v2 stores scopes in contextvars,
threads silently lose tracing context. Currently only 2-3 files
(snuba.py, snuba_rpc.py) manually propagate scopes — ~25 other
`ThreadPoolExecutor` usages have no context propagation at all. This is
the same pattern already proven in production in [Seer's
`ContextAwareThreadPoolExecutor`](https://github.com/getsentry/seer/blob/main/src/seer/automation/codebase/scm_api_metrics.py).

Also adds flake8 rule **S016** to ban direct `from concurrent.futures
import ThreadPoolExecutor` imports, directing developers to use the new
wrapper instead. This prevents future regressions.

Follow-up PRs will:
1. Migrate all existing `ThreadPoolExecutor` usages to the wrapper
2. Remove the manual scope-passing boilerplate in snuba.py and
snuba_rpc.py


Agent transcript:
https://claudescope.sentry.dev/share/F2CIltqVwgfmTBY5XDunaFCE5-miOvy8NQSltE-F-ZI
Moves seer under page frame.

<img width="1189" height="132" alt="CleanShot 2026-03-24 at 13 37 48"
src="https://github.com/user-attachments/assets/ef9cc893-490e-4e81-91f5-3a2d8e91b6af"
/>

---------

Co-authored-by: Claude Sonnet 4 <noreply@example.com>
@pull pull bot locked and limited conversation to collaborators Mar 24, 2026
@pull pull bot added the ⤵️ pull label Mar 24, 2026
@pull pull bot merged commit 4045a02 into KingDEV95:master Mar 24, 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 24, 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.