useSpanMetrics.tsx 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. import {Location} from 'history';
  2. import EventView from 'sentry/utils/discover/eventView';
  3. import {DiscoverDatasets} from 'sentry/utils/discover/types';
  4. import {useLocation} from 'sentry/utils/useLocation';
  5. import {
  6. MetricsProperty,
  7. MetricsResponse,
  8. SpanMetricsField,
  9. } from 'sentry/views/starfish/types';
  10. import {useSpansQuery} from 'sentry/views/starfish/utils/useSpansQuery';
  11. const {SPAN_GROUP} = SpanMetricsField;
  12. export type SpanSummaryQueryFilters = {
  13. release?: string;
  14. 'transaction.method'?: string;
  15. transactionName?: string;
  16. };
  17. export const useSpanMetrics = <T extends MetricsProperty[]>(
  18. group: string,
  19. queryFilters: SpanSummaryQueryFilters,
  20. fields: T,
  21. referrer: string = 'span-metrics'
  22. ) => {
  23. const location = useLocation();
  24. const eventView = group
  25. ? getEventView(group, location, queryFilters, fields)
  26. : undefined;
  27. const enabled =
  28. Boolean(group) && Object.values(queryFilters).every(value => Boolean(value));
  29. // TODO: Add referrer
  30. const result = useSpansQuery({
  31. eventView,
  32. initialData: [],
  33. enabled,
  34. referrer,
  35. });
  36. const data = (result?.data?.[0] ?? {}) as Pick<MetricsResponse, T[number]>;
  37. return {
  38. ...result,
  39. data,
  40. isEnabled: enabled,
  41. };
  42. };
  43. function getEventView(
  44. group: string,
  45. location: Location,
  46. queryFilters?: SpanSummaryQueryFilters,
  47. fields: string[] = []
  48. ) {
  49. return EventView.fromNewQueryWithLocation(
  50. {
  51. name: '',
  52. query: `${SPAN_GROUP}:${group}${
  53. queryFilters?.transactionName
  54. ? ` transaction:"${queryFilters?.transactionName}"`
  55. : ''
  56. }${
  57. queryFilters?.['transaction.method']
  58. ? ` transaction.method:${queryFilters?.['transaction.method']}`
  59. : ''
  60. }${queryFilters?.release ? ` release:${queryFilters?.release}` : ''}`,
  61. fields,
  62. dataset: DiscoverDatasets.SPANS_METRICS,
  63. version: 2,
  64. },
  65. location
  66. );
  67. }