Skip to content

[pull] master from getsentry:master#1823

Merged
pull[bot] merged 20 commits intoKingDEV95:masterfrom
getsentry:master
Mar 25, 2026
Merged

[pull] master from getsentry:master#1823
pull[bot] merged 20 commits intoKingDEV95:masterfrom
getsentry:master

Conversation

@pull
Copy link

@pull pull bot commented Mar 25, 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 20 commits March 25, 2026 10:10
…09366)

Migrates `static/app/views/settings/projectSecurityHeaders/csp.tsx` from
the legacy `JsonForm`/`Form` system to the new TanStack-based
`AutoSaveForm` component.

## What changed

- Replaced `<Form saveOnBlur> + <JsonForm>` with two `AutoSaveForm`
components inside a `FieldGroup`
- Boolean toggle (`sentry:csp_ignored_sources_defaults`) uses
`field.Layout.Row` + `field.Switch`
- Textarea (`sentry:csp_ignored_sources`) uses `field.Layout.Stack` +
`field.TextArea`
- `getData: data => ({options: data})` is now handled inline in the
`mutationFn` as `{options: data}`
- Mutation options use the `mutationOptions()` helper from
`@tanstack/react-query` for better type inference
- Added `onSuccess` callback to update the project query cache via
`setApiQueryData` so form reset after save reflects the saved values
- Wrapped the returned JSX in `<FormSearch
route="/settings/:orgId/projects/:projectId/security-headers/csp/">` so
the fields are discoverable via settings search
- Ran `extract-form-fields` to add both fields to
`generatedFieldRegistry.ts`

## What was intentionally kept

`static/app/data/forms/cspReports.tsx` is still present. It is
dynamically loaded by `formSource.tsx` via `require.context` for the
legacy settings search path. The `generatedFieldRegistry.ts` entries now
take precedence for the CSP route, so the fields appear correctly in
search either way. Once the legacy form search path is removed entirely,
`cspReports.tsx` can be deleted.

---------

Co-authored-by: Priscila Oliveira <priscila.oliveira@sentry.io>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Continues the migration away from Sentry's legacy `create_or_update`
helper toward Django's built-in `update_or_create`.

All three files removed from the allowlist in
`tests/sentry/test_no_create_or_update_usage.py`.

Return values were ignored at all sites, so no caller changes are
needed.

---------

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
…t dashboards (#111449)

Standardize and fix column aliases across prebuilt dashboards:

- **Percentile casing**: `p50()` / `P50()` / `P95()` → `P50`, `P75`,
`P95` (consistent with AI/MCP/Laravel dashboards)
- **Starred column**: Remove text header — the column renders as a star
icon and the word "Starred" wastes horizontal space
- **HTTP Method**: Fix `'Http Method'` → `t('HTTP Method')` (correct
casing + i18n wrapper)
- **Typo**: `'Requests per Minutes'` → `'Requests per Minute'` in
Frontend Assets Summary
- **Duration label**: `'Average Duration'` → `'Avg Duration'` in Mobile
Vitals App Starts (matches `DataTitles.avg`)
- **i18n**: Wrap bare string aliases in `t()` that were missing it

Refs DAIN-1293

---------

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

Breaks a circular import chain by moving the `ORDER` constant from
`performanceScoreChart.tsx` to the shared `types.tsx` module (where
`WebVitals` is already defined).

### The cycle

1. `withProject` → `projectContext`
2. `projectContext` → `thirds`
3. `thirds` → `primaryNavigationContext`
4. `primaryNavigationContext` → `navigationTour`
5. `navigationTour` → `explore/utils`
6. `explore/utils` → `discover/eventView`
7. `discover/eventView` → `discover/utils`
8. `discover/utils` → `convertWidgetToBuilderStateParams`
9. `convertWidgetToBuilderStateParams` → `useWidgetBuilderState`
10. `useWidgetBuilderState` → `datasetConfig/base`
11. `datasetConfig/base` → `datasetConfig/spans`
12. `datasetConfig/spans` → `transformPerformanceScoreBreakdownSeries`
13. **`transformPerformanceScoreBreakdownSeries` →
`performanceScoreChart`** ← broken here
14. `performanceScoreChart` → `performanceScoreBreakdownChartWidget`
15. `performanceScoreBreakdownChartWidget` → `insightsTimeSeriesWidget`
16. `insightsTimeSeriesWidget` → `chartActionDropdown`
17. `chartActionDropdown` → `feature`
18. `feature` → `withProject` 🔄

fixes a loading issue on `sentry devserver`

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
When rendering forms inside of a guide step details it is cut-off.

Not sure if this was needed for something else?
Add infrastructure for driving pipelines via JSON APIs instead of the
legacy template/redirect-based dispatch flow. This is the first step
toward migrating integration setup pipelines to be driven by a React
frontend through structured API requests.

New types in pipeline/types.py:
- PipelineStepAction enum (ADVANCE, STAY, ERROR, COMPLETE)
- PipelineStepResult dataclass with factory methods for each action

New ApiPipelineEndpoint protocol in pipeline/views/base.py, replacing
the legacy PipelineView dispatch() approach. Each step exposes
structured data via get_step_data() and accepts validated input via
handle_post(), with optional DRF serializer validation.

New methods on the base Pipeline class:
- get_pipeline_api_steps() — returns API steps or None (opt-in)
- is_api_ready() — True when a pipeline provides any API steps
- get_current_step_info() — structured JSON for the current step
- api_advance() — validates input and processes the current step
- api_finish_pipeline() — called when all steps complete

The legacy PipelineView protocol is marked as deprecated with guidance
to implement ApiPipelineEndpoint for new steps. Existing views will be
migrated incrementally as each integration adopts API mode.

Fixes [VDY-33](https://linear.app/getsentry/issue/VDY-33)
…111448)

Update the metrics selector so that the selected option is always at the
top of the list. With the refactor to the new dropdown with this was not
happening as expected.

Refs LOGS-634

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Change the default aggregate function for trace metrics from
`per_second`/`p75` to `sum` for counter and distribution metric types.

This aligns the default visualization with what users most commonly want
to see when first exploring a metric — the total value rather than a
rate or percentile.

LOGS-635
…et titles (#111515)

Fix capitalization inconsistencies across all pre-built dashboard widget
titles (and some aliases).

Titles like "Api Latency" and "Http Method" were using incorrect casing
for acronyms, some titles used sentence case instead of title case,
prepositions were inconsistently capitalized, and "Avg."/"Avg" was used
instead of "Average". This PR standardizes all widget titles to use
proper title case with correct acronym capitalization.

Refs DAIN-1410

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

Replace hardcoded occurrence threshold of `10` with the
`AUTOFIX_AUTOMATION_OCCURRENCE_THRESHOLD` constant from
`seer/autofix/constants.py` across `post_process`, `issue_summary`, and
autofix task files.

This makes the threshold easier to find and update in one place.


Agent transcript:
https://claudescope.sentry.dev/share/Ds3urei5NiOArAv3zKTZQix_f66h60mux0NyITDbB5M
…value (#111514)

Fix the global filter selector trigger displaying "All" when a specific
value is saved but tag values fail to load.

**e.g.,**

<img width="267" height="195" alt="Screenshot 2026-03-24 at 11 03 59 PM"
src="https://github.com/user-attachments/assets/5e15e065-9e6c-482d-86a5-75c439f74841"
/>

Two bugs combined to cause this:

1. The trigger rendered `stagedFilterValues` (in-flight dropdown state)
instead of `activeFilterValues` (the committed filter). Before the
dropdown was opened, staged values were empty → "All".

2. `isAllSelected` compared against `options.length`. When tag values
failed to load, `options` only contained the already-selected values,
making the comparison a tautology. Now it simply checks for an empty
selection.

Refs DAIN-1407

---------

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

The X-axis selector for categorical bar charts was filtering to only
string-typed tags, excluding valid numeric tags like `run_id` and HTTP
status codes. This made it impossible to group by these tags directly in
the bar chart builder. I did this on purpose to prevent people from
using high-cardinality values as groups but I changed my mind, there are
a whole bunch of compelling reasons for people to do this (e.g., HTTP
response codes) and it's not wise to just forbid it! We should probably
allow boolean tags, too.

Users have to manually specify the limit of how many groups to plot, and
it's <25, so the worst case scenario is they make a very silly chart
with a high-cardinality X-axis like this:

<img width="582" height="421" alt="Screenshot 2026-03-24 at 5 34 38 PM"
src="https://github.com/user-attachments/assets/c995e1b4-1c02-4107-88c0-992bbfdee742"
/>

On the flip side, you can make exciting charts like this, grouping by
HTTP response code!

<img width="526" height="421" alt="Screenshot 2026-03-24 at 5 36 55 PM"
src="https://github.com/user-attachments/assets/1f0ca598-89b5-49f4-b441-0b412aee0bba"
/>

There was also a related bug where users could get numeric tags as the
X-axis by setting a groupBy in timeseries mode and then switching to
categorical bar — but the tag was then unselectable in the X-axis
dropdown.

Refs DAIN-1400

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

Adds a new **Integrations** section to the organization settings
sidebar, positioned between Organization and Developer Settings. This
groups integration-related items together and adds a quick-start page
for Sentry's MCP server and CLI.

**Navigation changes:**
- New "Integrations" section with: MCP & CLI, Integrations, Custom
Integrations
- "Integrations" removed from the Organization section
- "Custom Integrations" moved from Developer Settings
- "Applications" renamed to "OAuth Applications" in Developer Settings

**MCP & CLI page:**
- Copyable MCP connection string (`https://mcp.sentry.dev/mcp`)
- Org/project scoping example
- CLI install and auth commands as copyable inputs
- Links out to mcp.sentry.dev and cli.sentry.dev for full docs

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Add a keyboard shortcut (Cmd+B on macOS, Ctrl+B on Windows/Linux) to
toggle the secondary sidebar between expanded and collapsed states.

---------

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
Condenses links in the nav such that cursor actions passing through
multiple items no longer pass stack gap sections and cause a cursor
flicker while the visual spacing remains preserved.
Updates search input to use scraps input, adds leading search icon,
updates the placeholder text to hint at searching, removes the icon wrap
and centers the icon and text inside the content.

<img width="650" height="486" alt="CleanShot 2026-03-24 at 16 16 58"
src="https://github.com/user-attachments/assets/48a0855f-7726-44ec-b2f7-a2b88d375802"
/>

<img width="673" height="482" alt="CleanShot 2026-03-24 at 16 16 49"
src="https://github.com/user-attachments/assets/065c5747-c742-4177-9bd6-70cc4e9d7c57"
/>

Fixes DE-1029
…xt widgets (#111440)

when switching from text widget to big number widgets or table widgets
specifically, the visualize fields were not populated with the defaults.
I've adjusted the logic so that the default config populates the fields.
#111477)

Fix
[UniqueViolation](https://console.cloud.google.com/logs/query;query=SEARCH%2528%22%60seer.write_preferences%60%22%2529;cursorTimestamp=2026-03-24T17:00:22.428279294Z;startTime=2026-03-24T16:43:39.204Z;endTime=2026-03-24T17:13:31.381Z?referrer=search&hl=en&project=internal-sentry)
errors in `_write_preferences_to_sentry_db` caused by concurrent
requests for the same project. Add `select_for_update()` on the Project
rows at the top of the transaction to serialize concurrent writers.
…ests (#111497)

Remove unnecessary jest.mock calls for useLocation and usePageFilters
hooks in tests that don't rely on specific location or page filter state

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

Migrate the 3 remaining long-lived Kafka consumer `ThreadPoolExecutor`
instances (monitors, remote subscriptions, issues/occurrence) to
`ContextPropagatingThreadPoolExecutor` and re-enable the S016 lint rule.

These are the "low risk" instance-based executors that persist across
messages. Each `submit()` still captures context at call time, so each
message gets the correct context snapshot. Safe because the Arroyo
processing model processes batches sequentially per partition.

Also adds `# noqa: S016` to `testutils/pytest/fixtures.py` (test infra,
no tracing needed). `build/_integration_docs.py` is already excluded via
`per-file-ignores`.

With S016 now enforced, any future `from concurrent.futures import
ThreadPoolExecutor` will be caught by flake8.

Depends on #111460


Agent transcript:
https://claudescope.sentry.dev/share/wtQJhBibCle0b-7YblhDE_X19smx3uQBwtkhzwir9Fo
@pull pull bot locked and limited conversation to collaborators Mar 25, 2026
@pull pull bot added the ⤵️ pull label Mar 25, 2026
@pull pull bot merged commit 8bbe2ba into KingDEV95:master Mar 25, 2026
12 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 Mar 25, 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.