generatePerformanceEventView.tsx 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  1. import type {Location} from 'history';
  2. import {COL_WIDTH_UNDEFINED} from 'sentry/components/gridEditable';
  3. import {wrapQueryInWildcards} from 'sentry/components/performance/searchBar';
  4. import {t} from 'sentry/locale';
  5. import type {PageFilters} from 'sentry/types/core';
  6. import type {NewQuery, Organization} from 'sentry/types/organization';
  7. import EventView from 'sentry/utils/discover/eventView';
  8. import {DiscoverDatasets} from 'sentry/utils/discover/types';
  9. import {decodeScalar} from 'sentry/utils/queryString';
  10. import {MutableSearch} from 'sentry/utils/tokenizeSearch';
  11. import {STARFISH_TYPE_FOR_PROJECT} from 'sentry/views/starfish/allowedProjects';
  12. import {StarfishType} from 'sentry/views/starfish/types';
  13. const DEFAULT_STATS_PERIOD = '7d';
  14. const TOKEN_KEYS_SUPPORTED_IN_LIMITED_SEARCH = ['transaction'];
  15. export const TIME_SPENT_IN_SERVICE = 'time_spent_percentage()';
  16. const getDefaultStatsPeriod = (organization: Organization) => {
  17. if (organization?.features?.includes('performance-landing-page-stats-period')) {
  18. return '14d';
  19. }
  20. return DEFAULT_STATS_PERIOD;
  21. };
  22. function prepareQueryForLandingPage(searchQuery, withStaticFilters) {
  23. const conditions = new MutableSearch(searchQuery);
  24. // If there is a bare text search, we want to treat it as a search
  25. // on the transaction name.
  26. if (conditions.freeText.length > 0) {
  27. const parsedFreeText = conditions.freeText.join(' ');
  28. // the query here is a user entered condition, no need to escape it
  29. conditions.setFilterValues(
  30. 'transaction',
  31. [wrapQueryInWildcards(parsedFreeText)],
  32. false
  33. );
  34. conditions.freeText = [];
  35. }
  36. if (withStaticFilters) {
  37. conditions.tokens = conditions.tokens.filter(
  38. token => token.key && TOKEN_KEYS_SUPPORTED_IN_LIMITED_SEARCH.includes(token.key)
  39. );
  40. }
  41. return conditions.formatString();
  42. }
  43. export function generateWebServiceEventView(
  44. location: Location,
  45. {withStaticFilters = false} = {},
  46. organization: Organization,
  47. selection: PageFilters
  48. ) {
  49. const {query} = location;
  50. const project = selection.projects[0];
  51. const starfishType = STARFISH_TYPE_FOR_PROJECT[project] || StarfishType.BACKEND;
  52. const getSavedQuery = () => {
  53. switch (starfishType) {
  54. case StarfishType.MOBILE:
  55. return generateMobileServiceSavedQuery(location);
  56. case StarfishType.BACKEND:
  57. default:
  58. return generateWebServiceSavedQuery(location);
  59. }
  60. };
  61. const savedQuery = getSavedQuery();
  62. const hasStartAndEnd = query.start && query.end;
  63. const widths = Array(savedQuery.fields.length).fill(COL_WIDTH_UNDEFINED);
  64. widths[savedQuery.fields.length - 1] = '110';
  65. savedQuery.widths = widths;
  66. if (!query.statsPeriod && !hasStartAndEnd) {
  67. savedQuery.range = getDefaultStatsPeriod(organization);
  68. }
  69. const searchQuery = decodeScalar(query.query, '');
  70. savedQuery.query = `${savedQuery.query} ${prepareQueryForLandingPage(
  71. searchQuery,
  72. withStaticFilters
  73. )}`;
  74. const eventView = EventView.fromNewQueryWithLocation(savedQuery, location);
  75. return eventView;
  76. }
  77. export function generateMobileServiceSavedQuery(location: Location) {
  78. const {query} = location;
  79. const orderby = decodeScalar(query.sort, `-eps`);
  80. const fields = [
  81. 'transaction',
  82. 'eps()',
  83. 'p75(measurements.frames_slow_rate)',
  84. 'p75(measurements.time_to_initial_display)',
  85. ];
  86. const savedQuery: NewQuery = {
  87. id: undefined,
  88. name: t('Performance'),
  89. query: 'event.type:transaction transaction.op:ui.load',
  90. fields,
  91. version: 2,
  92. dataset: DiscoverDatasets.METRICS,
  93. };
  94. savedQuery.orderby = orderby;
  95. return savedQuery;
  96. }
  97. function generateWebServiceSavedQuery(location: Location) {
  98. const {query} = location;
  99. const orderby = decodeScalar(query.sort, `-time_spent_percentage`);
  100. const fields = [
  101. 'transaction',
  102. 'http.method',
  103. 'tps()',
  104. 'avg(transaction.duration)',
  105. 'http_error_count()',
  106. 'time_spent_percentage()',
  107. 'sum(transaction.duration)',
  108. ];
  109. const savedQuery: NewQuery = {
  110. id: undefined,
  111. name: t('Performance'),
  112. query: 'event.type:transaction has:http.method transaction.op:http.server',
  113. fields,
  114. version: 2,
  115. dataset: DiscoverDatasets.METRICS,
  116. };
  117. savedQuery.orderby = orderby;
  118. return savedQuery;
  119. }