Skip to content

[pull] master from getsentry:master#1811

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

[pull] master from getsentry:master#1811
pull[bot] merged 19 commits intoKingDEV95:masterfrom
getsentry:master

Conversation

@pull
Copy link
Copy Markdown

@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 : )

vgrozdanic and others added 3 commits March 20, 2026 08:49
This needs to happen anyways during start up time when each of these
modules gets loaded into the memory, so it's better to push this to
build time, and save some CPU when the containers are started

Signed-off-by: Vjeran Grozdanic <vjeran.grozdanic@sentry.io>
Remove `flex: 1` from `TableWrapper` so table rows keep their natural
height when there are few items, instead of stretching to fill the
entire widget card.

The `flex: 1` was added so the empty state would be vertically centered,
but it caused the wrapper to grow to fill its parent, which combined
with `height: 100%` and `grid-template-rows: auto 1fr` in the underlying
`GridEditable`, made data rows inflate to distribute the extra vertical
space. Removing it fixes the row inflation at the cost of the empty
state no longer being vertically centered — a follow-up can address that
separately.

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
@pull pull bot added the ⤵️ pull label Mar 20, 2026
@github-actions github-actions bot added the Scope: Frontend Automatically applied to PRs that change frontend components label Mar 20, 2026
…n sandbox (#110971)

- Don't show the message that the user is not an org on sandbox / demo
users. This can happen as a kind of race condition which we should fix
separately, but this fixes that sometimes users will see this when
visiting sandbox after visiting their org.
@github-actions github-actions bot added the Scope: Backend Automatically applied to PRs that change backend components label Mar 20, 2026
@github-actions
Copy link
Copy Markdown

🚨 Warning: This pull request contains Frontend and Backend changes!

It's discouraged to make changes to Sentry's Frontend and Backend in a single pull request. The Frontend and Backend are not atomically deployed. If the changes are interdependent of each other, they must be separated into two pull requests and be made forward or backwards compatible, such that the Backend or Frontend can be safely deployed independently.

Have questions? Please ask in the #discuss-dev-infra channel.

priscilawebdev and others added 15 commits March 20, 2026 11:12
Replace `useTheme()` called during `Storybook.story()` setup — which
runs at module initialization, outside any React component — with the
built-in `gap` prop that `ScrollCarousel` already supports.

The invalid hook call caused a TDZ error (`Cannot access 'c' before
initialization`) in production builds due to module evaluation order
differences.
Fix mobile layout issues in the trace details view.

**AI Spans tab**: Add `overflow-x: auto` to the wrapper so the table
scrolls horizontally on narrow screens instead of overflowing.

**Trace header highlights**: On mobile, `HeaderRow` switches to column
layout but children were centered (shrink-wrapped), so the
`ScrollCarousel` had no width constraint and couldn't scroll. Fix by
stretching children to full width. Also prevent highlight items from
shrinking (`flex: 0 0 auto`) so the gap between them is preserved —
the carousel handles overflow by scrolling instead.

**Header layout**: Add `flex-shrink: 0` to prevent the header from
collapsing when the trace content below is tall.


**Before**


https://github.com/user-attachments/assets/7f8c559d-9a59-491e-ac1d-c4a6fd19c953



**After**


https://github.com/user-attachments/assets/5716219f-a733-4370-9683-40864f863130
Prioritize fields with a known definition (via `getFieldDefinition`) to
the top of the group by dropdown in the Explore page.

Previously all fields were sorted purely alphabetically, making it hard
to find common fields like `span.op` or `span.description` among
potentially hundreds of custom tags. Now known fields sort first
(alphabetically within tier), followed by unknown/custom fields.

Also adds a custom search filter so that during search, known fields are
boosted above custom tags, and exact matches are boosted above partial
matches. Scoring: exact+known > exact+unknown > partial+known >
partial+unknown.

The `fieldDefinitionType` prop is threaded through
`ToolbarGroupByDropdown` so this works correctly for both spans
(`'span'`) and logs (`'log'`).

Refactors the logs toolbar to use the shared `useGroupByFields` hook
instead of duplicating inline option-building logic. This consolidates
known-fields-first sorting, `DISALLOWED_GROUP_BY_FIELDS` filtering
(`id`, `timestamp`), and groupBy injection (ensuring selected values
remain visible even when not in the tag collections) — all of which the
logs toolbar was previously missing.

Refs BROWSE-409

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

---------

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

Add temporary metrics to understand whether API callers send camelCase
or snake_case parameter keys. This emits an
`api.serializer.parameter_key_case` metric with key_case and serializer
tags from both CamelSnakeSerializer and CamelSnakeModelSerializer
__init__ methods.

The point of this is to investigate how customers actually use our APIs.
We want to see whether it is feasible to choose _one and only one_ way
of accepting API inputs.

The cardinality for this metric should be bounded because we have only
finite number of serializers.

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

Adds additional metadata to the metric selector side panel to give users
more context about a metric at a glance.

**Last seen** (`max(timestamp_precise)`) and **times seen**
(`count(metric.name)`) are now requested alongside the existing metric
options query and displayed in the detail panel. The `timestamp_precise`
value is stored in nanoseconds and is converted to milliseconds for
display.

**Attributes** are loaded lazily by fetching string, number, and boolean
attributes filtered to the selected metric. This is gated behind the
`tracemetrics-attributes-dropdown-side-panel` feature flag.
Hidden/internal fields are filtered out before display.

Also fixes long metric names overflowing the panel by adding
`wordBreak="break-all"`.

Closes LOGS-597, LOGS-598, and LOGS-596

Example side panel:
<img width="274" height="299" alt="Screenshot 2026-03-17 at 14 26 02"
src="https://github.com/user-attachments/assets/15acca7b-5473-42aa-9ae5-bddc32bb94b1"
/>

---------

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
Empty `field=` parameters in the Explore page URL (e.g.
`&field=timestamp&field=&field=parent_span`) cause validation errors
when saving a query, because the empty string is treated as a
required-but-blank field name.

This adds defense-in-depth filtering at both the read and write
boundaries:

- **Read**: `getFieldsFromLocation` now filters out empty strings after
`decodeList()`, so any stale `field=` in the URL is stripped before the
app sees it.
- **Write**: Both spans and logs `getTargetWithReadableQueryParams`
filter empty strings before writing fields back to the URL.

Fixes EXP-838
Removing the mutli-agg feature flag from registration.

Ticket: LOGS-610
…empty (#110634)

Both the `trace` and `trace-meta` endpoints default to a 14-day
`statsPeriod` when no timestamp is provided. When a user navigates to a
trace older than 14 days, both endpoints return empty data (zero counts
/ empty arrays) rather than an error, leaving the waterfall blank with
no indication of why.

This adds an automatic retry with a wider time window when a
`statsPeriod`-based request succeeds but returns empty data:

- `useTraceMeta`: retries the batch fetch with the wider period if all
requests succeeded but the aggregated meta has zero spans, errors, and
performance issues, and at least one trace has no timestamp anchor.
- `useTrace`: adds a conditional fallback query (for both EAP and
non-EAP paths) that fires only when the initial query resolves empty.

The retry period is driven by `useDefaultMaxPickableDays()`, or falls
back to 90 days. The retry is skipped entirely when the org's plan
retention is already at or below the default 14-day window.

Refs EXP-839

---------

Co-authored-by: Claude Sonnet 4 <noreply@example.com>
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
Update imports to reference taskbroker_client directly and remove the
re-export shims.

Requires getsentry/getsentry#19621
…110844)

Replaces the hand-rolled keyboard navigation and selection logic in the
trace metrics `MetricSelector` with React Aria's
`useListBox`/`useOption` primitives and `@react-stately/list` for state
management.

The previous implementation manually tracked a `focusedIndex`, handled
arrow key navigation, and clamped the index when the filtered list
shrank. This was fragile and didn't provide proper ARIA attributes on
options. React Aria gives us correct `role`, `aria-selected`, focus
management, and keyboard interaction out of the box.

Key changes:
- `useListBox` + `useOption` manage the listbox role and option focus
- `useListState` handles selection state, replacing manual index
tracking
- `useKeyboard` on the trigger opens the dropdown on ArrowDown/ArrowUp
- `useKeyboard` on the search input moves focus into the list on arrow
keys
- Extracted `MetricListBoxOption` component for each virtualized option
- Focus management on open/close is handled explicitly via
`onOpenChange`
- Removed the manual `focusedIndex` clamping effect

---------

Co-authored-by: Claude Sonnet 4 <noreply@example.com>
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-authored-by: Cursor Agent <cursoragent@cursor.com>
Co-authored-by: Nick <nsdeschenes@users.noreply.github.com>
- Move more of the code over
- Fix a bug where get_dataset isn't actually called with the same
dataset strings as the API, rather its a set list from
ExploreSavedQueryDataset, so define a new get_dataset function instead
Implements SizeContext scraps helper that facilitates setting default
sizing values in certain elements

---------

Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: Claude Sonnet 4 <noreply@example.com>
- We want to enable the new trace views for am1 customers so we
shouldn't restrict our endpoints behind a separate flag anymore
… in all dataset configs (#111194)

Ensure `getCustomFieldRenderer` passes `widget` and `dashboardFilters`
through to `getFieldRenderer` across all dataset configs that support
global filters. Previously only `errors` and `spans` forwarded these
parameters, causing linked dashboards to not work correctly for the
other datasets.

**Updated datasets:**
- `releases` — was ignoring both params
- `errorsAndTransactions` — was ignoring both params
- `logs` — was ignoring both params
- `traceMetrics` — was ignoring both params

No behavior change for `errors` and `spans` which already passed them
correctly.

Fixes BROWSE-458

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

`sentry.exclusive_time_ms` is used as a key for a few formula
definitions in the EAP spans dataset. It was intended to be used as a
placeholder for an attribute on every span for the purpose of counting
all spans. However, now that we rely on the span buffer and segment
enrichment to set this attribute, that isn't always true - the buffer
can be skipped or overrun, leading to unenriched spans. Replace these
uses with `sentry.duration_ms` (the span duration), which actually is
set on every span by definition.

Fixes BROWSE-455.
@pull pull bot merged commit 1fce51c into KingDEV95:master Mar 20, 2026
2 of 4 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

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.