useSpanMetrics.tsx 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  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 type {IndexedSpan} from 'sentry/views/starfish/queries/types';
  6. import {SpanMetricsFields} from 'sentry/views/starfish/types';
  7. import {useSpansQuery} from 'sentry/views/starfish/utils/useSpansQuery';
  8. const {SPAN_GROUP} = SpanMetricsFields;
  9. export type SpanMetrics = {
  10. [metric: string]: number | string;
  11. 'http_error_count()': number;
  12. 'p95(span.self_time)': number;
  13. 'span.op': string;
  14. 'sps()': number;
  15. 'time_spent_percentage()': number;
  16. };
  17. export type SpanSummaryQueryFilters = {
  18. 'transaction.method'?: string;
  19. transactionName?: string;
  20. };
  21. export const useSpanMetrics = (
  22. span: Pick<IndexedSpan, 'group'>,
  23. queryFilters: SpanSummaryQueryFilters,
  24. fields: string[] = [],
  25. referrer: string = 'span-metrics'
  26. ) => {
  27. const location = useLocation();
  28. const eventView = span ? getEventView(span, location, queryFilters, fields) : undefined;
  29. const enabled =
  30. Boolean(span?.group) && Object.values(queryFilters).every(value => Boolean(value));
  31. // TODO: Add referrer
  32. const result = useSpansQuery<SpanMetrics[]>({
  33. eventView,
  34. initialData: [],
  35. enabled,
  36. referrer,
  37. });
  38. return {...result, data: result?.data?.[0] ?? {}, isEnabled: enabled};
  39. };
  40. function getEventView(
  41. span: {group: string},
  42. location: Location,
  43. queryFilters?: SpanSummaryQueryFilters,
  44. fields: string[] = []
  45. ) {
  46. const cleanGroupId = span.group.replaceAll('-', '').slice(-16);
  47. return EventView.fromNewQueryWithLocation(
  48. {
  49. name: '',
  50. query: `${SPAN_GROUP}:${cleanGroupId}${
  51. queryFilters?.transactionName
  52. ? ` transaction:${queryFilters?.transactionName}`
  53. : ''
  54. }${
  55. queryFilters?.['transaction.method']
  56. ? ` transaction.method:${queryFilters?.['transaction.method']}`
  57. : ''
  58. }`,
  59. fields,
  60. dataset: DiscoverDatasets.SPANS_METRICS,
  61. version: 2,
  62. },
  63. location
  64. );
  65. }