Skip to content

feat(preprod): add preprod dashboard frontend#105919

Merged
trevor-e merged 54 commits intomasterfrom
telkins/app-size-dashboard-frontend
Jan 21, 2026
Merged

feat(preprod): add preprod dashboard frontend#105919
trevor-e merged 54 commits intomasterfrom
telkins/app-size-dashboard-frontend

Conversation

@trevor-e
Copy link
Member

@trevor-e trevor-e commented Jan 8, 2026

Adds support for a new Mobile Builds dataset within the custom widget builder UI. I created a new flag to hide this functionality for now.

Screenshot 2026-01-14 at 1 16 31 PM Screenshot 2026-01-14 at 1 29 04 PM Screenshot 2026-01-14 at 1 28 59 PM Screenshot 2026-01-14 at 1 28 53 PM Screenshot 2026-01-12 at 2 10 00 PM

trevor-e and others added 19 commits January 7, 2026 15:21
Add EAP dataset support for mobile app size metrics:
- PreprodSize class with automatic sub_item_type filtering
- Aggregate definitions (max) for size metrics
- Attribute definitions for app_id, app_name, build_version, etc.
- Referrer for preprod size queries
- Test case base class for preprod size metrics testing
- Backend tests for events-stats endpoint
Add frontend support for mobile app size metrics dashboard:
- MobileAppSizeConfig dataset configuration
- MobileAppSizeFilters component for widget builder
- Dataset selector with Mobile Builds option (alphabetically ordered)
- Integration with EAP trace item search query builder
- Support for max(max_install_size) and max(max_download_size) aggregates
- Widget builder slideout modifications for preprodSize dataset
- Tests for MobileAppSizeConfig
@trevor-e trevor-e requested review from a team as code owners January 8, 2026 17:04
@trevor-e trevor-e changed the base branch from master to telkins/app-size-dashboard-backend January 8, 2026 17:04
@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 Jan 8, 2026
@github-actions
Copy link
Contributor

github-actions bot commented Jan 8, 2026

🚨 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.

if (itemType === TraceItemDataset.SPANS) {
return SENTRY_SPAN_STRING_TAGS;
}
if (itemType === TraceItemDataset.PREPROD) {
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

fwiw all of these implicit configs are not super discoverable, it would be nice to have an exhaustive enum that forces us to handle every case.

Copy link
Member

@gggritso gggritso left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cool, LGTM! I left a few comments, but it's mostly me mulling the differences between this dataset and the others. Besides, the differences are isolated to the dataset config (the system works!) I think this is good to go. Thanks for bearing with us on this 👍🏻


if (isEventsStats(data)) {
const seriesData = data.data
.filter(
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

IMO time suddenly becoming non-linear is a worse expectation break than people seeing "0" on the chart, but this is going to be moot soon anyway, since the updated charts are in EA right now and will hopefully GA soon.

At that point, we'll need to remove this logic completely and we can use the helpers. I'm going to file a ticket to take a look at that later.

Also worth mentioning that this kind of expectation break of X axis gaps may be harmful in other places. We have code that infers the size of the time series buckets from the first few points, for example, which might break, and so on.

Comment on lines 90 to 108
// Only add numeric size fields for use in aggregate functions
// String fields like app_id, app_name, build_version are only used
// for filtering and will be available via the search bar
const mobileAppSizeFields: Record<string, FieldValueOption> = {
'field:install_size': {
label: 'Install Size',
value: {
kind: FieldValueKind.TAG,
meta: {name: 'install_size', dataType: 'number'},
},
},
'field:download_size': {
label: 'Download Size',
value: {
kind: FieldValueKind.TAG,
meta: {name: 'download_size', dataType: 'number'},
},
},
};
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think that's okay but for what it's worth I think that only makes sense because you're artificially limiting which aggregations are available. In other cases we show all the options and grey out whichever are not supported by the current aggregate, which is nicer because if someone changes the aggregate the fields might become available. Worth considering this, since I think you could enable the other aggregates! People can decide for themselves what they want to aggregate, no?

Image

# Conflicts:
#	static/app/views/explore/constants.tsx
#	static/app/views/explore/contexts/traceItemAttributeContext.tsx
Copy link
Contributor

@cursor cursor bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes and found 1 potential issue.

Bugbot Autofix is OFF. To automatically fix reported issues with Cloud Agents, enable Autofix in the Cursor dashboard.

state.dataset === WidgetType.LOGS ||
state.dataset === WidgetType.TRACEMETRICS
state.dataset === WidgetType.TRACEMETRICS ||
state.dataset === WidgetType.PREPROD_APP_SIZE
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Missing PREPROD_APP_SIZE in EAP type check

Low Severity

The isEAPType check in buildSteps/groupByStep/groupBySelector.tsx includes WidgetType.SPANS, WidgetType.LOGS, and WidgetType.TRACEMETRICS, but not the newly added WidgetType.PREPROD_APP_SIZE. This causes the TypeBadge component (which renders attribute type labels like "string"/"number") to not appear for PREPROD_APP_SIZE fields in the group by selector, creating an inconsistent UI compared to other EAP-based widget types.

Fix in Cursor Fix in Web

@trevor-e trevor-e merged commit 3dfab85 into master Jan 21, 2026
53 checks passed
@trevor-e trevor-e deleted the telkins/app-size-dashboard-frontend branch January 21, 2026 16:29
@github-actions github-actions bot locked and limited conversation to collaborators Feb 6, 2026
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

Scope: Frontend Automatically applied to PRs that change frontend components

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants