useSpanMetricsSeries.tsx 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. import {Location} from 'history';
  2. import keyBy from 'lodash/keyBy';
  3. import {getInterval} from 'sentry/components/charts/utils';
  4. import {PageFilters} from 'sentry/types';
  5. import {Series} from 'sentry/types/echarts';
  6. import EventView from 'sentry/utils/discover/eventView';
  7. import {DiscoverDatasets} from 'sentry/utils/discover/types';
  8. import {useLocation} from 'sentry/utils/useLocation';
  9. import usePageFilters from 'sentry/utils/usePageFilters';
  10. import type {IndexedSpan} from 'sentry/views/starfish/queries/types';
  11. import {SpanSummaryQueryFilters} from 'sentry/views/starfish/queries/useSpanMetrics';
  12. import {SpanMetricsFields} from 'sentry/views/starfish/types';
  13. import {STARFISH_CHART_INTERVAL_FIDELITY} from 'sentry/views/starfish/utils/constants';
  14. import {useSpansQuery} from 'sentry/views/starfish/utils/useSpansQuery';
  15. const {SPAN_GROUP} = SpanMetricsFields;
  16. export type SpanMetrics = {
  17. interval: number;
  18. 'p95(span.self_time)': number;
  19. 'sps()': number;
  20. 'sum(span.self_time)': number;
  21. 'time_spent_percentage()': number;
  22. };
  23. export const useSpanMetricsSeries = (
  24. span: Pick<IndexedSpan, 'group'>,
  25. queryFilters: SpanSummaryQueryFilters,
  26. yAxis: string[] = [],
  27. referrer = 'span-metrics-series'
  28. ) => {
  29. const location = useLocation();
  30. const pageFilters = usePageFilters();
  31. const eventView = span
  32. ? getEventView(span, location, pageFilters.selection, yAxis, queryFilters)
  33. : undefined;
  34. const enabled =
  35. Boolean(span?.group) && Object.values(queryFilters).every(value => Boolean(value));
  36. // TODO: Add referrer
  37. const result = useSpansQuery<SpanMetrics[]>({
  38. eventView,
  39. initialData: [],
  40. referrer,
  41. enabled,
  42. });
  43. const parsedData = keyBy(
  44. yAxis.map(seriesName => {
  45. const series: Series = {
  46. seriesName,
  47. data: result?.data.map(datum => ({
  48. value: datum[seriesName],
  49. name: datum.interval,
  50. })),
  51. };
  52. return series;
  53. }),
  54. 'seriesName'
  55. );
  56. return {...result, data: parsedData};
  57. };
  58. function getEventView(
  59. span: {group: string},
  60. location: Location,
  61. pageFilters: PageFilters,
  62. yAxis: string[],
  63. queryFilters: SpanSummaryQueryFilters
  64. ) {
  65. const cleanGroupId = span.group.replaceAll('-', '').slice(-16);
  66. return EventView.fromNewQueryWithLocation(
  67. {
  68. name: '',
  69. query: `${SPAN_GROUP}:${cleanGroupId}${
  70. queryFilters?.transactionName
  71. ? ` transaction:${queryFilters?.transactionName}`
  72. : ''
  73. }${
  74. queryFilters?.['transaction.method']
  75. ? ` transaction.method:${queryFilters?.['transaction.method']}`
  76. : ''
  77. }`,
  78. fields: [],
  79. yAxis,
  80. dataset: DiscoverDatasets.SPANS_METRICS,
  81. interval: getInterval(pageFilters.datetime, STARFISH_CHART_INTERVAL_FIDELITY),
  82. version: 2,
  83. },
  84. location
  85. );
  86. }