spans.tsx 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157
  1. import type {Client} from 'sentry/api';
  2. import type {PageFilters} from 'sentry/types/core';
  3. import type {TagCollection} from 'sentry/types/group';
  4. import type {
  5. EventsStats,
  6. MultiSeriesEventsStats,
  7. Organization,
  8. } from 'sentry/types/organization';
  9. import toArray from 'sentry/utils/array/toArray';
  10. import type {CustomMeasurementCollection} from 'sentry/utils/customMeasurements/customMeasurements';
  11. import type {EventsTableData, TableData} from 'sentry/utils/discover/discoverQuery';
  12. import {getAggregations} from 'sentry/utils/discover/fields';
  13. import {
  14. type DiscoverQueryExtras,
  15. type DiscoverQueryRequestParams,
  16. doDiscoverQuery,
  17. } from 'sentry/utils/discover/genericDiscoverQuery';
  18. import {DiscoverDatasets} from 'sentry/utils/discover/types';
  19. import {TRACE_FIELD_DEFINITIONS} from 'sentry/utils/fields';
  20. import type {MEPState} from 'sentry/utils/performance/contexts/metricsEnhancedSetting';
  21. import type {OnDemandControlContext} from 'sentry/utils/performance/contexts/onDemandControl';
  22. import {
  23. type DatasetConfig,
  24. handleOrderByReset,
  25. } from 'sentry/views/dashboards/datasetConfig/base';
  26. import {
  27. filterAggregateParams,
  28. getCustomEventsFieldRenderer,
  29. getTableSortOptions,
  30. transformEventsResponseToSeries,
  31. transformEventsResponseToTable,
  32. } from 'sentry/views/dashboards/datasetConfig/errorsAndTransactions';
  33. import {DisplayType, type Widget, type WidgetQuery} from 'sentry/views/dashboards/types';
  34. import {eventViewFromWidget} from 'sentry/views/dashboards/utils';
  35. import {EventsSearchBar} from 'sentry/views/dashboards/widgetBuilder/buildSteps/filterResultsStep/eventsSearchBar';
  36. import {generateFieldOptions} from 'sentry/views/discover/utils';
  37. const DEFAULT_WIDGET_QUERY: WidgetQuery = {
  38. name: '',
  39. fields: ['span.op', 'count()'],
  40. columns: ['span.op'],
  41. fieldAliases: [],
  42. aggregates: ['count()'],
  43. conditions: '',
  44. orderby: '-count()',
  45. };
  46. export const SpansConfig: DatasetConfig<
  47. EventsStats | MultiSeriesEventsStats,
  48. TableData | EventsTableData
  49. > = {
  50. defaultWidgetQuery: DEFAULT_WIDGET_QUERY,
  51. enableEquations: false, // TODO: Should EAP support equations?
  52. getCustomFieldRenderer: getCustomEventsFieldRenderer,
  53. SearchBar: EventsSearchBar, // TODO: Replace with a custom EAP search bar
  54. filterSeriesSortOptions: () => () => true,
  55. filterYAxisAggregateParams: () => () => true,
  56. filterYAxisOptions: () => () => true,
  57. getTableFieldOptions: getEventsTableFieldOptions,
  58. // getTimeseriesSortOptions: (organization, widgetQuery, tags) =>
  59. // getTimeseriesSortOptions(organization, widgetQuery, tags, getEventsTableFieldOptions),
  60. getTableSortOptions: getTableSortOptions,
  61. getGroupByFieldOptions: getEventsTableFieldOptions,
  62. handleOrderByReset,
  63. supportedDisplayTypes: [
  64. // DisplayType.AREA,
  65. // DisplayType.BAR,
  66. // DisplayType.BIG_NUMBER,
  67. // DisplayType.LINE,
  68. DisplayType.TABLE,
  69. // DisplayType.TOP_N,
  70. ],
  71. getTableRequest: (
  72. api: Client,
  73. _widget: Widget,
  74. query: WidgetQuery,
  75. organization: Organization,
  76. pageFilters: PageFilters,
  77. _onDemandControlContext?: OnDemandControlContext,
  78. limit?: number,
  79. cursor?: string,
  80. referrer?: string,
  81. _mepSetting?: MEPState | null
  82. ) => {
  83. return getEventsRequest(
  84. api,
  85. query,
  86. organization,
  87. pageFilters,
  88. limit,
  89. cursor,
  90. referrer
  91. );
  92. },
  93. // getSeriesRequest: getErrorsSeriesRequest,
  94. transformTable: transformEventsResponseToTable,
  95. transformSeries: transformEventsResponseToSeries,
  96. filterAggregateParams,
  97. };
  98. // TODO: Update tags to use EAP tags
  99. function getEventsTableFieldOptions(
  100. organization: Organization,
  101. tags?: TagCollection,
  102. _customMeasurements?: CustomMeasurementCollection
  103. ) {
  104. return generateFieldOptions({
  105. organization,
  106. tagKeys: Object.values(tags ?? {}).map(({key}) => key),
  107. fieldKeys: Object.keys(TRACE_FIELD_DEFINITIONS),
  108. // TODO: Use EAP specific aggregations
  109. aggregations: getAggregations(DiscoverDatasets.TRANSACTIONS),
  110. });
  111. }
  112. function getEventsRequest(
  113. api: Client,
  114. query: WidgetQuery,
  115. organization: Organization,
  116. pageFilters: PageFilters,
  117. limit?: number,
  118. cursor?: string,
  119. referrer?: string,
  120. _mepSetting?: MEPState | null,
  121. queryExtras?: DiscoverQueryExtras
  122. ) {
  123. const url = `/organizations/${organization.slug}/events/`;
  124. const eventView = eventViewFromWidget('', query, pageFilters);
  125. const params: DiscoverQueryRequestParams = {
  126. per_page: limit,
  127. cursor,
  128. referrer,
  129. dataset: DiscoverDatasets.SPANS_EAP,
  130. ...queryExtras,
  131. };
  132. if (query.orderby) {
  133. params.sort = toArray(query.orderby);
  134. }
  135. return doDiscoverQuery<EventsTableData>(
  136. api,
  137. url,
  138. {
  139. ...eventView.generateQueryStringObject(),
  140. ...params,
  141. },
  142. // Tries events request up to 3 times on rate limit
  143. {
  144. retry: {
  145. statusCodes: [429],
  146. tries: 3,
  147. },
  148. }
  149. );
  150. }