[pull] master from getsentry:master#1823
Merged
pull[bot] merged 20 commits intoKingDEV95:masterfrom Mar 25, 2026
Merged
Conversation
…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
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to subscribe to this conversation on GitHub.
Already have an account?
Sign in.
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
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 : )