1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798 |
- import {createContext, useEffect, useState} from 'react';
- import {trackAnalytics} from 'sentry/utils/analytics';
- import {useMEPDataContext} from 'sentry/utils/performance/contexts/metricsEnhancedPerformanceDataContext';
- import useOrganization from 'sentry/utils/useOrganization';
- type TransactionListTableData =
- | {
- empty: boolean;
- query: string;
- }
- | undefined;
- export type PerformanceAtScaleContextProps = {
- metricsSeriesDataEmpty: boolean | undefined;
- setMetricsSeriesDataEmpty: (data: boolean | undefined) => void;
- setTransactionListTableData: (data: TransactionListTableData) => void;
- transactionListTableData: TransactionListTableData;
- };
- export const PerformanceAtScaleContext = createContext<
- PerformanceAtScaleContextProps | undefined
- >(undefined);
- type ProviderProps = {
- children: React.ReactNode;
- };
- export function PerformanceAtScaleContextProvider({children}: ProviderProps) {
- const [metricsSeriesDataEmpty, setMetricsSeriesDataEmpty] = useState<
- boolean | undefined
- >(false);
- const [transactionListTableData, setTransactionListTableData] =
- useState<TransactionListTableData>(undefined);
- const mepContext = useMEPDataContext();
- const organization = useOrganization();
- const query = transactionListTableData?.query ?? '';
- const transactionListTableEmpty = transactionListTableData?.empty;
- const isMetricsData = mepContext?.isMetricsData ?? false;
- useEffect(() => {
- // We only want to collect analytics events if we have metrics data
- // and if everything is dynamically samples
- if (!isMetricsData || !organization.isDynamicallySampled) {
- return;
- }
- // if the chart or the transaction list table are undefined,
- // some loading is probably still hapenning
- if (metricsSeriesDataEmpty === undefined || transactionListTableEmpty === undefined) {
- return;
- }
- // metricsSeriesDataEmpty comes from the series data response (events-stats request)
- // and if we don't have metrics data, we don't want to fire analytics events
- if (metricsSeriesDataEmpty) {
- return;
- }
- // If the transaction list table is empty, we want to fire the no_samples event
- // as it means that there is a gap in the dynamic sampling and we want to track that
- if (transactionListTableEmpty) {
- trackAnalytics('dynamic_sampling_transaction_summary.no_samples', {
- organization,
- query,
- });
- }
- // If the transaction list table is not empty and there are metrics, it means that
- // dynamic sampling is working properly and there is no gap
- trackAnalytics('dynamic_sampling_transaction_summary.baseline', {
- organization,
- query,
- });
- }, [
- metricsSeriesDataEmpty,
- isMetricsData,
- query,
- transactionListTableEmpty,
- organization,
- ]);
- return (
- <PerformanceAtScaleContext.Provider
- value={{
- metricsSeriesDataEmpty,
- setMetricsSeriesDataEmpty,
- setTransactionListTableData,
- transactionListTableData,
- }}
- >
- {children}
- </PerformanceAtScaleContext.Provider>
- );
- }
|