onDemandMetricRequest.tsx 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. import {doEventsRequest} from 'sentry/actionCreators/events';
  2. import {addErrorMessage} from 'sentry/actionCreators/indicator';
  3. import EventsRequest from 'sentry/components/charts/eventsRequest';
  4. import {t} from 'sentry/locale';
  5. import type {EventsStats, MultiSeriesEventsStats} from 'sentry/types/organization';
  6. export class OnDemandMetricRequest extends EventsRequest {
  7. fetchExtrapolatedData = async (): Promise<EventsStats> => {
  8. const {api, organization, ...props} = this.props;
  9. const retVal = await doEventsRequest(api, {
  10. ...props,
  11. organization,
  12. generatePathname: () =>
  13. `/organizations/${organization.slug}/metrics-estimation-stats/`,
  14. });
  15. return {
  16. ...retVal,
  17. isExtrapolatedData: true,
  18. } as EventsStats;
  19. };
  20. fetchData = async () => {
  21. const {api, confirmedQuery, onError, expired, name, hideError, ...props} = this.props;
  22. let timeseriesData: EventsStats | MultiSeriesEventsStats | null = null;
  23. if (confirmedQuery === false) {
  24. return;
  25. }
  26. this.setState(state => ({
  27. reloading: state.timeseriesData !== null,
  28. errored: false,
  29. errorMessage: undefined,
  30. }));
  31. let errorMessage;
  32. if (expired) {
  33. errorMessage = t(
  34. '%s has an invalid date range. Please try a more recent date range.',
  35. name
  36. );
  37. addErrorMessage(errorMessage, {append: true});
  38. this.setState({
  39. errored: true,
  40. errorMessage,
  41. });
  42. } else {
  43. try {
  44. api.clear();
  45. timeseriesData = await this.fetchExtrapolatedData();
  46. } catch (resp) {
  47. errorMessage = resp?.responseJSON?.detail ?? t('Error loading chart data');
  48. if (!hideError) {
  49. addErrorMessage(errorMessage);
  50. }
  51. onError?.(errorMessage);
  52. this.setState({
  53. errored: true,
  54. errorMessage: t('Error fetching estimated data'),
  55. });
  56. }
  57. this.setState({
  58. reloading: false,
  59. timeseriesData,
  60. fetchedWithPrevious: props.includePrevious,
  61. });
  62. }
  63. if (props.dataLoadedCallback) {
  64. props.dataLoadedCallback(timeseriesData);
  65. }
  66. };
  67. }