diff --git a/static/app/views/dashboards/widgets/widget/widget.tsx b/static/app/views/dashboards/widgets/widget/widget.tsx
index 6de7cfb57dc78d..ae04ea6d5d063a 100644
--- a/static/app/views/dashboards/widgets/widget/widget.tsx
+++ b/static/app/views/dashboards/widgets/widget/widget.tsx
@@ -129,7 +129,7 @@ const TitleHoverItems = styled('div')`
transition: opacity 0.1s;
`;
-const Frame = styled('div')<{
+export const Frame = styled('div')<{
borderless?: boolean;
height?: number;
revealActions?: 'always' | 'hover';
diff --git a/static/app/views/insights/common/components/miniChartPanel.tsx b/static/app/views/insights/common/components/miniChartPanel.tsx
index ace145a68bea98..5d9afb0200adf9 100644
--- a/static/app/views/insights/common/components/miniChartPanel.tsx
+++ b/static/app/views/insights/common/components/miniChartPanel.tsx
@@ -1,8 +1,8 @@
import styled from '@emotion/styled';
-import Panel from 'sentry/components/panels/panel';
import {space} from 'sentry/styles/space';
import textStyles from 'sentry/styles/text';
+import {Frame} from 'sentry/views/dashboards/widgets/widget/widget';
type Props = {
children: React.ReactNode;
@@ -13,7 +13,7 @@ type Props = {
export default function MiniChartPanel({title, children, button, subtitle}: Props) {
return (
-
+
{(title || button || subtitle) && (
@@ -26,10 +26,14 @@ export default function MiniChartPanel({title, children, button, subtitle}: Prop
)}
{children}
-
+
);
}
+const StyledFrame = styled(Frame)`
+ height: 100%;
+`;
+
const ChartLabel = styled('p')`
/* @TODO(jonasbadalic) This should be a title component and not a p */
font-size: 1rem;
diff --git a/static/app/views/insights/mobile/appStarts/components/widgets.tsx b/static/app/views/insights/mobile/appStarts/components/widgets.tsx
index 674663c17f95c7..9d4678fe9e03a0 100644
--- a/static/app/views/insights/mobile/appStarts/components/widgets.tsx
+++ b/static/app/views/insights/mobile/appStarts/components/widgets.tsx
@@ -14,7 +14,7 @@ function SummaryWidgets({additionalFilters}: any) {
diff --git a/static/app/views/insights/mobile/screenload/components/charts/screenCharts.tsx b/static/app/views/insights/mobile/screenload/components/charts/screenCharts.tsx
index 73ae3ccf2e4b5c..fd3deee3f33644 100644
--- a/static/app/views/insights/mobile/screenload/components/charts/screenCharts.tsx
+++ b/static/app/views/insights/mobile/screenload/components/charts/screenCharts.tsx
@@ -9,12 +9,14 @@ import {t} from 'sentry/locale';
import {space} from 'sentry/styles/space';
import type {Series} from 'sentry/types/echarts';
import {defined} from 'sentry/utils';
-import {tooltipFormatterUsingAggregateOutputType} from 'sentry/utils/discover/charts';
+import {type EventsMetaType} from 'sentry/utils/discover/eventView';
import {MutableSearch} from 'sentry/utils/tokenizeSearch';
import {formatVersion} from 'sentry/utils/versions/formatVersion';
-import Chart, {ChartType} from 'sentry/views/insights/common/components/chart';
-import MiniChartPanel from 'sentry/views/insights/common/components/miniChartPanel';
+// TODO(release-drawer): Only used in mobile/screenload/components/
+// eslint-disable-next-line no-restricted-imports
+import {InsightsLineChartWidget} from 'sentry/views/insights/common/components/insightsLineChartWidget';
import {useMetrics} from 'sentry/views/insights/common/queries/useDiscover';
+import {type DiscoverSeries} from 'sentry/views/insights/common/queries/useDiscoverSeries';
import {useReleaseSelection} from 'sentry/views/insights/common/queries/useReleases';
import {useTopNMetricsMultiSeries} from 'sentry/views/insights/common/queries/useTopNDiscoverMultiSeries';
import {formatVersionAndCenterTruncate} from 'sentry/views/insights/common/utils/centerTruncate';
@@ -24,7 +26,6 @@ import useCrossPlatformProject from 'sentry/views/insights/mobile/common/queries
import {ScreensBarChart} from 'sentry/views/insights/mobile/screenload/components/charts/screenBarChart';
import {
CHART_TITLES,
- OUTPUT_TYPE,
YAXIS_COLUMNS,
} from 'sentry/views/insights/mobile/screenload/constants';
import {transformDeviceClassEvents} from 'sentry/views/insights/mobile/screenload/utils';
@@ -88,6 +89,8 @@ export function ScreenCharts({additionalFilters}: Props) {
useEap,
]);
+ const search = new MutableSearch(queryString);
+
const {
data: releaseSeriesArray,
isPending: isSeriesLoading,
@@ -101,7 +104,7 @@ export function ScreenCharts({additionalFilters}: Props) {
'avg(measurements.time_to_full_display)',
'count()',
],
- search: queryString,
+ search,
},
'api.starfish.mobile-screen-series'
);
@@ -118,9 +121,22 @@ export function ScreenCharts({additionalFilters}: Props) {
transformedReleaseSeries[YAXIS_COLUMNS[val]] = {};
});
- const ttidSeries: Series[] = [];
- const ttfdSeries: Series[] = [];
- const countSeries: Series[] = [];
+ const seriesMap: Record<
+ | 'avg(measurements.time_to_initial_display)'
+ | 'avg(measurements.time_to_full_display)'
+ | 'count()',
+ DiscoverSeries[]
+ > = {
+ 'avg(measurements.time_to_initial_display)': [],
+ 'avg(measurements.time_to_full_display)': [],
+ 'count()': [],
+ };
+
+ let chartAliases = {};
+ const meta: EventsMetaType = {
+ fields: {},
+ units: {},
+ };
if (defined(releaseSeriesArray)) {
releaseSeriesArray.forEach(release => {
@@ -128,20 +144,36 @@ export function ScreenCharts({additionalFilters}: Props) {
const isPrimary = releaseName === primaryRelease;
const colors = theme.chart.getColorPalette(3);
const color = isPrimary ? colors[0] : colors[1];
- ttidSeries.push({
- ...release.data['avg(measurements.time_to_initial_display)'],
- color,
- seriesName: formatVersion(releaseName, true),
- });
- ttfdSeries.push({
- ...release.data['avg(measurements.time_to_full_display)'],
- color,
- seriesName: formatVersion(releaseName, true),
- });
- countSeries.push({
- ...release.data['count()'],
- color,
- seriesName: formatVersion(releaseName, true),
+ const version = formatVersion(releaseName, true);
+
+ const seriesNames = [
+ 'avg(measurements.time_to_initial_display)',
+ 'avg(measurements.time_to_full_display)',
+ 'count()',
+ ] as const;
+
+ seriesNames.forEach(seriesName => {
+ const releaseSeries = release.data[seriesName];
+ const newSeriesName = `${seriesName} ${version}`;
+ chartAliases = {
+ ...chartAliases,
+ [newSeriesName]: version,
+ };
+
+ if (releaseSeries.meta?.fields[seriesName]) {
+ meta.fields[newSeriesName] = releaseSeries.meta?.fields[seriesName];
+ }
+
+ if (releaseSeries.meta?.units[seriesName]) {
+ meta.units[newSeriesName] = releaseSeries.meta?.units[seriesName];
+ }
+
+ seriesMap[seriesName].push({
+ data: releaseSeries.data,
+ meta,
+ color,
+ seriesName: newSeriesName,
+ });
});
});
}
@@ -181,146 +213,15 @@ export function ScreenCharts({additionalFilters}: Props) {
function renderCharts() {
return (
-
-
-
-
-
-
-
-
-
- tooltipFormatterUsingAggregateOutputType(
- value,
- OUTPUT_TYPE[YAxis.TTID]
- ),
- }}
- error={seriesError}
- />
-
-
-
-
-
-
-
-
-
-
- tooltipFormatterUsingAggregateOutputType(
- value,
- OUTPUT_TYPE[YAxis.TTFD]
- ),
- }}
- error={seriesError}
- />
-
-
-
-
-
-
+
-
- tooltipFormatterUsingAggregateOutputType(
- value,
- OUTPUT_TYPE[YAxis.COUNT]
- ),
- }}
- error={seriesError}
- />
-
-
-
+ : '',
+ },
+ ]}
+ chartKey="spansChart"
+ chartHeight={150}
+ isLoading={isDeviceClassEventsLoading}
+ />
+
+
+
+
+
);
}
@@ -364,18 +299,9 @@ export function ScreenCharts({additionalFilters}: Props) {
return {renderCharts()}
;
}
-const StyledRow = styled('div')`
- display: grid;
- grid-template-columns: repeat(2, 1fr);
- grid-column-gap: ${space(2)};
-`;
-
-const ChartsContainerItem = styled('div')`
- flex: 1;
-`;
-
-const Container = styled('div')`
+const ChartContainer = styled('div')`
display: grid;
- grid-template-columns: 2fr 1fr;
- grid-column-gap: ${space(2)};
+ grid-template-columns: repeat(3, 1fr);
+ gap: ${space(2)};
+ padding-bottom: ${space(2)};
`;
diff --git a/static/app/views/insights/mobile/screenload/constants.ts b/static/app/views/insights/mobile/screenload/constants.ts
index 9e527f111a367b..61b34e8d381cfd 100644
--- a/static/app/views/insights/mobile/screenload/constants.ts
+++ b/static/app/views/insights/mobile/screenload/constants.ts
@@ -1,5 +1,4 @@
import {t} from 'sentry/locale';
-import type {AggregationOutputType} from 'sentry/utils/discover/fields';
import type {MetricsProperty, SpanMetricsProperty} from 'sentry/views/insights/types';
export enum MobileCursors {
@@ -59,17 +58,3 @@ export const CHART_TITLES: Readonly> = {
[YAxis.FROZEN_FRAMES]: t('Frozen Frames'),
[YAxis.FRAMES_DELAY]: t('Frames Delay'),
};
-
-export const OUTPUT_TYPE: Readonly> = {
- [YAxis.WARM_START]: 'duration',
- [YAxis.COLD_START]: 'duration',
- [YAxis.TTID]: 'duration',
- [YAxis.TTFD]: 'duration',
- [YAxis.SLOW_FRAME_RATE]: 'percentage',
- [YAxis.FROZEN_FRAME_RATE]: 'percentage',
- [YAxis.THROUGHPUT]: 'number',
- [YAxis.COUNT]: 'number',
- [YAxis.SLOW_FRAMES]: 'number',
- [YAxis.FROZEN_FRAMES]: 'number',
- [YAxis.FRAMES_DELAY]: 'duration',
-};