From 4fdd45bc1a97a8aabd009bad42722096ebc71779 Mon Sep 17 00:00:00 2001 From: Brittany LaGambina Date: Tue, 3 Feb 2026 09:17:05 +0000 Subject: [PATCH] Reduce polling in index details --- .../src/components/api_key_form.tsx | 4 +- .../connection_details/connection_details.tsx | 1 + .../components/indices/details_page.tsx | 55 ++++++++++++++----- .../components/indices/details_page_data.tsx | 5 +- .../public/hooks/api/use_delete_document.ts | 3 +- .../public/hooks/api/use_document_search.ts | 6 +- .../public/hooks/api/use_index.ts | 3 - .../public/hooks/api/use_index_mappings.ts | 3 - .../public/hooks/api/use_user_permissions.ts | 3 +- 9 files changed, 54 insertions(+), 29 deletions(-) diff --git a/x-pack/solutions/search/packages/kbn-search-api-keys-components/src/components/api_key_form.tsx b/x-pack/solutions/search/packages/kbn-search-api-keys-components/src/components/api_key_form.tsx index dd097c30b6419..34088ccf20185 100644 --- a/x-pack/solutions/search/packages/kbn-search-api-keys-components/src/components/api_key_form.tsx +++ b/x-pack/solutions/search/packages/kbn-search-api-keys-components/src/components/api_key_form.tsx @@ -25,9 +25,10 @@ const API_KEY_MASK = '•'.repeat(60); interface ApiKeyFormProps { hasTitle?: boolean; + minWidth?: number; } -export const ApiKeyForm: React.FC = ({ hasTitle = true }) => { +export const ApiKeyForm: React.FC = ({ hasTitle = true, minWidth }) => { const [showFlyout, setShowFlyout] = useState(false); const { apiKey, status, updateApiKey, toggleApiKeyVisibility } = useSearchApiKey(); @@ -43,6 +44,7 @@ export const ApiKeyForm: React.FC = ({ hasTitle = true }) => { copyValue={apiKey} dataTestSubj="apiKeyFormAPIKey" copyValueDataTestSubj="APIKeyButtonCopy" + minWidth={minWidth} actions={[ { copyValue={elasticsearchUrl} dataTestSubj="connectionDetailsEndpoint" copyValueDataTestSubj="connectionDetailsEndpointCopy" + minWidth={400} /> ); }; diff --git a/x-pack/solutions/search/plugins/search_indices/public/components/indices/details_page.tsx b/x-pack/solutions/search/plugins/search_indices/public/components/indices/details_page.tsx index d2648f10532bc..ef004d8f87be5 100644 --- a/x-pack/solutions/search/plugins/search_indices/public/components/indices/details_page.tsx +++ b/x-pack/solutions/search/plugins/search_indices/public/components/indices/details_page.tsx @@ -58,19 +58,23 @@ export const SearchIndexDetailsPage = () => { } = useKibana().services; const { data: index, - refetch, + refetch: refetchIndex, isError: isIndexError, isInitialLoading, error: indexLoadingError, } = useIndex(indexName); const { data: mappings, + refetch: refetchMappings, isError: isMappingsError, isInitialLoading: isMappingsInitialLoading, error: mappingsError, } = useIndexMapping(indexName); - const { data: indexDocuments, isInitialLoading: indexDocumentsIsInitialLoading } = - useIndexDocumentSearch(indexName); + const { + data: indexDocuments, + refetch: refetchIndexDocuments, + isInitialLoading: indexDocumentsIsInitialLoading, + } = useIndexDocumentSearch(indexName); const { data: userPrivileges } = useUserPrivilegesQuery(indexName); const navigateToPlayground = useCallback(async () => { @@ -112,6 +116,7 @@ export const SearchIndexDetailsPage = () => { isInitialLoading={indexDocumentsIsInitialLoading} userPrivileges={userPrivileges} navigateToPlayground={navigateToPlayground} + mappingData={mappings} /> ), 'data-test-subj': `${SearchIndexDetailsTabs.DATA}Tab`, @@ -141,6 +146,7 @@ export const SearchIndexDetailsPage = () => { indexDocuments, indexDocumentsIsInitialLoading, userPrivileges, + mappings, navigateToPlayground, ]); const [selectedTab, setSelectedTab] = useState(detailsPageTabs[0]); @@ -175,9 +181,12 @@ export const SearchIndexDetailsPage = () => { application.navigateToApp('management', { deepLinkId: 'index_management' }); }, [application]); - const refetchIndex = useCallback(() => { - refetch(); - }, [refetch]); + const refetchAllData = useCallback(() => { + refetchIndex(); + refetchMappings(); + refetchIndexDocuments(); + }, [refetchIndex, refetchMappings, refetchIndexDocuments]); + const indexError = useMemo( () => isIndexError @@ -197,7 +206,10 @@ export const SearchIndexDetailsPage = () => { }, [isShowingDeleteModal]); const { euiTheme } = useEuiTheme(); - if (isInitialLoading || isMappingsInitialLoading || indexDocumentsIsInitialLoading) { + const pageDataLoading = + isInitialLoading || isMappingsInitialLoading || indexDocumentsIsInitialLoading; + + if (pageDataLoading) { return ( {i18n.translate('xpack.searchIndices.loadingDescription', { @@ -221,7 +233,7 @@ export const SearchIndexDetailsPage = () => { ) : ( <> @@ -295,12 +307,27 @@ export const SearchIndexDetailsPage = () => { - - - - - - + + + + + + + + + + + + {i18n.translate('xpack.searchIndices.indexAction.refreshDataButtonLabel', { + defaultMessage: 'Refresh data', + })} + diff --git a/x-pack/solutions/search/plugins/search_indices/public/components/indices/details_page_data.tsx b/x-pack/solutions/search/plugins/search_indices/public/components/indices/details_page_data.tsx index 2627b4a1f473d..70dd286b78563 100644 --- a/x-pack/solutions/search/plugins/search_indices/public/components/indices/details_page_data.tsx +++ b/x-pack/solutions/search/plugins/search_indices/public/components/indices/details_page_data.tsx @@ -20,7 +20,6 @@ import { CLOUD_CONNECT_NAV_ID } from '@kbn/deeplinks-management/constants'; import type { UserStartPrivilegesResponse } from '../../../common'; import { useKibana } from '../../hooks/use_kibana'; -import { useIndexMapping } from '../../hooks/api/use_index_mappings'; import type { IndexDocuments as IndexDocumentsType } from '../../hooks/api/use_document_search'; import { IndexDocuments } from '../index_documents/index_documents'; import { IndexSearchExample } from './details_search_example'; @@ -29,6 +28,7 @@ import { UpdateElserMappingsModal } from '../update_elser_mappings/update_elser_ import { flattenMappings, hasElserOnMlNodeSemanticTextField } from '../update_elser_mappings/utils'; import type { NormalizedFields } from '../update_elser_mappings/types'; import { useLicense } from '../../hooks/use_license'; +import type { Mappings } from '../../types'; interface IndexDetailsDataProps { indexName: string; @@ -36,6 +36,7 @@ interface IndexDetailsDataProps { isInitialLoading: boolean; navigateToPlayground: () => void; userPrivileges?: UserStartPrivilegesResponse; + mappingData: Mappings | undefined; } export const IndexDetailsData = ({ @@ -44,9 +45,9 @@ export const IndexDetailsData = ({ isInitialLoading, navigateToPlayground, userPrivileges, + mappingData, }: IndexDetailsDataProps) => { const { application, cloud } = useKibana().services; - const { data: mappingData } = useIndexMapping(indexName); const { isAtLeastEnterprise } = useLicense(); const [isUpdatingElserMappings, setIsUpdatingElserMappings] = useState(false); diff --git a/x-pack/solutions/search/plugins/search_indices/public/hooks/api/use_delete_document.ts b/x-pack/solutions/search/plugins/search_indices/public/hooks/api/use_delete_document.ts index 446fa30ab2547..0510869fee0b2 100644 --- a/x-pack/solutions/search/plugins/search_indices/public/hooks/api/use_delete_document.ts +++ b/x-pack/solutions/search/plugins/search_indices/public/hooks/api/use_delete_document.ts @@ -11,7 +11,8 @@ import type { SearchHit } from '@elastic/elasticsearch/lib/api/types'; import { MutationKeys, QueryKeys } from '../../constants'; import { useKibana } from '../use_kibana'; import type { IndexDocuments } from './use_document_search'; -import { INDEX_SEARCH_POLLING } from './use_document_search'; + +const INDEX_SEARCH_POLLING = 30000; interface DeleteDocumentParams { id: string; diff --git a/x-pack/solutions/search/plugins/search_indices/public/hooks/api/use_document_search.ts b/x-pack/solutions/search/plugins/search_indices/public/hooks/api/use_document_search.ts index 156740affa869..8a74729f74dac 100644 --- a/x-pack/solutions/search/plugins/search_indices/public/hooks/api/use_document_search.ts +++ b/x-pack/solutions/search/plugins/search_indices/public/hooks/api/use_document_search.ts @@ -23,15 +23,12 @@ const DEFAULT_PAGINATION = { size: DEFAULT_DOCUMENT_PAGE_SIZE, total: 0, }; -export const INDEX_SEARCH_POLLING = 30000; export const useIndexDocumentSearch = (indexName: string) => { const { services: { http }, } = useKibana(); - const { data, isInitialLoading } = useQuery({ + const { data, isInitialLoading, refetch } = useQuery({ queryKey: [QueryKeys.SearchDocuments, indexName], - refetchInterval: INDEX_SEARCH_POLLING, - refetchIntervalInBackground: true, refetchOnWindowFocus: 'always', queryFn: async ({ signal }) => http.post(`/internal/search_indices/${indexName}/documents/search`, { @@ -48,6 +45,7 @@ export const useIndexDocumentSearch = (indexName: string) => { }); return { data, + refetch, isInitialLoading, meta: pageToPagination(data?.results?._meta?.page ?? DEFAULT_PAGINATION), }; diff --git a/x-pack/solutions/search/plugins/search_indices/public/hooks/api/use_index.ts b/x-pack/solutions/search/plugins/search_indices/public/hooks/api/use_index.ts index 31a1e9675387b..bff1b63d5441b 100644 --- a/x-pack/solutions/search/plugins/search_indices/public/hooks/api/use_index.ts +++ b/x-pack/solutions/search/plugins/search_indices/public/hooks/api/use_index.ts @@ -10,14 +10,11 @@ import { useQuery } from '@kbn/react-query'; import { QueryKeys } from '../../constants'; import { useKibana } from '../use_kibana'; -const POLLING_INTERVAL = 15 * 1000; export const useIndex = (indexName: string) => { const { http } = useKibana().services; const queryKey = [QueryKeys.FetchIndex, indexName]; return useQuery({ queryKey, - refetchInterval: POLLING_INTERVAL, - refetchIntervalInBackground: true, refetchOnWindowFocus: 'always', retry: (failureCount, error) => { return !(error?.body?.statusCode === 404 || failureCount === 3); diff --git a/x-pack/solutions/search/plugins/search_indices/public/hooks/api/use_index_mappings.ts b/x-pack/solutions/search/plugins/search_indices/public/hooks/api/use_index_mappings.ts index c16a1759ec536..7e68abd114b01 100644 --- a/x-pack/solutions/search/plugins/search_indices/public/hooks/api/use_index_mappings.ts +++ b/x-pack/solutions/search/plugins/search_indices/public/hooks/api/use_index_mappings.ts @@ -10,14 +10,11 @@ import { useKibana } from '../use_kibana'; import type { Mappings } from '../../types'; import { QueryKeys } from '../../constants'; -const POLLING_INTERVAL = 15 * 1000; export const useIndexMapping = (indexName: string) => { const { http } = useKibana().services; const queryKey = [QueryKeys.FetchMapping, indexName]; return useQuery({ queryKey, - refetchInterval: POLLING_INTERVAL, - refetchIntervalInBackground: true, refetchOnWindowFocus: 'always', queryFn: () => http.fetch(`/api/index_management/mapping/${encodeURIComponent(indexName)}`), diff --git a/x-pack/solutions/search/plugins/search_indices/public/hooks/api/use_user_permissions.ts b/x-pack/solutions/search/plugins/search_indices/public/hooks/api/use_user_permissions.ts index 5bfc286905207..a5797c6a22206 100644 --- a/x-pack/solutions/search/plugins/search_indices/public/hooks/api/use_user_permissions.ts +++ b/x-pack/solutions/search/plugins/search_indices/public/hooks/api/use_user_permissions.ts @@ -15,7 +15,8 @@ import { useKibana } from '../use_kibana'; export const useUserPrivilegesQuery = (indexName: string) => { const { http } = useKibana().services; return useQuery({ - queryKey: [QueryKeys.FetchUserStartPrivileges], + queryKey: [QueryKeys.FetchUserStartPrivileges, indexName], + refetchOnWindowFocus: false, queryFn: () => http.get( `/internal/search_indices/start_privileges/${indexName}`