Skip to content

[pull] master from getsentry:master#1812

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

[pull] master from getsentry:master#1812
pull[bot] merged 51 commits intoKingDEV95:masterfrom
getsentry:master

Conversation

@pull
Copy link

@pull pull bot commented Mar 20, 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 : )

alexsohn1126 and others added 30 commits March 20, 2026 12:05
…#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.
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
…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.
lynnagara and others added 21 commits March 20, 2026 11:34
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
…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.
@pull pull bot locked and limited conversation to collaborators Mar 20, 2026
@pull pull bot added the ⤵️ pull label Mar 20, 2026
@pull pull bot merged commit a9f159d into KingDEV95:master Mar 20, 2026
@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 20, 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.