useProjectWebVitalsValuesTimeseriesQuery.tsx 2.9 KB

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