useSpanMetricsSeries.tsx 2.7 KB

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