[pull] master from getsentry:master#1812
Merged
pull[bot] merged 51 commits intoKingDEV95:masterfrom Mar 20, 2026
Merged
Conversation
…#110787) Show an "Add Workspace to Staging" button next to the existing "Add Workspace" button when the slack-staging-app feature flag is enabled. The staging button passes use_staging=1 to the setup dialog URL for the backend to route to staging app credentials. A part of ISWF-2223 --------- Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
#111197) When creating a new dashboard, we navigate the user to the new dashboard url with an incorrect double nested `query` parameter. This causes the new url to contain `query=[object object]`. Removes the unnecessary nest to fix this.
Stores a referrer in the metadata to indicate where the run was triggered from. There is a top level one that indicates where the first step is triggered from and a per prompt one to indicate where next step was triggered. --------- Co-authored-by: Claude Opus 4.6 <noreply@example.com>
…hing with experimental badge (#111196) - Use default priority on the Create Dashboard with Seer button to prevent visual clashing with the experimental badge - Also makes a slight change to modal title to match button and adds a gap between modal buttons
Render negated multi-value filters with an `and` joiner in the shared search UI renderer, so that we correctly follow [De Morgan's laws](https://en.wikipedia.org/wiki/De_Morgan's_laws) (thanks @wmak) Refs EXP-784 and #108195 Made with [Cursor](https://cursor.com)
this adds support for `cell_name` in RpcOrganizationMapping and RpcOrganizationMappingUpdate classes. `region_name` is still being sent on the wire currently. that will be flipped as the next step.
region_name is no longer passed
Though in most cases messages in fingerprints should be parameterized just like messages in events are, there are cases where that's not true. For example, if the same stacktrace throws both `APIRequestError: Request failed (response code: 404)` and `APIRequestError: Request failed (response code: 500)`, by default we'd put the events into the same issue, because the stacktraces match. If a user wanted to get around that, until recently they could use a fingerprint like `["{{ default }}", "{{ message }}"]`, and the two events would get different hashes because of the difference in their error messages.
However, now that we're parameterizing messages in fingerprints[1], those two events have gone back to having the same hash, even with the fingerprint rule. To allow users to opt out of that behavior, this PR introduces a (for-now-undocumented*) new fingerprint variable, `{{ raw_message }}`, which does the same thing as `{{ message }}`, but without the parameterization. (Since we only parameterize the `{{ message }}` variable, the new variable automatically has parameterization skipped.)
*For now we're not documenting the variable because the problem this solves is kind of an edge case, and we want to lower the chances of users shooting themselves in the foot by using it when they really shouldn't. If this ends up coming up with other customers, we can always add it to docs then.
[1] #107808
Update filterSelector behavior to not clear the selection on close
Fix an error in the workflow API docs - if the filter is for an unassigned issue, use "Unassigned" - I got it mixed up with the fallthrough types.
…flag (#110986) Add a refreshed UI for trace metrics panels, gated behind the `tracemetrics-ui-refresh` feature flag. The refreshed layout simplifies the metric panel by rendering MetricsGraph and MetricInfoTabs in a vertical stack without orientation controls. The graph gets a visualize label badge (A, B, C…) in its title, uses full height in the refreshed layout, and hides the footer border. Info tabs increase from `xs` to `md` size. When the flag is off, the existing side-by-side / stacked orientation UI is unchanged. Refs LOGS-620 --------- Co-authored-by: Claude Sonnet 4 <noreply@anthropic.com>
…gs (#111168) + Fix ProcessingDeadlineExceeded in schedule_context_engine_indexing_tasks by dividing orgs into 24 hourly buckets via md5 hash and only checking the feature flag for the ~1/24th of orgs in the current hour's bucket — reducing feature check volume by ~24x. + Remove stale caching logic (CONTEXT_ENGINE_ENABLED_ORG_IDS, cache-based newly-enabled-org detection) that is no longer needed with the bucketing approach. + Mirrors the pattern used by seer_explorer_index (project.id % 23) but operates at the org level (~20x fewer rows) with better hash distribution. + We can have more filtering on Seer side to if we want skip certain orgs: getsentry/seer#5358 --------- Co-authored-by: Claude Sonnet 4 <noreply@example.com>
This reorganizes the metrics tab so each metric query renders as a stacked toolbar with updated add and remove controls, while the chart panels remain grouped below. The refreshed layout needs more horizontal room than the compact search query builder previously allowed, so this also disables the filter key list box's full-width details mode for compact builders to keep the filter details pane readable. I considered keeping the existing grid layout and only swapping button styles, but the stacked structure gives each metric control enough space without degrading truncation behavior or making the filter interaction harder to use. Refs LOGS-621 Made with [Cursor](https://cursor.com) --------- Co-authored-by: GPT-5.4 <noreply@openai.com> Co-authored-by: GPT-5.4 <noreply@example.com>
Adds support to snapshot frontend for handling the "group" field. Will now group snapshots in the sidebar by the respective group they're in.
This PR aims to add a new banner to the seer settings page informing beta/legacy cohort folks that they are on an old seer plan and that they should look to move to the new plan before we stop supporting the old one. Didn't want to explicitly mention beta/legacy or a hard and fast date, in the event it gets pushed again. Very flexible on copy changes. Closes https://linear.app/getsentry/issue/CW-1062/confirm-if-no-active-seer-banner-needed-build Relates to https://linear.app/getsentry/issue/CW-1005/consolidate-seer-settings-product-experience-across-legacy-and-new <img width="1265" height="623" alt="Screenshot 2026-03-20 at 9 07 37 AM" src="https://github.com/user-attachments/assets/316bb350-20d9-41bd-94d7-efc5f9238059" /> <!-- 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.
…111200) When `planDetails` is null (e.g. subscription data hasn't loaded yet), the dashboard limit was defaulting to `0`, which incorrectly blocked dashboard creation. This changes the fallback to `10`, matching the minimum plan allowance so users aren't locked out of dashboards while subscription data is loading. Refs DAIN-1384 --------- Co-authored-by: Claude Opus 4.6 <noreply@example.com>
) Add a fallback `/events/` mock to the refreshed metrics tab sidebar toggle test. The refreshed metrics panel can issue background events queries while this test is only trying to assert the collapse and expand behavior. Without a generic fallback response, those unrelated requests bubble up through the mocked API client and fail the spec via the console-error guard. I considered tightening this to the exact background referrer, but the current test does not care which secondary panel request fires. A low-priority fallback keeps the test focused on the sidebar interaction while preserving the more specific mocks used by the rest of the suite. Made with [Cursor](https://cursor.com) Co-authored-by: GPT-5.4 <noreply@openai.com>
…ve conflicting properties (#111170) There is an issue where some (~5k) old metric alerts have `detection_type: "static"` but a defined `comparison_delta`. The backend (and old frontend) code treats these as `detection_type: "percent"`, but the new UI code looks at `detection_type` to determine this. Instead of modifying all the frontend callsites to check for `comparisonDelta`, it is a little cleaner if we fix this on the serializer. This will be easier to remove once we get the migration run.
…111195) The `page-frame` nav variants (`PageFrameSidebarNavigationLink` and `StyledPageFrameReorderableFakeLink`) were missing the `height: form.sm.height` cap that exists on their non-page-frame counterparts, causing items with icons to appear taller than regular items in the list. Co-authored-by: Claude <noreply@anthropic.com>
…0004) These flags are fully rolled out and no longer needed. Removes the flag registrations from temporary.py and all conditional checks in the logs UI.
- This snuba call can timeout, add a try catch so we can migrate hopefully most of them and add a log so we know how many we've missed
New snapshots for checkbox, radio & switch
…nd snapshots (#111202) We found a bug yesterday where an unsuspecting PR showed a large "Added" diff. This led to an investigation where I discovered the checkout action is checking out the merge commit (actions/checkout#504) rather than the HEAD commit. In the case of the PR that showed this diff (#110780), the base has 12 snapshots as it's from a few days ago. His HEAD has no snapshot changes, so should only be diffing 12 images. Instead, it used the merge commit, so his changes+master (which has 132 new snapshots), therefore showing 132 incorrectly "added" snapshots. The fix here is simple, explicitly checkout the HEAD commit of the PR rather than the merge commit (https://github.com/actions/checkout?tab=readme-ov-file#checkout-pull-request-head-commit-instead-of-merge-commit). This ensures the snapshot changes only diff changes on that branch rather than against the master+branch merge commit.
…le (#111222) **Before:** <img width="308" height="157" alt="Screenshot 2026-03-20 at 11 15 56 AM" src="https://github.com/user-attachments/assets/41ff0ac1-dc37-4547-bcf9-eae8aad22884" /> **After:** <img width="189" height="150" alt="Screenshot 2026-03-20 at 1 58 01 PM" src="https://github.com/user-attachments/assets/ad7bddd2-f856-4339-a40e-5612f3e287de" /> Fixes DAIN-1382 Co-authored-by: Claude <noreply@anthropic.com>
Right now, if the `{{ message }}` variable appears in a fingerprint, we parameterize the message value before we substitute it in for the variable. However, if the user has done the substitution for us (in other words, if the fingerprint contains not the `{{ message }}` variable but the message itself), then we don't parameterize. This fixes that by checking any constant fingerprint variables against all of the event's messages, so that we can use the parameterized version if necessary.
…111150) before making the alerts self hosted migration we needed a way to bypass the feature flag checks. So i've added an optional parameter to the translation function that will bypass the feature flag check which we'll use specifically for the self-hosted migration.
These task commands were deprecated when we switched over to taskbroker. Now that they've been deprecated for a few months we can remove them. Refs STREAM-610
…RulesEndpoint.get (#111230) Updates ISWF-2276.
…1232) Adds `http.response_status_code` as a resolved attribute with `search_type="integer"` in the EAP spans attribute definitions. Without this declaration, `http.response_status_code` is treated as a float, so groupBy values in timeseries queries appear as `200.0` instead of `200`. Declaring it as an integer ensures clean, non-fractional values when used as a groupBy key in dashboards and explore. Includes a test that requests `count()` grouped by `http.response_status_code` and verifies the groupBy values are correct. Fixes DAIN-1386 Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
…11237) The breakdown legend table is redundant in full screen mode since there is already a full data table rendered below the chart. Adds an `isFullScreen` prop to `VisualizationWidget` and passes it from the widget viewer modal to suppress the duplicate breakdown. ### Before <img width="1153" height="647" alt="image" src="https://github.com/user-attachments/assets/fd7d9051-2de4-4778-80d4-f2f5a96f3481" /> ### After <img width="1162" height="651" alt="image" src="https://github.com/user-attachments/assets/be2e7054-f97b-477f-84f7-ef8b170651b1" /> Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Adds analytics to autofix on explorer. For the most part, it re-uses existing analytic event names for backwards compatibility with existing pipelines. A few that are renamed/removed have been verified to not be referenced anywhere. --------- Co-authored-by: Claude Opus 4.6 <noreply@example.com>
- Moves Create Dashboard buttons to a dropdown menu when the ai dashboard generation feature flag is enabled - Renames option to `Create with Agent`
We recently had an incident where we exhausted all of our control-web resources because requests to the downstream applications became slow, and exhausted all available webserver capacity. These changes introduce a circuit breaker that will record failures from the proxied region requests. When enough errors are collected, the gateway will quickly return an error response. I've added two options that will allow controlled rollout of circuit breaker recording and enforcement. This will let me measure the impacts on redis and tweak the thresholds before enforcing the breaker limits. In looking into how effective this would have been for the recent incident, I noticed that the proxy gateway timeout is undefined, and that we have very high tail latencies. These changes also introduce an option backed timeout that I plan to use to bring down tail latency without impacting failure rates significantly. Refs [INFRENG-275](https://linear.app/getsentry/issue/INFRENG-275/investigate-circuit-breakers-for-apigateway-in-control-silo)
- Removes dependencies `prettier` and `@ianvs/prettier-plugin-sort-imports` - Adds dependency `oxfmt` - Renames scripts `lint:prettier` and `fix:prettier` to `lint:format` and `fix:format` - Updates pre-commit config to use `oxfmt` - Applies `oxfmt` formatting (nearly no diff, thanks to @evanpurkhiser's claude) ## Results Ran `hyperfine --warmup 1 --runs 3` against our existing `pnpm exec prettier` setup and this `pnpm exec oxfmt` setup. Formatter | Mean | Range | User CPU -- | -- | -- | -- prettier | 9.393s ± 0.285s | 9.065s – 9.571s | 84.4s oxfmt | 2.079s ± 0.131s | 1.973s – 2.225s | 15.2s `oxfmt` is **4.52x faster** than `prettier` across the full repo (~7,800 JS/TS files), uses **~5.5x less CPU time** (`15s` vs `84s` user time) thanks to much better parallelization efficiency --------- Co-authored-by: Evan Purkhiser <1421724+evanpurkhiser@users.noreply.github.com> Co-authored-by: getsantry[bot] <66042841+getsantry[bot]@users.noreply.github.com>
These filters are a bit ambiguous — they don't filter for issues that are 'linked' to other issues (we don't have any linking between issues), these refer to issues linked to external integration tickets. Co-authored-by: Claude <noreply@anthropic.com>
Enables `sortPackageJson` in `.oxfmtrc.json`
…atible (#111159) Redo of #110282 to make the rule stats and group history endpoints backwards compatible by being flexible enough to handle either a `Rule` or a `Workflow`. The previous PR was reverted because I incorrectly assumed `Rule` objects were using `RuleFireHistory`, but it is correct to continue to combine those results with `WorkflowFireHistory` for now. For both methods the basic logic is as follows: - If passed a workflow, try to fetch the rule ID via `AlertRuleWorkflow` and fetch combined results. If the workflow was single written, fetch `WorkflowFireHistory` results only. - If passed a rule, try to fetch the workflow via `AlertRuleWorkflow` and fetch combined results. If the rule for some reason doesn't have a workflow, fetch `RuleFireHistory` results only (this maintains the existing behavior).
#111244) This allows access to the new autofix endpoints when any of the following flags are enabled - seer-explorer - autofix-on-explorer - autofix-on-explorer-v2
Follow up to #109926 (comment) to increase test coverage for the issue alert rule POST endpoint backwards compatibility. Adding this test coverage uncovered a few inconsistencies that are fixed in this PR as well. Note that I will need to rebase off of #110807 once it is merged.
Previously, we used `@mdx-js/mdx` to compile `.mdx` files for Knip. Now, we use the [official `mdx` plugin](https://knip.dev/reference/plugins/mdx) and point it at our `tsconfig.mdx.json` file.
…111227) Adds L/R arrow key support for navigating through variants. If no variants, nothing happens.
Adds a routes script which outputs resolved sentry urls so that they can be bulk audited in dev mode. The script's primary use is something like `./scripts/routes.sh --orgId sentry` which will output all routes that contain the sentry orgId. Note: not all URLS are statically analyzable, so I've had an agent trace their values and hardcode them. Best effort detection is ok. --------- Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com> Co-authored-by: getsantry[bot] <66042841+getsantry[bot]@users.noreply.github.com> Co-authored-by: Cursor Agent <cursoragent@cursor.com> Co-authored-by: Jonas <JonasBa@users.noreply.github.com>
…cohort (#111240) This PR aims to clean up the seer settings experience for legacy and beta cohort users by showing them the new seer experience minus the overview tab. Basically, show these users the tab view minus the overview tab, and with the old automation tab, so they can still modify the same autofix settings they had previously. One minor discrepancy is the Github banner copy when you don't have the app installed, though for beta / legacy folks they should have it installed otherwise they wouldn't have been able to use the product today. Closes https://linear.app/getsentry/issue/CW-1061/change-seer-settings-page-pointer-frontend-to-new-seer-settings-page **existing new seer org** <img width="1327" height="1152" alt="Screenshot 2026-03-20 at 1 08 49 PM" src="https://github.com/user-attachments/assets/d313cf1f-3937-4546-82ac-75ca444e7d31" /> **new settings page on old seer org without gh app** <img width="1283" height="1070" alt="Screenshot 2026-03-20 at 1 11 17 PM" src="https://github.com/user-attachments/assets/3c079312-9b69-47e2-b2b7-7bc31d40fa91" /> <img width="1245" height="1060" alt="Screenshot 2026-03-20 at 1 11 22 PM" src="https://github.com/user-attachments/assets/91ce5028-4b49-4777-bf77-248f6a45289d" /> **new settings page on old seer org with gh app** <img width="1755" height="1066" alt="Screenshot 2026-03-20 at 1 08 15 PM" src="https://github.com/user-attachments/assets/debc4017-7c86-40e7-bda9-df4b3f243270" /> **Trialing org** <img width="1756" height="1120" alt="Screenshot 2026-03-20 at 2 18 28 PM" src="https://github.com/user-attachments/assets/44113af5-2653-4cde-bfaf-f464a7a6ace1" /> <!-- 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.
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 : )