metrics.tsx 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. import {addErrorMessage} from 'sentry/actionCreators/indicator';
  2. import MetricsMetaActions from 'sentry/actions/metricsMetaActions';
  3. import MetricsTagActions from 'sentry/actions/metricTagActions';
  4. import {Client} from 'sentry/api';
  5. import {getInterval} from 'sentry/components/charts/utils';
  6. import {normalizeDateTimeParams} from 'sentry/components/organizations/pageFilters/parse';
  7. import {t} from 'sentry/locale';
  8. import MetricsMetaStore from 'sentry/stores/metricsMetaStore';
  9. import MetricsTagStore from 'sentry/stores/metricsTagStore';
  10. import {
  11. DateString,
  12. MetricsApiResponse,
  13. MetricsMeta,
  14. MetricsTag,
  15. Organization,
  16. } from 'sentry/types';
  17. import {defined} from 'sentry/utils';
  18. import handleXhrErrorResponse from 'sentry/utils/handleXhrErrorResponse';
  19. export type DoMetricsRequestOptions = {
  20. field: string[];
  21. orgSlug: Organization['slug'];
  22. cursor?: string;
  23. end?: DateString;
  24. environment?: Readonly<string[]>;
  25. groupBy?: string[];
  26. includeAllArgs?: boolean;
  27. interval?: string;
  28. limit?: number;
  29. orderBy?: string;
  30. project?: Readonly<number[]>;
  31. query?: string;
  32. start?: DateString;
  33. statsPeriod?: string | null;
  34. statsPeriodEnd?: string;
  35. statsPeriodStart?: string;
  36. };
  37. export const doMetricsRequest = (
  38. api: Client,
  39. {
  40. field,
  41. orgSlug,
  42. cursor,
  43. environment,
  44. groupBy,
  45. interval,
  46. limit,
  47. orderBy,
  48. project,
  49. query,
  50. includeAllArgs = false,
  51. statsPeriodStart,
  52. statsPeriodEnd,
  53. ...dateTime
  54. }: DoMetricsRequestOptions
  55. ): Promise<MetricsApiResponse> => {
  56. const {start, end, statsPeriod} = normalizeDateTimeParams(dateTime, {
  57. allowEmptyPeriod: true,
  58. });
  59. const urlQuery = Object.fromEntries(
  60. Object.entries({
  61. field: field.filter(f => !!f),
  62. cursor,
  63. end,
  64. environment,
  65. groupBy: groupBy?.filter(g => !!g),
  66. interval: interval || getInterval({start, end, period: statsPeriod}),
  67. query: query || undefined,
  68. per_page: limit,
  69. project,
  70. orderBy,
  71. start,
  72. statsPeriod,
  73. statsPeriodStart,
  74. statsPeriodEnd,
  75. }).filter(([, value]) => defined(value) && value !== '')
  76. );
  77. const pathname = `/organizations/${orgSlug}/metrics/data/`;
  78. return api.requestPromise(pathname, {includeAllArgs, query: urlQuery});
  79. };
  80. function tagFetchSuccess(tags: MetricsTag[]) {
  81. MetricsTagActions.loadMetricsTagsSuccess(tags);
  82. }
  83. export function fetchMetricsTags(
  84. api: Client,
  85. orgSlug: Organization['slug'],
  86. projects?: number[],
  87. fields?: string[]
  88. ): Promise<MetricsTag[]> {
  89. MetricsTagStore.reset();
  90. const promise = api.requestPromise(`/organizations/${orgSlug}/metrics/tags/`, {
  91. query: {
  92. project: projects,
  93. metric: fields,
  94. },
  95. });
  96. promise.then(tagFetchSuccess).catch(response => {
  97. const errorResponse = response?.responseJSON ?? t('Unable to fetch metric tags');
  98. addErrorMessage(errorResponse);
  99. handleXhrErrorResponse(errorResponse)(response);
  100. });
  101. return promise;
  102. }
  103. function metaFetchSuccess(metricsMeta: MetricsMeta[]) {
  104. MetricsMetaActions.loadMetricsMetaSuccess(metricsMeta);
  105. }
  106. export function fetchMetricsFields(
  107. api: Client,
  108. orgSlug: Organization['slug'],
  109. projects?: number[]
  110. ): Promise<MetricsMeta[]> {
  111. MetricsMetaStore.reset();
  112. const promise: Promise<MetricsMeta[]> = api.requestPromise(
  113. `/organizations/${orgSlug}/metrics/meta/`,
  114. {
  115. query: {
  116. project: projects,
  117. },
  118. }
  119. );
  120. promise.then(metaFetchSuccess).catch(response => {
  121. const errorResponse = response?.responseJSON ?? t('Unable to fetch metric fields');
  122. addErrorMessage(errorResponse);
  123. handleXhrErrorResponse(errorResponse)(response);
  124. });
  125. return promise;
  126. }