onDemandMetricRequest.tsx 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  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 {EventsStats, MultiSeriesEventsStats} from 'sentry/types';
  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. if (resp && resp.responseJSON && resp.responseJSON.detail) {
  48. errorMessage = resp.responseJSON.detail;
  49. } else {
  50. errorMessage = t('Error loading chart data');
  51. }
  52. if (!hideError) {
  53. addErrorMessage(errorMessage);
  54. }
  55. onError?.(errorMessage);
  56. this.setState({
  57. errored: true,
  58. errorMessage: t('Error fetching estimated data'),
  59. });
  60. }
  61. this.setState({
  62. reloading: false,
  63. timeseriesData,
  64. fetchedWithPrevious: props.includePrevious,
  65. });
  66. }
  67. if (props.dataLoadedCallback) {
  68. props.dataLoadedCallback(timeseriesData);
  69. }
  70. };
  71. }