useProjectWebVitalsValuesTimeseriesQuery.tsx 2.9 KB

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