Skip to content

[pull] master from getsentry:master#1804

Merged
pull[bot] merged 29 commits intoKingDEV95:masterfrom
getsentry:master
Mar 18, 2026
Merged

[pull] master from getsentry:master#1804
pull[bot] merged 29 commits intoKingDEV95:masterfrom
getsentry:master

Conversation

@pull
Copy link

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

szokeasaurusrex and others added 29 commits March 18, 2026 10:42
Thought this might be a good refactor, after [this
comment](#110760 (comment)),
to make it clear that we have a file for every checksum.

Co-authored-by: Joris Bayer <joris.bayer@sentry.io>
Initially, I included this change in #110856, but realized it's
technically an independent change, so I split it off.
This PR adds a mapping layer for when the backend sends a json
structure, so that we can render form fields with the new scraps form
system based on them.

A lot of field types are supported out of the box, and this PR also adds
3 custom fields for the following field types:

- choice_mapper
- project_mapper
- table

The `BackendJsonFormAdapter` is then used for `organizationIntegration`.
Filter `SdkUpdateAlert` to only match SDK updates relevant to the
current onboarding context.

The `/sdk-updates/` endpoint returns all SDKs with available updates for
a project. A project can receive events from multiple SDKs (e.g. a Flask
project that also receives Rust events). Previously, the component
picked the first entry regardless of relevance, which could show a
misleading update alert (e.g. suggesting a Rust SDK update on a Python
onboarding page).

Now the component accepts a `packageName` prop and uses
`getPackageNameFromSdkName` to match the response entry whose package
matches the onboarding context. If no matching SDK is found, no alert is
shown.

The callers (Python, Node, JavaScript agent monitoring onboarding)
already have `packageName` available and now pass it through.


closes
https://linear.app/getsentry/issue/TET-2095/update-sdk-instructions-wrong

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
…110845)

## Summary
- Remove the `useIsEAPTraceEnabled` hook that checked the
`trace-spans-format` feature flag — EAP is now the only trace code path
- Remove the `TraceMeta` type and simplify `useTraceMeta` to always use
EAP endpoints (`/trace-meta/`) and EAP response shape
- Remove the `traceType` parameter from `getTraceQueryParams`,
`getTargetIdParams`, `fetchTrace`, and `fetchAdditionalTraces` — always
use EAP endpoints (`/trace/`)
- Remove the non-EAP `events-trace/` query from `useTrace`
- Remove the `SampleButton` conditional in `onboarding.tsx` that was
gated behind the flag

From original [PR](#110623):
> - All relevant AM plans are now ingesting spans
> - SH is ingesting spans see [internal slack
link](https://sentry.slack.com/archives/C03FS3KJZ0R/p1772742481919559?thread_ts=1772723941.771909&cid=C03FS3KJZ0R)
so we should be safe to just always assume EAP is available here

---------

Co-authored-by: Claude Opus 4.6 <noreply@example.com>
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
…0842)

Add drag-and-drop reordering to the Visualize toolbar in Explore >
Traces, matching the pattern already used in the Group By toolbar.

When 2+ visualize items (charts or equations) are present, each toolbar
row shows a grabbable drag handle. Reordering the rows updates the URL
state, which automatically reorders the chart panels below since both
derive from the same query params.

Uses the existing `DragNDropContext` wrapper and `useSortable` hook with
`transition: null` (to avoid the drop animation glitch fixed in
#110676). No new dependencies.

<img width="967" height="452" alt="Screenshot of Explore > Traces with
an equation and a chart in Visualize, with drag-n-drop button
indicators"
src="https://github.com/user-attachments/assets/03780d77-a182-4581-abac-efa4ddce9f35"
/>


Fixes EXP-843

Made with [Cursor](https://cursor.com)
…110855)

Preserve logs group-by fields when adding a query to a dashboard via
"Add to Dashboard".

`constructAddQueryToDashboardLink` populates a widget's `columns` (which
carry group-by information for time-series charts) only for
`WidgetType.SPANS`, `WidgetType.TRACEMETRICS`, `DisplayType.TOP_N`, and
`DisplayModes.DAILYTOP5`. `WidgetType.LOGS` was missing from this
condition, so non-aggregate fields from the event view were silently
dropped — the resulting widget had no group-by.

This adds `WidgetType.LOGS` to both the `columns` population condition
in `constructAddQueryToDashboardLink` and the `displayType` derivation
in `handleAddQueryToDashboard` (so `DisplayType.BAR` is preserved
directly rather than being transformed through
`displayModeToDisplayType`).

Fixes DAIN-1125.

Made with [Cursor](https://cursor.com)
This PR addresses the `NoRetriesRemainingError` occurring in
`sentry.tasks.autofix.trigger_autofix_from_issue_summary`, which was
caused by an `AttributeError: 'str' object has no attribute 'value'`.

**Problem:**
When `AutofixStoppingPoint` and `AutofixReferrer` enum instances are
passed as parameters to the `_trigger_autofix_task` Celery task, the
Celery serialization process converts these enums into their string
representations (e.g., `'root_cause'`). Upon deserialization, the task
receives these parameters as plain strings, not as `StrEnum` objects.
Downstream functions, such as `trigger_autofix_explorer`, then attempt
to access the `.value` attribute on these string objects, leading to an
`AttributeError`.

**Solution:**
1. **Updated `_trigger_autofix_task` signature**: Modified the type
annotations for `stopping_point` and `referrer` parameters in
`src/sentry/seer/autofix/issue_summary.py` to `AutofixStoppingPoint |
str | None` and `AutofixReferrer | str` respectively. This clarifies
that the task can receive these parameters as either enum instances or
their string values after deserialization.
2. **Enum Reconstruction**: Added logic at the beginning of the
`_trigger_autofix_task` function to explicitly convert `stopping_point`
and `referrer` back into their respective `StrEnum` types if they are
received as strings. This ensures that by the time these parameters are
used by downstream functions, they are always proper enum instances.

This fix ensures that the task correctly handles the deserialization of
enum parameters, preventing the `AttributeError` and the subsequent task
retry exhaustion.

Fixes SENTRY-5AYM

### 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: Tony Xiao <txiao@sentry.io>
Tasks are defined using sentry.taskworker, but we are in the process of
converting to taskbroker-client. The taskbroker-client library uses its
internal constant values. To maintain compression behavior, we need to
shim the enum values.

Refs STREAM-610
SDK packages can be published without docs. We shouldn't fail when that
happens.

Fixes SENTRY-5M6Z
flakey test was causing failing deploys so i'm skipping it for now.
The GitHub Copilot Tasks API changed its response format — it no longer
wraps
responses in a `{"task": {...}}` envelope and instead returns the task
object
directly at the top level. This caused a pydantic `ValidationError` when
parsing the response (`task` field required but missing).

The `launch` method now checks whether the response contains a `"task"`
key
and parses accordingly, supporting both the new direct format and the
legacy
envelope for backward compatibility.

Verified the new format by calling the live API.

Fixes SENTRY-5M80


Agent transcript:
https://claudescope.sentry.dev/share/nnOwNScC5NRWw6cq33Lzb0wQLp42fKJ3uv1a5Lu2Vc0
Add an inherit variant to Text. The default to Text color is a rough
case here that we probably want to migrate away from, as it opts out of
the CSS cascade and forces us to provide an override.

I'm adding this as a temporary backwards compat so we can cleanly
opt-out of that mechanism without having it be the default behavior.

---------

Co-authored-by: Claude <noreply@anthropic.com>
Extend Text and Heading components with render prop support, matching
the APIs of Layout primitives

---------

Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: getsantry[bot] <66042841+getsantry[bot]@users.noreply.github.com>
…rds endpoint (#110903)

Right now, the validators on the dashboard artifacts are not actually
used (they're run in post, but we don't use the validation result).

Adds a completion hook to `OrganizationDashboardGenerateEndpoint`.
Whenever a seer run for generating a dashboard is complete, checks the
result dashboard artifact for any validation errors detected. If errors
are detected, re request dashboard generation.

This dashboard generation re request only happens up to 3 times
(determined by `MAX_VALIDATION_RETRIES`) on consecutive failures.
…ed (#110853)

Continues the expansion of the `no-default-exports` lint rule from
#110631. This checks in results from removing the _"ignore any file that
already has any named export"_ allowance. The changes to `export`s were
done by `pnpm lint:js --fix`. I again had Cursor fix up the issues for
`import`s.

The actual changes to the lint rule are in #110860. Note that the lint
rule still doesn’t report on dynamic expressions like `export default
memo(MyComponent)`. Those are trickier because consumers often take that
default export under the name of the internal component (`import
MyComponent from '...'`).

In `static/app` excluding mocks, this reduces:

* `export default \w+`: from ~800 to ~575
* `import \w+ from`: from ~5.6k to ~3.8k
Registering new `tracemetrics-ui-refresh` feature flag.
…hboard duplication (#110920)

Wraps the navigation target with `normalizeUrl` whoops! Otherwise the
sidebar doesn't correctly find the right secondary navigation.

Fixes DAIN-1336

Co-authored-by: Claude <noreply@anthropic.com>
…110914)

Removes all hard-coded `fieldMeta` percentage type annotations from
prebuilt dashboard widget configs.

These were added to mark certain equation fields (like error rates,
cache miss rates, slow/frozen frame percentages) as percentage-type so
they'd render correctly. However, `fieldMeta` is not propagated when a
dashboard is duplicated, so duplicated dashboards would lose the
formatting.

Rather than fix the propagation now, we're removing these hard-coded
values entirely and will revisit with a proper user-facing field
customization feature.

Refs DAIN-1340

Co-authored-by: Claude <noreply@anthropic.com>
…nditions (#110913)

Replace span-specific project flags with `firstTransactionEvent` for the
overview pre-built dashboard onboarding gate (frontend, backend,
Next.js, Laravel overviews).

Previously, the onboarding screen was gated on flags like
`hasInsightsVitals`, `hasInsightsAssets`, `hasInsightsDb`, and
`hasInsightsHttp` — which only become true when specific span types are
received. This was too restrictive: users who send custom spans with
different span types would never see the dashboard content even if they
had sent transactions.

Using `firstTransactionEvent` means the onboarding is hidden as soon as
any transaction has been received, which is the right signal for these
general overview dashboards.

Fixes DAIN-1362

---------

Co-authored-by: Claude <noreply@anthropic.com>
…t view (#110828)

Fixes long dashboard names overflowing their column in the dashboard
list view.

**Before:**
<img width="602" height="89" alt="Screenshot 2026-03-17 at 4 17 15 PM"
src="https://github.com/user-attachments/assets/93ae189e-0c96-4639-a8af-0e299e63a422"
/>

**After:**
<img width="645" height="81" alt="Screenshot 2026-03-17 at 4 17 12 PM"
src="https://github.com/user-attachments/assets/99f2c31e-a12e-4b14-86e7-eeff108db610"
/>


Fixes DAIN-1354
Co-Authored-By: Claude <noreply@anthropic.com>

---------

Co-authored-by: Claude <noreply@anthropic.com>
…d exports (#110860)

Corresponding lint rule changes for #110853.

Note that the lint rule still doesn’t report on dynamic expressions like
`export default memo(MyComponent)`. Those are trickier because consumers
often take that default export under the name of the internal component
(`import MyComponent from '...'`).
…hMutation instead of api.requestPromise directly (#110957)

Update dashboards generation sendMessage to use fetchMutation instead of
api.requestPromise directly
)

- Increase chat panel max height to 500px
- Move chat history blocks to its own `ChatHistory` memoized container
to prevent excessive rerendering
- Passes and displays `pendingUserInput` from session in the chat log
…ail metrics (#110958)

Calls the `POST dashboards/` endpoint with `validationOnly` to test
generated dashboard against backend serializer. Tracks a counter metric
for each success and fail.
To be used for adding GitLab support to Seer Code Reviews
…10908)

Imagine you add two filters for one chart with a group by:
<img width="483" height="144" alt="Screenshot 2026-03-17 at 3 21 42 PM"
src="https://github.com/user-attachments/assets/1b1371be-55fb-4132-806a-ebebfa479162"
/>

**Before:**
<img width="644" height="287" alt="Screenshot 2026-03-17 at 3 20 49 PM"
src="https://github.com/user-attachments/assets/b32f8bd1-ee08-4d00-8047-e71446267128"
/>

**After:**
<img width="562" height="277" alt="Screenshot 2026-03-17 at 3 21 04 PM"
src="https://github.com/user-attachments/assets/272069d9-006b-442b-abf7-bb42633cc865"
/>

We weren't disambiguating the legends at all between the two filters!
With this PR, if the queries don't have any aliases we prefix each
series by the query that filtered it, so at least the items are all kept
separate.

**Fix 1**: Widget query hooks now call `getSeriesQueryPrefix` after
`transformSeries` to prefix series names with prettified query
conditions when there are multiple queries and no alias. This happens in
the hooks (not the visualization component) because the hooks iterate
per-query and know which query produced each series — by the time series
reach the visualization layer, they're a flat array with no query
association.

**Fix 2**: Changed `columns.length > 1` to `columns.length > 0` in
`transformWidgetSeriesToTimeSeries` so the yAxis is appended whenever
there's at least one group-by column.

This is all destined to be updated very soon when we start using
`/events-timeseries/` in the Dashboard fetchers, since `TimeSeries`
objects preserve more context and we'll be able to consolidate all this
formatting.

Fixes DAIN-1305

---------

Co-authored-by: Claude <noreply@anthropic.com>
@pull pull bot locked and limited conversation to collaborators Mar 18, 2026
@pull pull bot added the ⤵️ pull label Mar 18, 2026
@pull pull bot merged commit ad453d7 into KingDEV95:master Mar 18, 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 18, 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.