useSpanMetricsSeries.tsx 2.5 KB

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