useSpanSamples.tsx 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. import moment from 'moment';
  2. import * as qs from 'query-string';
  3. import {useQuery} from 'sentry/utils/queryClient';
  4. import {MutableSearch} from 'sentry/utils/tokenizeSearch';
  5. import useApi from 'sentry/utils/useApi';
  6. import {useLocation} from 'sentry/utils/useLocation';
  7. import usePageFilters from 'sentry/utils/usePageFilters';
  8. import {SpanIndexedFields, SpanIndexedFieldTypes} from 'sentry/views/starfish/types';
  9. import {getDateConditions} from 'sentry/views/starfish/utils/getDateConditions';
  10. import {DATE_FORMAT} from 'sentry/views/starfish/utils/useSpansQuery';
  11. type Options = {
  12. groupId?: string;
  13. transactionMethod?: string;
  14. transactionName?: string;
  15. };
  16. type SpanSample = Pick<
  17. SpanIndexedFieldTypes,
  18. | SpanIndexedFields.SPAN_SELF_TIME
  19. | SpanIndexedFields.TRANSACTION_ID
  20. | SpanIndexedFields.PROJECT
  21. | SpanIndexedFields.TIMESTAMP
  22. | SpanIndexedFields.ID
  23. >;
  24. export const useSpanSamples = (options: Options) => {
  25. const url = '/api/0/organizations/sentry/spans-samples/';
  26. const api = useApi();
  27. const pageFilter = usePageFilters();
  28. const {groupId, transactionName, transactionMethod} = options;
  29. const location = useLocation();
  30. const query = new MutableSearch([
  31. `span.group:${groupId}`,
  32. `transaction:${transactionName}`,
  33. `transaction.method:${transactionMethod}`,
  34. ]);
  35. const dateCondtions = getDateConditions(pageFilter.selection);
  36. return useQuery<SpanSample[]>({
  37. queryKey: [
  38. 'span-samples',
  39. groupId,
  40. transactionName,
  41. dateCondtions.statsPeriod,
  42. dateCondtions.start,
  43. dateCondtions.end,
  44. ],
  45. queryFn: async () => {
  46. const {data} = await api.requestPromise(
  47. `${url}?${qs.stringify({
  48. ...dateCondtions,
  49. ...{utc: location.query.utc},
  50. query: query.formatString(),
  51. })}`
  52. );
  53. return data
  54. ?.map((d: SpanSample) => ({
  55. ...d,
  56. timestamp: moment(d.timestamp).format(DATE_FORMAT),
  57. }))
  58. .sort(
  59. (a: SpanSample, b: SpanSample) => b['span.self_time'] - a['span.self_time']
  60. );
  61. },
  62. refetchOnWindowFocus: false,
  63. enabled: Boolean(groupId && transactionName),
  64. initialData: [],
  65. });
  66. };