[pull] master from getsentry:master#1836
Merged
Merged
Conversation
Add feedback button to page frame component and place it to the right of Ask Seer Co-authored-by: Claude <noreply@anthropic.com>
…erly (#111764) Before it was really hard to scan the list of repos at a page like `/settings/integrations/github/?tab=configurations` the "enabled" and "disabled" labels look basically the same. Now we've removed some bespoke elements, and make it easier to scan the list: | List size | Before | After | | --- | --- | --- | | Short list | <img width="987" height="170" alt="SCR-20260327-okra" src="https://github.com/user-attachments/assets/33235a6d-0955-4943-8c99-c9be32b6d768" /> | <img width="977" height="160" alt="SCR-20260327-oknu" src="https://github.com/user-attachments/assets/189baed1-a7e4-44e6-8b3a-3c864168307a" /> | longer | <img width="1167" height="583" alt="SCR-20260327-olag" src="https://github.com/user-attachments/assets/b15ba1b8-5944-4429-9b45-c036d414ad2d" /> | <img width="1174" height="581" alt="SCR-20260327-okmi" src="https://github.com/user-attachments/assets/535b13d4-12e9-4b73-b187-1ef2edf53a7a" /> --- I also brought this over to the newer `/settings/repos/` page. Before we didn't show status at all, and the link to github could be broken because the integration on the remote side is disabled or deleted already. Now we replace the `0/0 repos` count and link to github with the status label. | Before | After | | --- | --- | | <img width="1148" height="207" alt="SCR-20260327-nuaj" src="https://github.com/user-attachments/assets/a716235d-a4ca-48fe-9edf-9d913dbcee0c" /> | <img width="993" height="186" alt="SCR-20260327-ojky" src="https://github.com/user-attachments/assets/5bc6ed37-2afa-47ed-83c0-42858a2ee372" />
…ble (#111790) Add `tableWidths` to the backend overview transactions table widget to prevent column overflow. Before <img width="1424" height="288" alt="image" src="https://github.com/user-attachments/assets/1bc1ae9c-a8d0-46d8-8231-358565f438ae" /> After <img width="1407" height="263" alt="image" src="https://github.com/user-attachments/assets/a2cf8284-f988-4e89-b462-3a079cc9904b" /> Refs BROWSE-475
…roup by selected (#111513) Display the selected metric name as a left-aligned column in the aggregates table when no group bys are selected. Refs LOGS-630 --------- Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
The snapshot sidebar label fallback chain was `group → image_file_name`, which meant `display_name` was never shown even when set. This updates all three label sites to prefer `display_name` first: `display_name → group → image_file_name`. Grouping logic (`getImageGroup`) is unchanged — only the displayed label is affected. Before: <img width="1016" height="911" alt="Screenshot 2026-03-30 at 11 09 02" src="https://github.com/user-attachments/assets/35c5d152-6dab-4199-b455-46e8797ab3be" /> After: <img width="1156" height="1144" alt="Screenshot 2026-03-30 at 10 59 49" src="https://github.com/user-attachments/assets/470f4d0e-0d3f-4d7f-aa82-2e73fa550310" /> --------- Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Update the metrics explore tab when the UI refresh flag is enabled: - Replace the eye icon toggle in the metric toolbar with a letter label that swaps to a closed eye icon when hidden, matching the pattern used in the spans tab - Remove the Samples and Aggregates tabs from the metric panel when hidden --------- Co-authored-by: Claude Opus 4.6 <noreply@example.com>
…board configs (#111788) ## Summary - Add `settings.ts` files to `ai/`, `mobileVitals/`, and `webVitals/` prebuilt dashboard config folders that were missing them - Consolidate `queries/constants.ts` into `queries/settings.ts` so titles and constants live in one place - All dashboard titles are now centralized in settings files with proper `t()` i18n wrapping (previously AI and webVitals titles were plain strings) - Updated 15 config files to import their dashboard titles from the new settings files ## Test plan - [ ] Verify prebuilt dashboards still render correctly with their expected titles - [ ] Confirm no regressions in dashboard creation flow --------- Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
… access list (#111667) Seer Explorer chat endpoints are gated by a list of flags and passes if at least one is fulfilled. Adds `dashboards-ai-generate` to the list of flags.
#111676) Tiny update, renders a placeholder for each chart instead of one big one which doesn't always match the correct size.
…11755) Replaces sequential `session.get()` calls in `compare_snapshots` with a `ContextPropagatingThreadPoolExecutor` (8 workers) that prefetches all unique content hashes for each pixel batch concurrently. A per-batch `dict` cache keyed by content hash deduplicates fetches — if the same blob appears as `head_hash` for one pair and `base_hash` for another, it's only downloaded once. Previously, each image pair fetched its head and base images sequentially, with no dedup across pairs. For a batch of 50 pairs sharing some hashes, this could mean 100 individual blocking HTTP round-trips when only ~70 unique hashes exist. The objectstore `Session.get()` is thread-safe (no mutable instance state, urllib3 pool handles concurrency internally), so no changes to the objectstore client are needed. Closes EME-828 --------- Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Adds a CLI command for quickly creating new organizations with a desired slug and owning user
…#111791) There's a state for metric widgets and release health widgets where if you have multiple y-axes selected, then switch to a big number widget, we don't trim off the y-axes that are selected, instead we just render them with a radio button. This is meant for datasets that support equations, but at the moment a user can get "stuck" in the big number widget flow since this delete button is hidden. I figured we should just show it if there are more than 1 fields, even if equations aren't supported. One day we should fix how big numbers are stored if there are multiply y-axes, but this just patches the behaviour so we can release multi-metric selection because I imagine it'll raise feedback.
…flow (#111738) This PR addresses a `KeyError: 'oa2'` that occurred in the `/oauth/authorize/` endpoint when an unauthenticated user attempted to log in during an OAuth authorization flow. **Root Cause:** The `_logged_out_post` method in `oauth_authorize.py` calls `request.session.cycle_key()` to prevent session fixation attacks. However, `cycle_key()` regenerates the session ID and, in doing so, was inadvertently clearing the OAuth payload stored under `request.session["oa2"]`. Consequently, when the code attempted to access `request.session["oa2"]["uid"]` immediately after `cycle_key()`, it resulted in a `KeyError`. **Solution:** The fix involves preserving the `oa2` payload across the `cycle_key()` operation. Before `request.session.cycle_key()` is called, the existing `request.session["oa2"]` data is retrieved and stored in a temporary variable. After `cycle_key()` has regenerated the session, this saved payload is restored to the new session, and the `uid` is updated with the authenticated user's ID. Finally, `request.session.modified` is set to `True` to ensure the changes are persisted. This approach maintains the security benefits of `cycle_key()` while ensuring the necessary OAuth context is not lost during the login process. <!-- Sentry employees and contractors can delete or ignore the following. --> ### Legal Boilerplate Look, I get it. The entity doing business as "Sentry" was incorporated in the State of Delaware in 2015 as Functional Software, Inc. and is gonna need some rights from me in order to utilize my contributions in this here PR. So here's the deal: I retain all rights, title and interest in and to my contributions, and by keeping this boilerplate intact I confirm that Sentry can use, modify, copy, and redistribute my contributions, under Sentry's choice of terms. Co-authored-by: sentry[bot] <39604003+sentry[bot]@users.noreply.github.com> Co-authored-by: michelletran-sentry <167130096+michelletran-sentry@users.noreply.github.com>
…ERS associations (#111693) Attempting to fix task timeouts in https://sentry.sentry.io/issues/6731345393?project=1 & https://sentry.sentry.io/issues/6869524816?project=1. Replaces O(n^2) `reduce(or_, [Q(external_name__iexact=...) ...])` query construction with a single `Lower()` + `__in` query, and deduplicates names prior to querying. Batches per-user access checks (3 queries per user -> 3 queries total) and per-team access checks (1 query per team -> 1 query total). Adds tests to verify correct behavior with case-insensitive matching & handling of duplicate users/teams.
…ectors are connected (#111732)
…1268) WorkflowFireHistory doesn't have any children, so we can do simple query-based deletion. It has an index on date_added now, so this should be relatively efficient. 10k at a time might not be enough to make a dent, but we can run a one-time cleanup to help if we wish. It isn't yet listed explicitly in the task config, so this is a no-op.
…ion (#111663) Instead of updating the timestamp when the job is triggered, wait until the completion webhook fires. This ensured that it only updates when we know there is at least a root cause.
The goal of this PR is to validate the filter keys on any trace item based search query builder. To do this we've introduced a new API endpoint that accepts in a list of attributes and checks to see if they exist and are valid. We trigger this with a useQuery that runs on mount, and whenever the user modifies the query. We also have guards in place to ignore running the validation if the user is just modifying the filter values as those don't need to be validated, reducing the amount of calls we make. Validation is currently gated behind this flag: #111752 --------- Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
…f monitors (#111482) Change size analysis diff monitors to use sequential (n-1) comparisons instead of git-based (merge-base) comparisons. When a new build arrives, each diff-threshold monitor (`absolute_diff`, `relative_diff`) now resolves its base by finding the most recent prior artifact matching the detector's query filters and structural identity (`app_id`, `artifact_type`, `build_configuration`), ordered by `date_added`. Previously, monitors were evaluated inside the git-based comparison path (`_run_size_analysis_comparison` → `maybe_emit_issues`), which meant: - Artifacts without git metadata (no `commit_comparison`) never triggered monitors - All diff detectors shared a single git-derived base, even if they had different query filters - Monitor evaluation was coupled to the status check comparison flow Now the two paths are independent: - **Git path** — persists `PreprodArtifactSizeComparison` records and triggers status checks. No longer evaluates monitors. - **Sequential path** — `maybe_emit_issues_from_diff_size_results` runs unconditionally after the git block (even without git metadata). Each detector resolves its own base via `get_sequential_base_artifact`, with batch optimization (one DB lookup per unique query string across detectors). `absolute` threshold monitors are unaffected — they're already handled separately by `maybe_emit_issues_from_absolute_size_results`. --------- Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Shows an inline hint below the issue detection selector when Absolute Diff or Relative Diff is chosen, clarifying that comparisons use the previous build matching the monitor's filters, `platform`, `package_name`, and `build_configuration`. Uses `IconInfo` + `Text` + `InlineCode` for a lightweight presentation that doesn't compete with the form controls. <img width="2460" height="710" alt="CleanShot 2026-03-26 at 16 30 53@2x" src="https://github.com/user-attachments/assets/e0e7ce7a-1421-4d51-89b5-9d56168fa65d" /> Co-authored-by: Claude Opus 4.6 <noreply@example.com>
…111794) <img width="2524" height="472" alt="CleanShot 2026-03-30 at 10 09 42@2x" src="https://github.com/user-attachments/assets/e8a961a1-dad7-49bb-a105-35a8ee627461" /> adds the UI into http://127.0.0.1:8000/settings/sentry/projects/launchpad-test-ios/mobile-builds/ for enabling/disabling status checks for snapshots as well as two extra checks
… flag (#111518) Hide the unsortable telemetry columns (Logs, Spans, Errors) from the trace metrics samples table when `canUseMetricsUIRefresh` is enabled. This is the first step in some changes to the samples table as part of the metrics UI refresh. Refs LOGS-631 --------- Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
…zer (#111767) We want to avoid querying in 'serialize', as it's almost always more efficient to do it in batches in get_attrs.
Now that clear_cell_cache is deployed everywhere, switch the outbox handler for SENTRY_APP_UPDATE to dispatch clear_cell_cache instead of clear_region_cache.
note: this is behind a feature flag for safety, the default is unchanged (no multi-cell) and merging the code should be a no-op
Also adds TODO comments and details about the user endpoints that need to be changed: - UserRegions should be deprecated - UserOrganizationsEndpoint needs to move to control
Removing the sticky column on the metrics aggregates table as now users can select multiple aggregates so having that column be sticky isn't the best UX anymore. --------- Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
When creating PRs, we should allow passing a specific repo that we want to create PRs for.
Fixes to the new stack trace component's frame header and tooltip behavior to match the old component. - Show full absPath URL for third-party JS frames from different domains instead of just the relative filename - Suppress `:0` line/column numbers that native platforms use to indicate missing source info - Open the "leaving Sentry" confirmation modal when clicking external URLs in the tooltip instead of navigating directly - Improved tests: replaced test-id selectors with `getByText`/`getByLabelText`/aria-labels, added fake timers for tooltip tests, added typed mock responses, and added coverage for Java module priority and third-party frame display displays the full url instead of path for some minified cases again <img width="864" height="137" alt="image" src="https://github.com/user-attachments/assets/8df81300-1e08-4660-b2c3-0fbeb9527eed" /> rename "File" to "Absolute Path" <img width="856" height="185" alt="image" src="https://github.com/user-attachments/assets/678eb655-a2f6-40e1-9bf0-b6d9f07f5b35" />
The shared/public issue view (`/share/issue/:id`) used generic event components that were designed for the full issue details page. These components carried dead code paths, rendered sections for data the backend never sends, and pulled in heavy dependencies like the issue details context. This PR co-locates the rendering logic with the shared view, only renders what `SharedEventSerializer` actually provides, and aligns the `SharedViewOrganization` type with the backend response. --------- Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Adds a new CLI command to create projects, attached to the given organization
Commands run: ``` # Add return types to test methods within classes rg -ls 'def test.*\(self\):' tests/sentry | xargs sed -E -i '' -e 's/def test(.*)\(self\):/def test\1\(self\) -> None:/' # Add return types to setup methods within classes rg -l 'def setUp\(self\):' tests/sentry | xargs sed -i '' -E -e 's/def setUp\(self\):/def setUp(self) -> None:/' # Add return types to toplevel test functions rg -ls 'def test.*\(\):' tests/sentry | xargs sed -E -i '' -e 's/def test(.*)\(\):/def test\1\(\) -> None:/' # Type check, only minor errors (addressed in separate commit) mypy ```
<!-- Describe your PR here. --> <!-- Sentry employees and contractors can delete or ignore the following. --> ### Legal Boilerplate Look, I get it. The entity doing business as "Sentry" was incorporated in the State of Delaware in 2015 as Functional Software, Inc. and is gonna need some rights from me in order to utilize my contributions in this here PR. So here's the deal: I retain all rights, title and interest in and to my contributions, and by keeping this boilerplate intact I confirm that Sentry can use, modify, copy, and redistribute my contributions, under Sentry's choice of terms.
…ter params (#111800) When the URL contained any dashboard filter key (e.g. `release=`), `getDashboardFiltersFromURL(location)` returned a non-null object containing only that key. The nullish coalescing (`??`) pattern then skipped `dashboard.filters` entirely, dropping any saved global filters that weren't in the URL. For example, navigating to `/dashboard/1859247/?project=11276&release=&statsPeriod=90d` would cause the `release=` param to make `getDashboardFiltersFromURL` return `{release: [""]}` — non-null — so the `??` never fell back to `dashboard.filters` which held the saved `globalFilter` entries. Added a `getMergedDashboardFilters(savedFilters, location)` utility that spreads saved filters as a baseline and lets URL filters override per-key. Replaced all 5 call sites that used the old `??` pattern. Fixes DAIN-1435 Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
This PR just adds a feature flag gated nav item for Errors and registers the new explore routes! there's nothing much to see here but if you're curious: <img width="834" height="611" alt="image" src="https://github.com/user-attachments/assets/b217b5e8-6d72-4e5d-8f0a-fb3da8bcad06" />
…atus_check task (#111798) Add a Snapshots - Status Checks settings panel to the preprod project settings page with three toggles: enabled, fail on added, and fail on removed. Wire up these project options in the backend so the snapshot status check task respects them. related PR: #111794 Closes EME-911
…111719) Eagerly fetches supergroup assignments in the issue list overview to block the stream from rendering until grouping data is available, preventing pop-in. Supergroup rows now show aggregated stats (last seen, age, trend chart, events, users) from member groups and align to the same column grid as regular issue rows. Removes the previous experiment. --------- Co-authored-by: Charlie Luo <cvxluo@gmail.com>
…111529) ## Summary Visual polish and analytics for the SCM platform features step (step 2 of 3), aligning with Figma and following patterns from VDY-22. **Layout**: Use ScmStepHeader/ScmStepFooter, LayoutGroup for smooth transitions between detected and manual picker sections. **Platform cards**: Larger icons (28px), equal-width grid, skeleton loading state, "skip detection" bail-out during slow detection, error fallback to manual picker. **Feature cards**: Match Figma sizing (padding, gaps, font sizes), 3px bottom border on unselected cards, equal-height rows, centered heading with grid areas. **Manual picker**: Replace CompactSelect with Select + virtualized MenuList (react-select re-renders all options on hover, causing lag with 130+ platform icons). **Analytics**: Step viewed, platform selected (detected vs manual), feature toggled, change platform clicked, continue with platform/features params. **Shared components**: Extract ScmSearchControl (was duplicated) and ScmVirtualizedMenuList (stopgap until a Combobox scraps component exists). Closes VDY-24 ## Figma - [Recommendations state](https://www.figma.com/design/bPNQPnm9R5Og1mTbAbdauL/Value-Discovery-%F0%9F%94%AD?node-id=265-4756&m=dev&focus-id=480-2309) - [Manual state](https://www.figma.com/design/bPNQPnm9R5Og1mTbAbdauL/Value-Discovery-%F0%9F%94%AD?node-id=265-4756&m=dev&focus-id=503-4206) ## Test plan - [ ] 15 unit tests passing (4 new analytics, 1 error fallback) - [ ] Visual: both Figma variants match (recommendations + manual) - [ ] Analytics events fire correctly in browser console - [ ] Detection error falls back to manual picker - [ ] Slow detection shows loading indicator with skip link
This passes the phrase FIXES PROJ-123 so the created PR is linked back to the issue.
…ation (#111758) we have fully migrated to cell_name on the wire now
- the feedback buttons seem to have grown, re-align them - remove check for hasStreamline since that feature is now always enabled - Remove the `commitRow` render prop — every call site passed the same `CommitRow` component - Reflect the actual API shape of committers w/ `group_owner_id` before <img width="735" height="122" alt="image" src="https://github.com/user-attachments/assets/ffb873b2-d599-44af-a5ac-3247f5700754" /> after - the feedback is slightly further from the next line of text <img width="726" height="131" alt="image" src="https://github.com/user-attachments/assets/42cab07a-cec6-4ccc-8f7c-6ab8fcee403f" /> how they looked when they were added #99056 --------- Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
…repos (#111716) Fix repo selection in the SCM onboarding connect step to handle the race with the background `link_all_repos` task. After a GitHub integration is installed, `link_all_repos` runs async and registers all repos. The old approach cached existing repos on mount and checked that cache before deciding to POST. This broke because the cache was often stale (task still running) and the repos endpoint is paginated (specific repo might not be on page 1). New approach: - GET first with a targeted query filtered by repo name (sidesteps pagination) - POST only if the repo doesn't exist yet The old code also hid (soft-deleted) repo records when the user deselected or switched repos. This made sense when repos were manually registered one at a time, but with `link_all_repos` auto-registering everything, hiding repos on deselect was counterproductive -- it removed records the background task created, causing them to disappear from the integration settings page. Repo selection is now just a context pointer with no side effects on the repo records themselves. Also switches to `queryClient.fetchQuery` + `fetchDataQuery` for the imperative GET instead of deprecated `Client.requestPromise`. Replaces #111699 (closed due to CODEOWNERS auto-review noise from base change).
<img width="200" height="228" alt="image" src="https://github.com/user-attachments/assets/13b474c8-08f7-4db5-865a-9c0fa24ce490" />
…ract action data (#111689) The initial rendering logic was mostly ok, but had a couple of small bugs which result in data rendering incorrectly for WFE alerts. This updates the render code, example render data, and even query logic to be closer to our current production alerting.
## Summary - The `telemetry_live_search` tool formatter in Seer Explorer was missing a case for the `metrics`/`tracemetrics` dataset, causing metrics queries to display as "Queried spans" instead of "Queried metrics". ## Test plan - [x] Open Seer Explorer and run a natural language query targeting metrics (e.g. "Show me the count of all metrics in the last hour") - [x] Verify the tool output label reads "Querying metrics" / "Queried metrics" instead of "Queried spans" --------- Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
…111827) Tracks when a seer session returns a failed status on generating dashboards, indicating upstream failure (not the same as invalid dashboard).
## Summary - Add "Metrics" to the list of supported search strategies in the `SearchAgentStartSerializer` help text Depends on #111587 ## Test plan - [x] Verify help text includes Metrics as a valid strategy option --------- Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…n WorkflowEngineActionSerializer (#111771) The O(N) querying from MetricAlertRegistryHandler.target is a notable performance problem. This change allows for batching that should be much more efficient.
…or (#111760) The API docs for creating a workflow don't list that you can pass in a list of `detectorIds` to connect the workflow to because it uses a separate `BulkWorkflowDetectorsValidator`. We have this same problem with the create a detector API but this PR does not cover that. Outside of hardcoding something in the endpoint description about it the simplest way to achieve the goal of having all the possible options in the docs was to do the bulk validation inside the `WorkflowValidator`, so this PR moves the code into the main validator instead of having it happen in 2 different places.
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 : )