useSpanMetricsSeries.tsx 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  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 {MutableSearch} from 'sentry/utils/tokenizeSearch';
  8. import usePageFilters from 'sentry/utils/usePageFilters';
  9. import {SpanMetricsQueryFilters} 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. import {EMPTY_OPTION_VALUE} from 'sentry/views/starfish/views/spans/selectors/emptyOption';
  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. filters: SpanMetricsQueryFilters,
  22. yAxis: string[] = [],
  23. referrer = 'span-metrics-series'
  24. ) => {
  25. const pageFilters = usePageFilters();
  26. const eventView = getEventView(filters, pageFilters.selection, yAxis);
  27. const enabled = Object.values(filters).every(value => Boolean(value));
  28. const result = useSpansQuery<SpanMetrics[]>({
  29. eventView,
  30. initialData: [],
  31. referrer,
  32. enabled,
  33. });
  34. const parsedData = keyBy(
  35. yAxis.map(seriesName => {
  36. const series: Series = {
  37. seriesName,
  38. data: (result?.data ?? []).map(datum => ({
  39. value: datum[seriesName],
  40. name: datum.interval,
  41. })),
  42. };
  43. return series;
  44. }),
  45. 'seriesName'
  46. );
  47. return {...result, data: parsedData};
  48. };
  49. function getEventView(
  50. filters: SpanMetricsQueryFilters,
  51. pageFilters: PageFilters,
  52. yAxis: string[]
  53. ) {
  54. const query = new MutableSearch('');
  55. Object.entries(filters).forEach(([key, value]) => {
  56. if (!value) {
  57. return;
  58. }
  59. if (value === EMPTY_OPTION_VALUE) {
  60. query.addFilterValue('!has', key);
  61. }
  62. query.addFilterValue(key, value, !ALLOWED_WILDCARD_FIELDS.includes(key));
  63. });
  64. // TODO: This condition should be enforced everywhere
  65. // query.addFilterValue('has', 'span.description');
  66. return EventView.fromNewQueryWithPageFilters(
  67. {
  68. name: '',
  69. query: query.formatString(),
  70. fields: [],
  71. yAxis,
  72. dataset: DiscoverDatasets.SPANS_METRICS,
  73. interval: getInterval(pageFilters.datetime, STARFISH_CHART_INTERVAL_FIDELITY),
  74. version: 2,
  75. },
  76. pageFilters
  77. );
  78. }
  79. const ALLOWED_WILDCARD_FIELDS = ['span.description'];