[pull] master from getsentry:master#1816
Merged
pull[bot] merged 65 commits intoKingDEV95:masterfrom Mar 23, 2026
Merged
Conversation
## Summary - Add `on_app_mention()` handler to `SlackEventEndpoint` that resolves the org, checks the `seer-slack-explorer` feature flag, extracts event data, and dispatches `process_mention_for_slack` task - Update `post()` to route `app_mention` events to the new handler - Add stub `process_mention_for_slack` Celery task in `seer/entrypoints/slack/tasks.py` (full implementation in ISWF-2023) Ref: ISWF-2018 --------- Co-authored-by: Leander Rodrigues <me@leander.xyz> Co-authored-by: Claude <noreply@anthropic.com> Co-authored-by: Claude Opus 4.6 <noreply@example.com>
The SCM platform is now more tolerant to GitLab integrations' `external_id` format.
…ard generate (#111301) Pass `category_key` and `category_value` to `SeerExplorerClient` in the dashboard generate endpoint so that runs are properly categorized by use case and organization. This enables cost / usage tracking of dashboard generation requests Agent transcript: https://claudescope.sentry.dev/share/IyJKW8mCxA7WRfW26AW3In8LsGwl3OjMG_FCj72aAsA
Adds `collapse=stats` to the `useGroup` query key so the group details endpoint skips computing 24h/30d time-series stats. The issue details page uses Discover queries for its event graph, not the `stats` field from the group response. This also benefits the stacktrace preview tooltip, which prefetches group data via `useGroup` on hover. - Depends on #111155
Before the image was tooooo big. Here's a side-by side of the page at the same browser-window size, before the bottom was cutoff at this dimension! | Before | After | | --- | --- | | <img width="1512" height="948" alt="SCR-20260322-jslx" src="https://github.com/user-attachments/assets/b69e56c9-b10a-4e7e-a024-ab7e89ec84da" /> | <img width="1512" height="948" alt="SCR-20260322-jsmh" src="https://github.com/user-attachments/assets/2981d2d8-3dc7-452e-ba69-61892daa995f" /> It was always responsive though: narrowing the window width, or shrinking the height scales the image. Here's a selection of images to show the page at different approx scales, assuming the image above is the 100% size, these are all smaller: | Scale | Img | | --- | --- | | 3/4 height | <img width="1512" height="725" alt="seer trial - after 3-4 height" src="https://github.com/user-attachments/assets/d85c639e-c34d-4c82-8070-730f8caec8f4" /> | 1/2 height | <img width="1512" height="580" alt="seer trial - after 1-2 height" src="https://github.com/user-attachments/assets/619e0d5e-7895-4c4f-b274-e200483a03ba" /> | 3/4 width | <img width="1170" height="948" alt="seer trial - after 3-4 width" src="https://github.com/user-attachments/assets/a4a08a61-ed7a-4c7b-97f4-72424b054e86" /> | 1/2 width | <img width="784" height="948" alt="seer trial - after 1-2 width" src="https://github.com/user-attachments/assets/58109123-93a1-4480-a41c-eddac3ae6719" /> | 3/4 of total | <img width="1207" height="760" alt="seer trial - after 3-4 size" src="https://github.com/user-attachments/assets/7124abef-28a7-4c34-9e94-b8ebde30824c" /> | 1/2 of total | <img width="790" height="615" alt="seer trial - after 1-2 size" src="https://github.com/user-attachments/assets/e033ace1-a874-4437-b8c3-a3a75cfa556f" />
This reverts commit e5504b6. Co-authored-by: GabeVillalobos <5643012+GabeVillalobos@users.noreply.github.com>
Adds `group` param as first-class to metadata
…ct (#111279) **Before** <img width="590" height="201" alt="Screenshot 2026-03-22 at 3 57 58 PM" src="https://github.com/user-attachments/assets/ef39b787-ffd1-4eea-a547-95265ea68bed" /> **After** | Tab | Url | | --- | --- | | Overview | <img width="590" height="201" alt="Screenshot 2026-03-22 at 3 57 42 PM" src="https://github.com/user-attachments/assets/40bf7392-6a95-45f2-b832-76338da26e95" /> | SCM | <img width="590" height="201" alt="Screenshot 2026-03-22 at 3 57 48 PM" src="https://github.com/user-attachments/assets/63a6537e-9f5d-4fdf-8e5e-c640084a629c" /> | Autofix | <img width="590" height="201" alt="Screenshot 2026-03-22 at 3 57 50 PM" src="https://github.com/user-attachments/assets/dd689499-7816-449d-95ac-c88be529c2e6" /> | Code Review | <img width="590" height="201" alt="Screenshot 2026-03-22 at 3 57 52 PM" src="https://github.com/user-attachments/assets/85d36f87-cd8e-4cbc-92e6-8b87399ee52a" />
# Description Signal handlers for cache invalidation. There's not a rollout flag included here yet, because any exceptions or failures are limited to the scope of these invalidation methods and it keeps that a little simpler. When we invalidate the Action Filters / Data conditions: | Model | Signal | Reason | |--------|--------|--------| | WorkflowDataConditionGroup | post_save | When an action filter is created on a workflow | | WorkflowDataConditionGroup | pre_delete | When an action filter is removed from the workflow | | DataConditionGroup | post_save | When an update to the logic type in the condition | | DataCondition | post_save | When a condition on a filter is created or changed | | DataCondition | pre_delete | When a condition on the filter being removed | ## Remaining Work - [ ] Update the `evaluate_workflows_action_filters` method to read from the cache with a rollout flag.
…111283) Follow-up to #110981 which batched nodestore fetches for the group events endpoint. The batched `get_multi` call reduced 100 sequential Bigtable RPCs to 1, but the single batch still takes ~8-10s because row keys are MD5-hashed and scattered across ~100 Bigtable tablets. This PR adds two things to help understand and reduce that cost: ### 1. Cache observability for `get_multi` The single-event `get()` already emits `nodestore.get` metrics with `cache:hit/miss` tags, but `get_multi` had no cache metrics at all. Now it emits: ``` nodestore.get_multi cache:hit amount=<N> nodestore.get_multi cache:miss amount=<N> ``` This lets us measure the actual cache hit rate for batch reads in production and understand whether increasing the TTL would help. ### 2. Configurable cache TTL Cache entries were written with no explicit `timeout`, relying on the backend's `DEFAULT_TIMEOUT` (typically 300s). Since event bodies are **immutable** — they never change after ingestion — there's no invalidation concern with longer TTLs. The new `nodestore.cache-ttl` option (default: 300s) can be tuned upward via configoptions without a deploy. If production metrics show low hit rates, increasing to 1-4 hours should improve cache effectiveness for paginated list views where events are often viewed in quick succession. ### Why this helps The group events endpoint fetches ~100 events per page. With a 5-minute cache TTL, events ingested more than 5 minutes ago won't be cached when the list is first viewed. But once viewed, they'll be cached for subsequent page loads and adjacent page navigations. A longer TTL extends this window significantly. ### Files changed - `src/sentry/services/nodestore/base.py` — metrics in `get_multi`, explicit TTL in `_set_cache_item`/`_set_cache_items` - `src/sentry/options/defaults.py` — register `nodestore.cache-ttl` option Co-authored-by: Claude Opus 4 <noreply@anthropic.com>
## Summary - Add `extract_prompt()` to strip the bot's `<@BOT_ID>` mention from Slack message text while preserving other user mentions as context for Seer - Add `extract_issue_links()` to extract `(group_id, event_id)` tuples by reusing existing unfurl regex patterns from `unfurl/issues.py` - Add `build_thread_context()` to format Slack `conversations.replies` messages into a readable transcript for Seer Explorer ISWF-2019
Found a minor inconsistency with lastTriggered in the process, fixed it. I'm not entirely certain the legacy action data is valid, but seems plausible.
…111299) The `EAPSummaryContentInner` component was using `TransactionSearchQueryBuilder`, which provides transaction-oriented field definitions (e.g. `geo.country_code`). Since the EAP page queries the spans dataset, the search bar should use spans attributes (e.g. `user.geo.country_code`) for validation and autocompletion. Replace with `useSpanSearchQueryBuilderProps` + `TraceItemSearchQueryBuilder`, matching the pattern used across Insights pages. Fixes BROWSE-464. Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
…11308) These checks were lifted to the sidebar so no need for it inside the drawer.
…ystem (#111171) This was auto-converted using the LLM skill I tested that the toggles are still sending their expected values, usually a true/false, but sometimes a `medium` or `off`. Looking good!
…for overfetching from the api (#111226)
## Summary - Add Explorer methods to `SlackEntrypoint`: `from_explorer_mention()` factory, `has_explorer_access()`, `on_trigger_explorer_error()`, `on_trigger_explorer_success()`, `create_explorer_cache_payload()` - Add `SlackExplorerCompletionHook` for handling Explorer run completion via cached payloads - Add `SeerExplorerError` notification data, template, and Slack renderer with tests - Add `SeerExplorerResponse` notification data and Slack renderer - Add `SeerOperatorExplorerCache` for Explorer completion hook payloads - Add `SlackExplorerCachePayload` TypedDict Closes ISWF-2021 --------- Co-authored-by: Leander Rodrigues <me@leander.xyz> Co-authored-by: Claude <noreply@anthropic.com> Co-authored-by: Claude Opus 4.6 <noreply@example.com>
Add a `snuba_rpc.read_timeout_error` metric. This will allow us better observability into snuba api health
- The replay code is being absorbed by the databrowsing teams so changing the ownership to match - Closes ENG-7101
Autofix redesigns are mostly ready to go. This removes the original version from the code base.
…1318) Add a toggle button in the snapshot dev tools panel that lets developers switch between solo and diff views on snapshots that have diff data. The button toggles the `?type=solo` URL query parameter — when viewing a diff snapshot, clicking "View as solo" adds `?type=solo` to show the raw images without comparison overlay. Clicking "View as diff" removes the parameter to restore the diff view. The button only renders when the snapshot has a base artifact (i.e., diff data exists). This is an admin/dev-only feature, scoped to the temporary dev tools panel rather than the main header UI. --------- Co-authored-by: Claude Opus 4.6 <noreply@example.com>
These options were for rollouts, features that don't exist anymore, and grpc options that we didn't end up needing/using. Refs STREAM-798
…ions and SeerProjectRepository (#110704) relates to AIML-2605 Adds dual-write so that all Seer project preference writes also persist to Sentry's DB (ProjectOption keys + SeerProjectRepository rows), gated behind the organizations:seer-project-settings-dual-write feature flag. This is Phase 1 Step 4 of the [Seer preferences migration](https://www.notion.so/sentry/Tech-Spec-Migrate-Seer-Settings-to-Sentry-Database-3208b10e4b5d80f58ea0d7b77a301e2a) — once reads are cut over in later phases, the Seer API calls get removed and these DB writes become the primary path. We only write to DB if the Seer call succeeded. --------- Co-authored-by: Claude Opus 4 <noreply@anthropic.com> Co-authored-by: Claude Opus 4.6 <noreply@example.com>
This doesn't need the relative position anymore
Implements the new menu for when page frame is enabled and hides the footer. <table> <tr> <td> Before <td> After <tr> <td> <img width="678" height="866" alt="CleanShot 2026-03-20 at 17 27 20@2x" src="https://github.com/user-attachments/assets/9873f451-be8f-4e24-a116-bcdb89587edc" /> <td> <img width="672" height="542" alt="CleanShot 2026-03-20 at 17 27 52@2x" src="https://github.com/user-attachments/assets/db8b5d4b-b53f-4c3b-81aa-b0455b1cbdb1" /> </table>
…ifts (#111238) Wraps each filter selector trigger in a `Container` with a `maxWidth` of `300px` so that selecting a long filter value doesn't cause the trigger button to expand and push other elements around in the filters bar as much. It still will a bit! Fixes DAIN-1377 Co-authored-by: Claude <noreply@anthropic.com>
…#111278) Fix primary nav accessibility issues identified through a lighthouse audit by: - Changing hover action to use data-attr as opposed to overriding aria-selected - Using `aria-current=location` attribute - Updating reorderable item components to correctly render a ul > li structure - Adding test assertions for all secondary navigation lists which validate the correctness of the generated HTML - Moving issues supergroups under the `List` component (identified by the test suite) The collective set of changes results in no reported violations from lighthouse for our primary or secondary navigation and improves the accessibility audit by ~7pts Fixed DE-1015 --------- Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
Use Layout.Page on Feedback page which will apply the correct background when pageFrame feature is enabled
Update pageframe layout to primary background and be compatible with the pageframe --------- Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
…quest (#111335) We're going to use a normal request with an extrapolated server-only count for the total # of metrics call for a widget. This works because right now metrics are sampled at 100% so the server only count is a close approximation of our stored count. Adds a referrer to make sure this is queryable
…111221) all cell rpc methods that use the ByCellName resolver have been migrated to cell_name. We can drop support for region_name now.
) Closes DAIN-1375. Current dashboard widgets have a very horrible red banner for error states, and an even more horrible error boundary: **e.g.,** <img width="840" height="103" alt="Screenshot 2026-03-19 at 3 34 43 PM" src="https://github.com/user-attachments/assets/869642cf-fe6f-42fe-b6e2-de46edd57ed0" /> <img width="836" height="273" alt="Screenshot 2026-03-19 at 3 04 55 PM" src="https://github.com/user-attachments/assets/919ea3ca-2fb9-40d9-9ddd-c2514e72186d" /> This PR replaces both of them with `Widget.WidgetError` which is the standard way to handle this. **e.g.,** <img width="836" height="279" alt="Screenshot 2026-03-19 at 3 40 22 PM" src="https://github.com/user-attachments/assets/916b211a-532a-4f74-9186-029ed32ef2bd" /> I had to alias `Widget` to `TWidget` to allow importing the `Widget` component in a few places, but overall, this PR just replaces a bunch of custom error handling done through render props with a simple conditional that uses `WidgetError` to render errors.
…111325) Show the previous filename when hovering over a renamed snapshot image's filename. When images are renamed between builds, the UI now shows a tooltip with the rename transition (`old_name → new_name`) on hover. Renamed filenames use the accent `InlineCode` variant (purple tint) as a visual hint that additional info is available. Changes: - Add `previous_image_file_name` to the `SnapshotImage` TypeScript interface - Wrap renamed image filenames in a `Tooltip` showing the before → after names - Use accent `InlineCode` inside the tooltip for consistent styling Closes EME-961 Regular snapshot title UI: <img width="680" height="427" alt="image" src="https://github.com/user-attachments/assets/a533449e-876f-48e1-9151-3be1877341a7" /> Renamed snapshot title: <img width="622" height="290" alt="image" src="https://github.com/user-attachments/assets/62e9aa3e-fc1d-4d76-829e-d82bc664bfe4" /> tooltip if you hover the title: <img width="596" height="102" alt="image" src="https://github.com/user-attachments/assets/6831466c-62b2-4361-b42e-e8fcbe7e2912" /> --------- Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
…#111332) ## Summary Follow-up to #111325 — refactors renamed snapshot items to use `SnapshotDiffPair` instead of a flat `SnapshotImageResponse` with a `previous_image_file_name` field. A rename is conceptually a diff from old image → new image, so the pair structure naturally models this: - `base_image` = old filename (looked up by `previous_image_file_name`) - `head_image` = new filename - `diff` / `diff_image_key` remain `None` (no visual diff for renames) ### Changes - **`SnapshotImageResponse`**: Remove `previous_image_file_name` field (no longer needed in API response) - **`SnapshotDetailsApiResponse`**: Change `renamed` from `list[SnapshotImageResponse]` to `list[SnapshotDiffPair]` - **`CategorizedComparison`**: Same type change for `renamed` - **`categorize_comparison_images`**: Build `SnapshotDiffPair` for renamed items by looking up base image by old filename from `base_images_by_file_name` Note: `previous_image_file_name` is kept on `ComparisonImageResult` in `manifest.py` — that's internal transport from tasks → categorizer, not part of the API response. ## Test plan - [ ] Existing backend snapshot tests pass - [ ] Frontend PR (#111325) updated to consume renamed as `SnapshotDiffPair[]` - [ ] Manual: renamed items show tooltip with old → new filename --------- Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
the pydantic models RpcOrganizationMapping and RpcOrganizationMappingUpdate used for rpc now send `cell_name` instead of `region_name` on the wire support for both fields was added in #111039
…tors (#111259) Metric monitors with percent change thresholds were translating the value incorrectly. `110` should display as `10% higher`, not `110% higher`.
+ Add top-level and nested tracing spans around allowed-org selection so we can measure end-to-end scheduler time and isolate feature flag check cost. + Trying to keep track of time taken by this function as we iterate on it. --------- Co-authored-by: GPT-5.4 <noreply@openai.com>
…#111297) `toPythonString` converted `null`/`undefined` inside arrays to `'None'` but fell through to `String(null)` → `"null"` at the top level. Python's `str(None)` returns `"None"`, so when a `groupBy` value is `null`, the JS-side string didn't match the backend's `"None"`, causing the breakdown legend to fail to find matching table rows. Adds a `null`/`undefined` check before the array branch, and refactors the array item mapping to use recursive `toPythonString` calls so boolean/null handling is consistent at all nesting levels. Adds unit tests covering strings, booleans, null, undefined, numbers, and mixed arrays. --------- Co-authored-by: Claude Opus 4.6 <noreply@example.com>
- Delete old ExternalIssues component - Rename StreamlinedExternalIssues to ExternalIssues
…tRuleDetailsEndpoint.get (#111330) Updates ISWF-2287.
…te stories later (#111216) The sentry & getsentry split is still annoying. I want to throw a bunch of ui components into stories, but can't do that from getsentry. So i'm thinking i can move things that don't depend on billing imports into sentry and unblock stories.
New endpoint similar to the other supergroup ones to specifically fetch supergroups by a list of group ids. --------- Co-authored-by: Claude <noreply@anthropic.com> Co-authored-by: getsantry[bot] <66042841+getsantry[bot]@users.noreply.github.com>
) Fix the performance score (wheel) widget layout in dashboards and make the ring scale to fill its container. We've had a complaint that the padding around the Score widget is awkward. It's true! I was tinkering with this, and thought, why not take this a step further and let the SVG scale with the widget? Kind of like a Big Number! I also fixed some padding stuff and got rid of the caption that said "last 7 days" altogether, none of our other widgets have that, might as well toss it. **Before:** <img width="2672" height="1522" alt="Screenshot 2026-03-20 at 6 02 50 PM" src="https://github.com/user-attachments/assets/51d29d60-86c2-4fd6-a5ae-40634a7dbde5" /> **After:** <img width="2672" height="1522" alt="Screenshot 2026-03-20 at 6 04 20 PM" src="https://github.com/user-attachments/assets/5848bc6b-e13b-4b9e-a96f-1411447b9884" /> Refs DAIN-1383
These platforms have metrics support now
) Colocate useScmProviders hook and its spec with the other SCM hooks in the components subdirectory for consistency. Updates the import in scmConnect.tsx. This was PR feedback that was missed in #110883 (comment) Refs VDY-19
…#111354) Temporarily renames the snapshot comparison metrics tag keys from `org_id`, `project_id`, `app_id` to `temp_org_id`, `temp_project_id`, `temp_app_id` in both the upload endpoint and the comparison task. This is to investigate a metrics tagging issue where the current tag names may be conflicting with reserved or existing tag keys in our metrics pipeline. The `temp_` prefix isolates these tags to confirm they're being recorded correctly. This is a temporary change — once we verify the metrics are flowing properly, we'll rename them back.
This adds the `tests/sentry/processing_errors` directory to our codeowners file, assigned to the issue detection team because the corresponding `src/sentry/processing_errors` directory is assigned that way. This should fix the codeowners check which is currently failing in all new PRs.
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 : )