widgetDefinitions.tsx 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443
  1. import {CHART_PALETTE} from 'sentry/constants/chartPalette';
  2. import {t} from 'sentry/locale';
  3. import type {Organization} from 'sentry/types/organization';
  4. import {SPAN_OP_BREAKDOWN_FIELDS} from 'sentry/utils/discover/fields';
  5. import {DATA_TYPE_PLURAL as RESOURCES_DATA_TYPE_PLURAL} from 'sentry/views/insights/browser/resources/settings';
  6. import {DATA_TYPE_PLURAL as QUERIES_DATA_TYPE_PLURAL} from 'sentry/views/insights/database/settings';
  7. import {getTermHelp, PerformanceTerm} from '../../data';
  8. import {GenericPerformanceWidgetDataType} from './types';
  9. export interface ChartDefinition {
  10. dataType: GenericPerformanceWidgetDataType;
  11. fields: string[];
  12. // Additional fields to get requested but are not directly used in visualization.
  13. title: string;
  14. titleTooltip: string;
  15. // The first field in the list will be treated as the primary field in most widgets (except for special casing).
  16. allowsOpenInDiscover?: boolean;
  17. chartColor?: string;
  18. secondaryFields?: string[]; // Optional. Will default to colors depending on placement in list or colors from the chart itself.
  19. vitalStops?: {
  20. meh: number;
  21. poor: number;
  22. };
  23. }
  24. export enum PerformanceWidgetSetting {
  25. DURATION_HISTOGRAM = 'duration_histogram',
  26. LCP_HISTOGRAM = 'lcp_histogram',
  27. FCP_HISTOGRAM = 'fcp_histogram',
  28. FID_HISTOGRAM = 'fid_histogram',
  29. APDEX_AREA = 'apdex_area',
  30. P50_DURATION_AREA = 'p50_duration_area',
  31. P75_DURATION_AREA = 'p75_duration_area',
  32. P95_DURATION_AREA = 'p95_duration_area',
  33. P99_DURATION_AREA = 'p99_duration_area',
  34. P75_LCP_AREA = 'p75_lcp_area',
  35. TPM_AREA = 'tpm_area',
  36. FAILURE_RATE_AREA = 'failure_rate_area',
  37. USER_MISERY_AREA = 'user_misery_area',
  38. WORST_LCP_VITALS = 'worst_lcp_vitals',
  39. WORST_FCP_VITALS = 'worst_fcp_vitals',
  40. WORST_CLS_VITALS = 'worst_cls_vitals',
  41. WORST_FID_VITALS = 'worst_fid_vitals',
  42. MOST_CHANGED = 'most_changed',
  43. MOST_IMPROVED = 'most_improved',
  44. MOST_REGRESSED = 'most_regressed',
  45. MOST_RELATED_ERRORS = 'most_related_errors',
  46. MOST_RELATED_ISSUES = 'most_related_issues',
  47. MOST_TIME_SPENT_DB_QUERIES = 'most_time_spent_db_queries',
  48. HIGHEST_OPPORTUNITY_PAGES = 'highest_opportunity_pages',
  49. SLOW_HTTP_OPS = 'slow_http_ops',
  50. SLOW_DB_OPS = 'slow_db_ops',
  51. SLOW_RESOURCE_OPS = 'slow_resource_ops',
  52. SLOW_BROWSER_OPS = 'slow_browser_ops',
  53. COLD_STARTUP_AREA = 'cold_startup_area',
  54. WARM_STARTUP_AREA = 'warm_startup_area',
  55. SLOW_FRAMES_AREA = 'slow_frames_area',
  56. FROZEN_FRAMES_AREA = 'frozen_frames_area',
  57. MOST_SLOW_FRAMES = 'most_slow_frames',
  58. MOST_FROZEN_FRAMES = 'most_frozen_frames',
  59. SPAN_OPERATIONS = 'span_operations',
  60. TIME_TO_INITIAL_DISPLAY = 'time_to_initial_display',
  61. TIME_TO_FULL_DISPLAY = 'time_to_full_display',
  62. OVERALL_PERFORMANCE_SCORE = 'overall_performance_score',
  63. MOST_TIME_CONSUMING_RESOURCES = 'most_time_consuming_resources',
  64. MOST_TIME_CONSUMING_DOMAINS = 'most_time_consuming_domains',
  65. SLOW_SCREENS_BY_TTID = 'slow_screens_by_ttid',
  66. SLOW_SCREENS_BY_COLD_START = 'slow_screens_by_cold_start',
  67. SLOW_SCREENS_BY_WARM_START = 'slow_screens_by_warm_start',
  68. HIGHEST_CACHE_MISS_RATE_TRANSACTIONS = 'highest_cache__miss_rate_transactions',
  69. }
  70. const WIDGET_PALETTE = CHART_PALETTE[5];
  71. export const WIDGET_DEFINITIONS: ({
  72. organization,
  73. }: {
  74. organization: Organization;
  75. }) => Record<PerformanceWidgetSetting, ChartDefinition> = ({
  76. organization,
  77. }: {
  78. organization: Organization;
  79. }) => {
  80. return {
  81. [PerformanceWidgetSetting.DURATION_HISTOGRAM]: {
  82. title: t('Duration Distribution'),
  83. titleTooltip: getTermHelp(organization, PerformanceTerm.DURATION_DISTRIBUTION),
  84. fields: ['transaction.duration'],
  85. dataType: GenericPerformanceWidgetDataType.HISTOGRAM,
  86. chartColor: WIDGET_PALETTE[5],
  87. },
  88. [PerformanceWidgetSetting.LCP_HISTOGRAM]: {
  89. title: t('LCP Distribution'),
  90. titleTooltip: getTermHelp(organization, PerformanceTerm.DURATION_DISTRIBUTION),
  91. fields: ['measurements.lcp'],
  92. dataType: GenericPerformanceWidgetDataType.HISTOGRAM,
  93. chartColor: WIDGET_PALETTE[5],
  94. },
  95. [PerformanceWidgetSetting.FCP_HISTOGRAM]: {
  96. title: t('FCP Distribution'),
  97. titleTooltip: getTermHelp(organization, PerformanceTerm.DURATION_DISTRIBUTION),
  98. fields: ['measurements.fcp'],
  99. dataType: GenericPerformanceWidgetDataType.HISTOGRAM,
  100. chartColor: WIDGET_PALETTE[5],
  101. },
  102. [PerformanceWidgetSetting.FID_HISTOGRAM]: {
  103. title: t('FID Distribution'),
  104. titleTooltip: getTermHelp(organization, PerformanceTerm.DURATION_DISTRIBUTION),
  105. fields: ['measurements.fid'],
  106. dataType: GenericPerformanceWidgetDataType.HISTOGRAM,
  107. chartColor: WIDGET_PALETTE[5],
  108. },
  109. [PerformanceWidgetSetting.WORST_LCP_VITALS]: {
  110. title: t('Worst LCP Web Vitals'),
  111. titleTooltip: getTermHelp(organization, PerformanceTerm.LCP),
  112. fields: ['measurements.lcp'],
  113. vitalStops: {
  114. poor: 4000,
  115. meh: 2500,
  116. },
  117. dataType: GenericPerformanceWidgetDataType.VITALS,
  118. },
  119. [PerformanceWidgetSetting.WORST_FCP_VITALS]: {
  120. title: t('Worst FCP Web Vitals'),
  121. titleTooltip: getTermHelp(organization, PerformanceTerm.FCP),
  122. fields: ['measurements.fcp'],
  123. vitalStops: {
  124. poor: 3000,
  125. meh: 1000,
  126. },
  127. dataType: GenericPerformanceWidgetDataType.VITALS,
  128. },
  129. [PerformanceWidgetSetting.WORST_FID_VITALS]: {
  130. title: t('Worst FID Web Vitals'),
  131. titleTooltip: getTermHelp(organization, PerformanceTerm.FID),
  132. fields: ['measurements.fid'],
  133. vitalStops: {
  134. poor: 300,
  135. meh: 100,
  136. },
  137. dataType: GenericPerformanceWidgetDataType.VITALS,
  138. },
  139. [PerformanceWidgetSetting.WORST_CLS_VITALS]: {
  140. title: t('Worst CLS Web Vitals'),
  141. titleTooltip: getTermHelp(organization, PerformanceTerm.CLS),
  142. fields: ['measurements.cls'],
  143. vitalStops: {
  144. poor: 0.25,
  145. meh: 0.1,
  146. },
  147. dataType: GenericPerformanceWidgetDataType.VITALS,
  148. },
  149. [PerformanceWidgetSetting.TPM_AREA]: {
  150. title: t('Transactions Per Minute'),
  151. titleTooltip: getTermHelp(organization, PerformanceTerm.TPM),
  152. fields: ['tpm()'],
  153. dataType: GenericPerformanceWidgetDataType.AREA,
  154. chartColor: WIDGET_PALETTE[1],
  155. allowsOpenInDiscover: true,
  156. },
  157. [PerformanceWidgetSetting.APDEX_AREA]: {
  158. title: t('Apdex'),
  159. titleTooltip: getTermHelp(organization, PerformanceTerm.APDEX),
  160. fields: ['apdex()'],
  161. dataType: GenericPerformanceWidgetDataType.AREA,
  162. chartColor: WIDGET_PALETTE[4],
  163. allowsOpenInDiscover: true,
  164. },
  165. [PerformanceWidgetSetting.P50_DURATION_AREA]: {
  166. title: t('p50 Duration'),
  167. titleTooltip: getTermHelp(organization, PerformanceTerm.P50),
  168. fields: ['p50(transaction.duration)'],
  169. dataType: GenericPerformanceWidgetDataType.AREA,
  170. chartColor: WIDGET_PALETTE[3],
  171. allowsOpenInDiscover: true,
  172. },
  173. [PerformanceWidgetSetting.P75_DURATION_AREA]: {
  174. title: t('p75 Duration'),
  175. titleTooltip: getTermHelp(organization, PerformanceTerm.P75),
  176. fields: ['p75(transaction.duration)'],
  177. dataType: GenericPerformanceWidgetDataType.AREA,
  178. chartColor: WIDGET_PALETTE[3],
  179. allowsOpenInDiscover: true,
  180. },
  181. [PerformanceWidgetSetting.P95_DURATION_AREA]: {
  182. title: t('p95 Duration'),
  183. titleTooltip: getTermHelp(organization, PerformanceTerm.P95),
  184. fields: ['p95(transaction.duration)'],
  185. dataType: GenericPerformanceWidgetDataType.AREA,
  186. chartColor: WIDGET_PALETTE[3],
  187. allowsOpenInDiscover: true,
  188. },
  189. [PerformanceWidgetSetting.P99_DURATION_AREA]: {
  190. title: t('p99 Duration'),
  191. titleTooltip: getTermHelp(organization, PerformanceTerm.P99),
  192. fields: ['p99(transaction.duration)'],
  193. dataType: GenericPerformanceWidgetDataType.AREA,
  194. chartColor: WIDGET_PALETTE[3],
  195. allowsOpenInDiscover: true,
  196. },
  197. [PerformanceWidgetSetting.P75_LCP_AREA]: {
  198. title: t('p75 LCP'),
  199. titleTooltip: getTermHelp(organization, PerformanceTerm.P75),
  200. fields: ['p75(measurements.lcp)'],
  201. dataType: GenericPerformanceWidgetDataType.AREA,
  202. chartColor: WIDGET_PALETTE[1],
  203. allowsOpenInDiscover: true,
  204. },
  205. [PerformanceWidgetSetting.FAILURE_RATE_AREA]: {
  206. title: t('Failure Rate'),
  207. titleTooltip: getTermHelp(organization, PerformanceTerm.FAILURE_RATE),
  208. fields: ['failure_rate()'],
  209. dataType: GenericPerformanceWidgetDataType.AREA,
  210. chartColor: WIDGET_PALETTE[2],
  211. allowsOpenInDiscover: true,
  212. },
  213. [PerformanceWidgetSetting.USER_MISERY_AREA]: {
  214. title: t('User Misery'),
  215. titleTooltip: getTermHelp(organization, PerformanceTerm.USER_MISERY),
  216. fields: [`user_misery()`],
  217. dataType: GenericPerformanceWidgetDataType.AREA,
  218. chartColor: WIDGET_PALETTE[0],
  219. allowsOpenInDiscover: true,
  220. },
  221. [PerformanceWidgetSetting.COLD_STARTUP_AREA]: {
  222. title: t('Cold Startup Time'),
  223. titleTooltip: getTermHelp(organization, PerformanceTerm.APP_START_COLD),
  224. fields: ['p75(measurements.app_start_cold)'],
  225. dataType: GenericPerformanceWidgetDataType.AREA,
  226. chartColor: WIDGET_PALETTE[4],
  227. allowsOpenInDiscover: true,
  228. },
  229. [PerformanceWidgetSetting.WARM_STARTUP_AREA]: {
  230. title: t('Warm Startup Time'),
  231. titleTooltip: getTermHelp(organization, PerformanceTerm.APP_START_WARM),
  232. fields: ['p75(measurements.app_start_warm)'],
  233. dataType: GenericPerformanceWidgetDataType.AREA,
  234. chartColor: WIDGET_PALETTE[3],
  235. allowsOpenInDiscover: true,
  236. },
  237. [PerformanceWidgetSetting.SLOW_FRAMES_AREA]: {
  238. title: t('Slow Frames'),
  239. titleTooltip: getTermHelp(organization, PerformanceTerm.SLOW_FRAMES),
  240. fields: ['p75(measurements.frames_slow_rate)'],
  241. dataType: GenericPerformanceWidgetDataType.AREA,
  242. chartColor: WIDGET_PALETTE[0],
  243. allowsOpenInDiscover: true,
  244. },
  245. [PerformanceWidgetSetting.FROZEN_FRAMES_AREA]: {
  246. title: t('Frozen Frames'),
  247. titleTooltip: getTermHelp(organization, PerformanceTerm.FROZEN_FRAMES),
  248. fields: ['p75(measurements.frames_frozen_rate)'],
  249. dataType: GenericPerformanceWidgetDataType.AREA,
  250. chartColor: WIDGET_PALETTE[5],
  251. allowsOpenInDiscover: true,
  252. },
  253. [PerformanceWidgetSetting.MOST_RELATED_ERRORS]: {
  254. title: t('Most Related Errors'),
  255. titleTooltip: getTermHelp(organization, PerformanceTerm.MOST_ERRORS),
  256. fields: [`failure_count()`],
  257. dataType: GenericPerformanceWidgetDataType.LINE_LIST,
  258. chartColor: WIDGET_PALETTE[0],
  259. },
  260. [PerformanceWidgetSetting.MOST_RELATED_ISSUES]: {
  261. title: t('Most Related Issues'),
  262. titleTooltip: getTermHelp(organization, PerformanceTerm.MOST_ISSUES),
  263. fields: [`count()`],
  264. dataType: GenericPerformanceWidgetDataType.LINE_LIST,
  265. chartColor: WIDGET_PALETTE[0],
  266. },
  267. [PerformanceWidgetSetting.MOST_TIME_SPENT_DB_QUERIES]: {
  268. title: `${t('Most Time-Consuming')} ${QUERIES_DATA_TYPE_PLURAL}`,
  269. subTitle: t('Top queries by total duration'),
  270. titleTooltip: getTermHelp(organization, PerformanceTerm.MOST_TIME_SPENT_DB_QUERIES),
  271. fields: [`time_spent_percentage()`],
  272. dataType: GenericPerformanceWidgetDataType.LINE_LIST,
  273. chartColor: WIDGET_PALETTE[0],
  274. },
  275. [PerformanceWidgetSetting.MOST_TIME_CONSUMING_RESOURCES]: {
  276. title: `${t('Most Time-Consuming')} ${RESOURCES_DATA_TYPE_PLURAL}`,
  277. subTitle: t('Render blocking for pages'),
  278. titleTooltip: getTermHelp(
  279. organization,
  280. PerformanceTerm.MOST_TIME_CONSUMING_RESOURCES
  281. ),
  282. fields: [`time_spent_percentage()`],
  283. dataType: GenericPerformanceWidgetDataType.LINE_LIST,
  284. chartColor: WIDGET_PALETTE[0],
  285. },
  286. [PerformanceWidgetSetting.HIGHEST_CACHE_MISS_RATE_TRANSACTIONS]: {
  287. title: t('Highest Cache Miss Rates'),
  288. subTitle: t('Suggested Transactions'),
  289. titleTooltip: getTermHelp(
  290. organization,
  291. PerformanceTerm.HIGHEST_CACHE_MISS_RATE_TRANSACTIONS
  292. ),
  293. fields: [`cache_miss_rate()`],
  294. dataType: GenericPerformanceWidgetDataType.LINE_LIST,
  295. chartColor: WIDGET_PALETTE[0],
  296. },
  297. [PerformanceWidgetSetting.MOST_TIME_CONSUMING_DOMAINS]: {
  298. title: t('Most Time-Consuming Domains'),
  299. subTitle: t('Top outgoing HTTP request domains by time spent'),
  300. titleTooltip: getTermHelp(
  301. organization,
  302. PerformanceTerm.MOST_TIME_CONSUMING_DOMAINS
  303. ),
  304. fields: [`time_spent_percentage()`],
  305. dataType: GenericPerformanceWidgetDataType.LINE_LIST,
  306. chartColor: WIDGET_PALETTE[0],
  307. },
  308. [PerformanceWidgetSetting.HIGHEST_OPPORTUNITY_PAGES]: {
  309. title: t('Best Page Opportunities'),
  310. subTitle: t('Pages to improve your performance score'),
  311. titleTooltip: '',
  312. fields: [`count()`],
  313. dataType: GenericPerformanceWidgetDataType.PERFORMANCE_SCORE_LIST,
  314. },
  315. [PerformanceWidgetSetting.OVERALL_PERFORMANCE_SCORE]: {
  316. title: t('Performance Score'),
  317. subTitle: t('The overall performance score across selected frontend projects only'),
  318. titleTooltip: '',
  319. fields: [],
  320. dataType: GenericPerformanceWidgetDataType.PERFORMANCE_SCORE,
  321. },
  322. [PerformanceWidgetSetting.SLOW_HTTP_OPS]: {
  323. title: t('Slow HTTP Ops'),
  324. titleTooltip: getTermHelp(organization, PerformanceTerm.SLOW_HTTP_SPANS),
  325. fields: [`p75(spans.http)`, 'p75(spans.db)'],
  326. dataType: GenericPerformanceWidgetDataType.LINE_LIST,
  327. chartColor: WIDGET_PALETTE[0],
  328. },
  329. [PerformanceWidgetSetting.SLOW_BROWSER_OPS]: {
  330. title: t('Slow Browser Ops'),
  331. titleTooltip: getTermHelp(organization, PerformanceTerm.SLOW_HTTP_SPANS),
  332. fields: [`p75(spans.browser)`],
  333. dataType: GenericPerformanceWidgetDataType.LINE_LIST,
  334. chartColor: WIDGET_PALETTE[0],
  335. },
  336. [PerformanceWidgetSetting.SLOW_RESOURCE_OPS]: {
  337. title: t('Slow Resource Ops'),
  338. titleTooltip: getTermHelp(organization, PerformanceTerm.SLOW_HTTP_SPANS),
  339. fields: [`p75(spans.resource)`],
  340. dataType: GenericPerformanceWidgetDataType.LINE_LIST,
  341. chartColor: WIDGET_PALETTE[0],
  342. },
  343. [PerformanceWidgetSetting.SLOW_DB_OPS]: {
  344. title: t('Slow DB Ops'),
  345. titleTooltip: getTermHelp(organization, PerformanceTerm.SLOW_HTTP_SPANS),
  346. fields: [`p75(spans.db)`, 'p75(spans.http)'],
  347. dataType: GenericPerformanceWidgetDataType.LINE_LIST,
  348. chartColor: WIDGET_PALETTE[0],
  349. },
  350. [PerformanceWidgetSetting.TIME_TO_INITIAL_DISPLAY]: {
  351. title: t('Time to Initial Display'),
  352. titleTooltip: getTermHelp(organization, PerformanceTerm.TIME_TO_INITIAL_DISPLAY),
  353. fields: ['p75(measurements.time_to_initial_display)'],
  354. dataType: GenericPerformanceWidgetDataType.AREA,
  355. chartColor: WIDGET_PALETTE[4],
  356. allowsOpenInDiscover: true,
  357. },
  358. [PerformanceWidgetSetting.TIME_TO_FULL_DISPLAY]: {
  359. title: t('Time to Full Display'),
  360. titleTooltip: getTermHelp(organization, PerformanceTerm.TIME_TO_FULL_DISPLAY),
  361. fields: ['p75(measurements.time_to_full_display)'],
  362. dataType: GenericPerformanceWidgetDataType.AREA,
  363. chartColor: WIDGET_PALETTE[4],
  364. allowsOpenInDiscover: true,
  365. },
  366. [PerformanceWidgetSetting.MOST_SLOW_FRAMES]: {
  367. title: t('Most Slow Frames'),
  368. titleTooltip: getTermHelp(organization, PerformanceTerm.SLOW_FRAMES),
  369. fields: ['avg(measurements.frames_slow)'],
  370. dataType: GenericPerformanceWidgetDataType.LINE_LIST,
  371. chartColor: WIDGET_PALETTE[0],
  372. },
  373. [PerformanceWidgetSetting.MOST_FROZEN_FRAMES]: {
  374. title: t('Most Frozen Frames'),
  375. titleTooltip: getTermHelp(organization, PerformanceTerm.FROZEN_FRAMES),
  376. fields: ['avg(measurements.frames_frozen)'],
  377. dataType: GenericPerformanceWidgetDataType.LINE_LIST,
  378. chartColor: WIDGET_PALETTE[0],
  379. },
  380. [PerformanceWidgetSetting.MOST_IMPROVED]: {
  381. title: t('Most Improved (P95)'),
  382. titleTooltip: t(
  383. 'This compares the baseline (%s) of the past with the present.',
  384. 'improved'
  385. ),
  386. fields: [],
  387. dataType: GenericPerformanceWidgetDataType.TRENDS,
  388. },
  389. [PerformanceWidgetSetting.MOST_REGRESSED]: {
  390. title: t('Most Regressed (P95)'),
  391. titleTooltip: t(
  392. 'This compares the baseline (%s) of the past with the present.',
  393. 'regressed'
  394. ),
  395. fields: [],
  396. dataType: GenericPerformanceWidgetDataType.TRENDS,
  397. },
  398. [PerformanceWidgetSetting.MOST_CHANGED]: {
  399. title: t('Most Changed (P95)'),
  400. titleTooltip: t(
  401. 'This compares the baseline (%s) of the past with the present.',
  402. 'changed'
  403. ),
  404. fields: [],
  405. dataType: GenericPerformanceWidgetDataType.TRENDS,
  406. },
  407. [PerformanceWidgetSetting.SPAN_OPERATIONS]: {
  408. title: t('Span Operations Breakdown'),
  409. titleTooltip: '',
  410. fields: SPAN_OP_BREAKDOWN_FIELDS.map(spanOp => `p75(${spanOp})`),
  411. dataType: GenericPerformanceWidgetDataType.STACKED_AREA,
  412. },
  413. [PerformanceWidgetSetting.SLOW_SCREENS_BY_TTID]: {
  414. title: t('Average TTIDs'),
  415. titleTooltip: '',
  416. subTitle: t('Top screens by count'),
  417. fields: ['avg(measurements.time_to_initial_display)'],
  418. dataType: GenericPerformanceWidgetDataType.SLOW_SCREENS_BY_TTID,
  419. },
  420. [PerformanceWidgetSetting.SLOW_SCREENS_BY_COLD_START]: {
  421. title: t('Average Cold Start'),
  422. titleTooltip: '',
  423. subTitle: t('Top screens by start count'),
  424. fields: ['avg(measurements.app_start_cold)'],
  425. dataType: GenericPerformanceWidgetDataType.SLOW_SCREENS_BY_COLD_START,
  426. },
  427. [PerformanceWidgetSetting.SLOW_SCREENS_BY_WARM_START]: {
  428. title: t('Average Warm Start'),
  429. titleTooltip: '',
  430. subTitle: t('Top screens by start count'),
  431. fields: ['avg(measurements.app_start_warm)'],
  432. dataType: GenericPerformanceWidgetDataType.SLOW_SCREENS_BY_WARM_START,
  433. },
  434. };
  435. };