@@ -12,18 +12,17 @@ import {ProjectPageFilter} from 'sentry/components/organizations/projectPageFilt
12
12
import { PageHeadingQuestionTooltip } from 'sentry/components/pageHeadingQuestionTooltip' ;
13
13
import { t } from 'sentry/locale' ;
14
14
import { space } from 'sentry/styles/space' ;
15
- import type { NewQuery } from 'sentry/types/organization' ;
16
- import { useDiscoverQuery } from 'sentry/utils/discover/discoverQuery' ;
17
- import EventView from 'sentry/utils/discover/eventView' ;
18
15
import { DiscoverDatasets } from 'sentry/utils/discover/types' ;
19
16
import { PageAlert , PageAlertProvider } from 'sentry/utils/performance/contexts/pageAlert' ;
20
17
import { MutableSearch } from 'sentry/utils/tokenizeSearch' ;
21
18
import { useLocation } from 'sentry/utils/useLocation' ;
22
19
import { useNavigate } from 'sentry/utils/useNavigate' ;
23
- import useOrganization from 'sentry/utils/useOrganization' ;
24
- import usePageFilters from 'sentry/utils/usePageFilters' ;
25
20
import { ModulePageProviders } from 'sentry/views/insights/common/components/modulePageProviders' ;
26
21
import { ModuleBodyUpsellHook } from 'sentry/views/insights/common/components/moduleUpsellHookWrapper' ;
22
+ import {
23
+ useMetrics ,
24
+ useSpanMetrics ,
25
+ } from 'sentry/views/insights/common/queries/useDiscover' ;
27
26
import { useMobileVitalsDrawer } from 'sentry/views/insights/common/utils/useMobileVitalsDrawer' ;
28
27
import useCrossPlatformProject from 'sentry/views/insights/mobile/common/queries/useCrossPlatformProject' ;
29
28
import { PlatformSelector } from 'sentry/views/insights/mobile/screenload/components/platformSelector' ;
@@ -53,7 +52,6 @@ function ScreensLandingPage() {
53
52
const moduleName = ModuleName . MOBILE_VITALS ;
54
53
const navigate = useNavigate ( ) ;
55
54
const location = useLocation ( ) ;
56
- const organization = useOrganization ( ) ;
57
55
const { isProjectCrossPlatform, selectedPlatform} = useCrossPlatformProject ( ) ;
58
56
59
57
const handleProjectChange = useCallback ( ( ) => {
@@ -67,9 +65,8 @@ function ScreensLandingPage() {
67
65
{ replace : true }
68
66
) ;
69
67
} , [ location , navigate ] ) ;
70
- const { selection} = usePageFilters ( ) ;
71
68
72
- const vitalItems : VitalItem [ ] = [
69
+ const vitalItems = [
73
70
{
74
71
title : t ( 'Avg. Cold App Start' ) ,
75
72
description : t ( 'Average Cold App Start duration' ) ,
@@ -86,7 +83,7 @@ function ScreensLandingPage() {
86
83
'https://docs.sentry.io/platforms/android/tracing/instrumentation/automatic-instrumentation/#app-start-instrumentation' ,
87
84
iOS : 'https://docs.sentry.io/platforms/apple/guides/ios/tracing/instrumentation/automatic-instrumentation/#app-start-tracing' ,
88
85
} ,
89
- field : 'avg(measurements.app_start_cold)' ,
86
+ field : 'avg(measurements.app_start_cold)' as const ,
90
87
dataset : DiscoverDatasets . METRICS ,
91
88
getStatus : getColdAppStartPerformance ,
92
89
} ,
@@ -106,7 +103,7 @@ function ScreensLandingPage() {
106
103
'https://docs.sentry.io/platforms/android/tracing/instrumentation/automatic-instrumentation/#app-start-instrumentation' ,
107
104
iOS : 'https://docs.sentry.io/platforms/apple/guides/ios/tracing/instrumentation/automatic-instrumentation/#app-start-tracing' ,
108
105
} ,
109
- field : 'avg(measurements.app_start_warm)' ,
106
+ field : 'avg(measurements.app_start_warm)' as const ,
110
107
dataset : DiscoverDatasets . METRICS ,
111
108
getStatus : getWarmAppStartPerformance ,
112
109
} ,
@@ -123,7 +120,7 @@ function ScreensLandingPage() {
123
120
'https://docs.sentry.io/platforms/android/tracing/instrumentation/automatic-instrumentation/#slow-and-frozen-frames' ,
124
121
iOS : 'https://docs.sentry.io/platforms/apple/guides/ios/tracing/instrumentation/automatic-instrumentation/#slow-and-frozen-frames' ,
125
122
} ,
126
- field : `division(mobile.slow_frames,mobile.total_frames)` ,
123
+ field : `division(mobile.slow_frames,mobile.total_frames)` as const ,
127
124
dataset : DiscoverDatasets . SPANS_METRICS ,
128
125
getStatus : getDefaultMetricPerformance ,
129
126
} ,
@@ -140,7 +137,7 @@ function ScreensLandingPage() {
140
137
'https://docs.sentry.io/platforms/android/tracing/instrumentation/automatic-instrumentation/#slow-and-frozen-frames' ,
141
138
iOS : 'https://docs.sentry.io/platforms/apple/guides/ios/tracing/instrumentation/automatic-instrumentation/#slow-and-frozen-frames' ,
142
139
} ,
143
- field : `division(mobile.frozen_frames,mobile.total_frames)` ,
140
+ field : `division(mobile.frozen_frames,mobile.total_frames)` as const ,
144
141
dataset : DiscoverDatasets . SPANS_METRICS ,
145
142
getStatus : getDefaultMetricPerformance ,
146
143
} ,
@@ -159,7 +156,7 @@ function ScreensLandingPage() {
159
156
'https://docs.sentry.io/platforms/android/tracing/instrumentation/automatic-instrumentation/#slow-and-frozen-frames' ,
160
157
iOS : 'https://docs.sentry.io/platforms/apple/guides/ios/tracing/instrumentation/automatic-instrumentation/#slow-and-frozen-frames' ,
161
158
} ,
162
- field : `avg(mobile.frames_delay)` ,
159
+ field : `avg(mobile.frames_delay)` as const ,
163
160
dataset : DiscoverDatasets . SPANS_METRICS ,
164
161
getStatus : getDefaultMetricPerformance ,
165
162
} ,
@@ -177,7 +174,7 @@ function ScreensLandingPage() {
177
174
'https://docs.sentry.io/platforms/android/tracing/instrumentation/automatic-instrumentation/#time-to-initial-display' ,
178
175
iOS : 'https://docs.sentry.io/platforms/apple/features/experimental-features/' ,
179
176
} ,
180
- field : `avg(measurements.time_to_initial_display)` ,
177
+ field : `avg(measurements.time_to_initial_display)` as const ,
181
178
dataset : DiscoverDatasets . METRICS ,
182
179
getStatus : getDefaultMetricPerformance ,
183
180
} ,
@@ -195,98 +192,51 @@ function ScreensLandingPage() {
195
192
'https://docs.sentry.io/platforms/android/tracing/instrumentation/automatic-instrumentation/#time-to-full-display' ,
196
193
iOS : 'https://docs.sentry.io/platforms/apple/features/experimental-features/' ,
197
194
} ,
198
- field : `avg(measurements.time_to_full_display)` ,
195
+ field : `avg(measurements.time_to_full_display)` as const ,
199
196
dataset : DiscoverDatasets . METRICS ,
200
197
getStatus : getDefaultMetricPerformance ,
201
198
} ,
202
- ] ;
199
+ ] satisfies VitalItem [ ] ;
200
+
201
+ const metricsFields = vitalItems
202
+ . filter ( item => item . dataset === DiscoverDatasets . METRICS )
203
+ . map ( item => item . field ) ;
204
+
205
+ const spanMetricsFields = vitalItems
206
+ . filter ( item => item . dataset === DiscoverDatasets . SPANS_METRICS )
207
+ . map ( item => item . field ) ;
203
208
204
- const metricsFields : string [ ] = [ ] ;
205
- const spanMetricsFields : string [ ] = [ ] ;
206
209
const [ state , setState ] = useState < {
207
210
status : VitalStatus | undefined ;
208
211
vital : VitalItem | undefined ;
209
212
} > ( { status : undefined , vital : undefined } ) ;
210
213
211
- vitalItems . forEach ( element => {
212
- if ( element . dataset === DiscoverDatasets . METRICS ) {
213
- metricsFields . push ( element . field ) ;
214
- } else if ( element . dataset === DiscoverDatasets . SPANS_METRICS ) {
215
- spanMetricsFields . push ( element . field ) ;
216
- }
217
- } ) ;
218
-
219
214
const query = new MutableSearch ( [ 'transaction.op:ui.load' ] ) ;
220
215
if ( isProjectCrossPlatform ) {
221
216
query . addFilterValue ( 'os.name' , selectedPlatform ) ;
222
217
}
223
- const metricsQuery : NewQuery = {
224
- name : '' ,
225
- fields : metricsFields ,
226
- query : query . formatString ( ) ,
227
- dataset : DiscoverDatasets . METRICS ,
228
- version : 2 ,
229
- projects : selection . projects ,
230
- } ;
231
- const metricsQueryView : EventView = EventView . fromNewQueryWithLocation (
232
- metricsQuery ,
233
- location
234
- ) ;
235
-
236
- const metricsResult = useDiscoverQuery ( {
237
- eventView : metricsQueryView ,
238
- location,
239
- cursor : '' ,
240
- orgSlug : organization . slug ,
241
- limit : 25 ,
242
- referrer : Referrer . SCREENS_METRICS ,
243
- } ) ;
244
218
245
- const spanMetricsQuery : NewQuery = {
246
- name : '' ,
247
- fields : spanMetricsFields ,
248
- query : query . formatString ( ) ,
249
- dataset : DiscoverDatasets . SPANS_METRICS ,
250
- version : 2 ,
251
- projects : selection . projects ,
252
- } ;
253
-
254
- const spanMetricsQueryView = EventView . fromNewQueryWithLocation (
255
- spanMetricsQuery ,
256
- location
219
+ const metricsResult = useMetrics (
220
+ {
221
+ search : query ,
222
+ limit : 25 ,
223
+ fields : metricsFields ,
224
+ } ,
225
+ Referrer . SCREENS_METRICS
257
226
) ;
258
227
259
- const spanMetricsResult = useDiscoverQuery ( {
260
- eventView : spanMetricsQueryView ,
261
- location,
262
- cursor : '' ,
263
- orgSlug : organization . slug ,
264
- limit : 25 ,
265
- referrer : Referrer . SCREENS_METRICS ,
266
- } ) ;
267
-
268
- const metricValueFor = ( item : VitalItem ) : MetricValue | undefined => {
269
- const dataset =
270
- item . dataset === DiscoverDatasets . METRICS ? metricsResult : spanMetricsResult ;
271
-
272
- if ( dataset . data ) {
273
- const row = dataset . data . data [ 0 ] ! ;
274
- const units = dataset . data . meta ?. units ;
275
- const fieldTypes = dataset . data . meta ?. fields ;
276
-
277
- const value = row ?. [ item . field ] ;
278
- const unit = units ?. [ item . field ] ;
279
- const fieldType = fieldTypes ?. [ item . field ] ;
280
-
281
- return {
282
- type : fieldType ,
283
- unit,
284
- value,
285
- } ;
286
- }
228
+ const spanMetricsResult = useSpanMetrics (
229
+ {
230
+ search : query ,
231
+ limit : 25 ,
232
+ fields : spanMetricsFields ,
233
+ } ,
234
+ Referrer . SCREENS_METRICS
235
+ ) ;
287
236
288
- return undefined ;
289
- } ;
237
+ const metricsData = { ...metricsResult . data [ 0 ] , ...spanMetricsResult . data [ 0 ] } ;
238
+ const metaUnits = { ...metricsResult . meta ?. units , ...spanMetricsResult . meta ?. units } ;
239
+ const metaFields = { ...metricsResult . meta ?. fields , ...spanMetricsResult . meta ?. fields } ;
290
240
291
241
const { openVitalsDrawer} = useMobileVitalsDrawer ( {
292
242
Component : < VitalDetailPanel vital = { state . vital } status = { state . status } /> ,
@@ -334,7 +284,12 @@ function ScreensLandingPage() {
334
284
< Container >
335
285
< Flex data-test-id = "mobile-vitals-top-metrics" >
336
286
{ vitalItems . map ( item => {
337
- const metricValue = metricValueFor ( item ) ;
287
+ const metricValue : MetricValue = {
288
+ type : metaFields ?. [ item . field ] ,
289
+ value : metricsData ?. [ item . field ] ,
290
+ unit : metaUnits ?. [ item . field ] ,
291
+ } ;
292
+
338
293
const status =
339
294
( metricValue && item . getStatus ( metricValue , item . field ) ) ??
340
295
STATUS_UNKNOWN ;
0 commit comments