123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166 |
- import {useQuery} from '@tanstack/react-query';
- import {ResponseMeta} from 'sentry/api';
- import {normalizeDateTimeParams} from 'sentry/components/organizations/pageFilters/parse';
- import {EventsStatsSeries} from 'sentry/types';
- import useApi from 'sentry/utils/useApi';
- import useOrganization from 'sentry/utils/useOrganization';
- import usePageFilters from 'sentry/utils/usePageFilters';
- interface UseProfileEventStatsOptions<F> {
- referrer: string;
- yAxes: readonly F[];
- interval?: string;
- query?: string;
- }
- export function useProfileEventsStats<F extends string>({
- yAxes,
- interval,
- query,
- referrer,
- }: UseProfileEventStatsOptions<F>) {
- const api = useApi();
- const organization = useOrganization();
- const {selection} = usePageFilters();
- const path = `/organizations/${organization.slug}/events-stats/`;
- const endpointOptions = {
- query: {
- dataset: 'profiles',
- referrer,
- project: selection.projects,
- environment: selection.environments,
- ...normalizeDateTimeParams(selection.datetime),
- yAxis: yAxes,
- interval,
- query,
- },
- };
- const queryKey = [path, endpointOptions];
- const queryFn = () =>
- api
- .requestPromise(path, {
- method: 'GET',
- includeAllArgs: true,
- query: endpointOptions.query,
- })
- .then(response => transformStatsResponse(yAxes, response));
- return useQuery<ApiResponse<EventsStatsSeries<F>>>({
- queryKey,
- queryFn,
- refetchOnWindowFocus: false,
- retry: false,
- });
- }
- type ApiResponse<F> = [F, string | undefined, ResponseMeta | undefined];
- function transformStatsResponse<F extends string>(
- yAxes: readonly F[],
- rawResponse: ApiResponse<any>
- ): ApiResponse<EventsStatsSeries<F>> {
- // the events stats endpoint has a legacy response format so here we transform it
- // into the proposed update for forward compatibility and ease of use
- if (yAxes.length === 0) {
- return [
- {
- data: [],
- meta: {
- dataset: 'profiles',
- end: 0,
- start: 0,
- },
- timestamps: [],
- },
- rawResponse[1],
- rawResponse[2],
- ];
- }
- if (yAxes.length === 1) {
- const {series, meta, timestamps} = transformSingleSeries(yAxes[0], rawResponse[0]);
- return [
- {
- data: [series],
- meta,
- timestamps,
- },
- rawResponse[1],
- rawResponse[2],
- ];
- }
- const data: EventsStatsSeries<F>['data'] = [];
- let meta: EventsStatsSeries<F>['meta'] = {
- dataset: 'profiles',
- end: -1,
- start: -1,
- };
- let timestamps: EventsStatsSeries<F>['timestamps'] = [];
- let firstAxis = true;
- for (const yAxis of yAxes) {
- const transformed = transformSingleSeries(yAxis, rawResponse[0][yAxis]);
- if (firstAxis) {
- meta = transformed.meta;
- timestamps = transformed.timestamps;
- } else if (
- meta.start !== transformed.meta.start ||
- meta.end !== transformed.meta.end
- ) {
- throw new Error('Mismatching start/end times');
- } else if (
- timestamps.length !== transformed.timestamps.length ||
- timestamps.some((ts, i) => ts !== transformed.timestamps[i])
- ) {
- throw new Error('Mismatching timestamps');
- }
- data.push(transformed.series);
- firstAxis = false;
- }
- return [
- {
- data,
- meta,
- timestamps,
- },
- rawResponse[1],
- rawResponse[2],
- ];
- }
- function transformSingleSeries<F extends string>(yAxis: F, rawSeries: any) {
- const series: EventsStatsSeries<F>['data'][number] = {
- axis: yAxis,
- values: [],
- };
- const meta: EventsStatsSeries<F>['meta'] = {
- dataset: 'profiles',
- end: rawSeries.end,
- start: rawSeries.start,
- };
- const timestamps: EventsStatsSeries<F>['timestamps'] = [];
- for (let i = 0; i < rawSeries.data.length; i++) {
- const [timestamp, value] = rawSeries.data[i];
- // the api has this awkward structure for legacy reason
- series.values.push(value[0].count as number);
- timestamps.push(timestamp);
- }
- return {
- series,
- meta,
- timestamps,
- };
- }
|