useProjectWebVitalsValuesTimeseriesQuery.tsx 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. import {getInterval} from 'sentry/components/charts/utils';
  2. import {PageFilters} from 'sentry/types';
  3. import {SeriesDataUnit} from 'sentry/types/echarts';
  4. import EventView, {MetaType} from 'sentry/utils/discover/eventView';
  5. import {
  6. DiscoverQueryProps,
  7. useGenericDiscoverQuery,
  8. } from 'sentry/utils/discover/genericDiscoverQuery';
  9. import {DiscoverDatasets} from 'sentry/utils/discover/types';
  10. import {useLocation} from 'sentry/utils/useLocation';
  11. import useOrganization from 'sentry/utils/useOrganization';
  12. import usePageFilters from 'sentry/utils/usePageFilters';
  13. type Props = {
  14. datetime?: PageFilters['datetime'];
  15. transaction?: string | null;
  16. };
  17. export const useProjectWebVitalsValuesTimeseriesQuery = ({
  18. transaction,
  19. datetime,
  20. }: Props) => {
  21. const pageFilters = usePageFilters();
  22. const location = useLocation();
  23. const organization = useOrganization();
  24. const projectTimeSeriesEventView = EventView.fromNewQueryWithPageFilters(
  25. {
  26. yAxis: [
  27. 'p75(measurements.lcp)',
  28. 'p75(measurements.fcp)',
  29. 'p75(measurements.cls)',
  30. 'p75(measurements.ttfb)',
  31. 'p75(measurements.fid)',
  32. 'count()',
  33. 'p75(transaction.duration)',
  34. 'failure_count()',
  35. 'eps()',
  36. ],
  37. name: 'Web Vitals',
  38. query:
  39. 'transaction.op:pageload' + (transaction ? ` transaction:"${transaction}"` : ''),
  40. version: 2,
  41. fields: [],
  42. interval: getInterval(pageFilters.selection.datetime, 'low'),
  43. dataset: DiscoverDatasets.METRICS,
  44. },
  45. {
  46. ...pageFilters.selection,
  47. datetime: datetime ?? pageFilters.selection.datetime,
  48. }
  49. );
  50. const result = useGenericDiscoverQuery<
  51. {
  52. data: any[];
  53. meta: MetaType;
  54. },
  55. DiscoverQueryProps
  56. >({
  57. route: 'events-stats',
  58. eventView: projectTimeSeriesEventView,
  59. location,
  60. orgSlug: organization.slug,
  61. getRequestPayload: () => ({
  62. ...projectTimeSeriesEventView.getEventsAPIPayload(location),
  63. yAxis: projectTimeSeriesEventView.yAxis,
  64. topEvents: projectTimeSeriesEventView.topEvents,
  65. excludeOther: 0,
  66. partial: 1,
  67. orderby: undefined,
  68. interval: projectTimeSeriesEventView.interval,
  69. }),
  70. options: {
  71. enabled: pageFilters.isReady,
  72. refetchOnWindowFocus: false,
  73. },
  74. referrer: 'api.performance.browser.web-vitals.timeseries',
  75. });
  76. const data: {
  77. cls: SeriesDataUnit[];
  78. count: SeriesDataUnit[];
  79. duration: SeriesDataUnit[];
  80. eps: SeriesDataUnit[];
  81. errors: SeriesDataUnit[];
  82. fcp: SeriesDataUnit[];
  83. fid: SeriesDataUnit[];
  84. lcp: SeriesDataUnit[];
  85. ttfb: SeriesDataUnit[];
  86. } = {
  87. lcp: [],
  88. fcp: [],
  89. cls: [],
  90. ttfb: [],
  91. fid: [],
  92. count: [],
  93. duration: [],
  94. errors: [],
  95. eps: [],
  96. };
  97. result?.data?.['p75(measurements.lcp)']?.data.forEach((interval, index) => {
  98. const map: {key: string; series: SeriesDataUnit[]}[] = [
  99. {key: 'p75(measurements.cls)', series: data.cls},
  100. {key: 'p75(measurements.lcp)', series: data.lcp},
  101. {key: 'p75(measurements.fcp)', series: data.fcp},
  102. {key: 'p75(measurements.ttfb)', series: data.ttfb},
  103. {key: 'p75(measurements.fid)', series: data.fid},
  104. {key: 'count()', series: data.count},
  105. {key: 'p75(transaction.duration)', series: data.duration},
  106. {key: 'failure_count()', series: data.errors},
  107. {key: 'eps()', series: data.eps},
  108. ];
  109. map.forEach(({key, series}) => {
  110. if (result?.data?.[key].data[index][1][0].count !== null) {
  111. series.push({
  112. value: result?.data?.[key].data[index][1][0].count,
  113. name: interval[0] * 1000,
  114. });
  115. }
  116. });
  117. });
  118. return {data, isLoading: result.isLoading};
  119. };