mirror of
https://github.com/elastic/kibana.git
synced 2025-06-27 10:40:07 -04:00
Closes #163282 ## Summary This PR: * Adds a `featureFlags.metricsExplorerEnabled` property to the Infra plugin config to enable and disable Metrics Explorer depending on the offering type * Prevents `MetricsExplorerViewsService` initialization for serveless based on the feature flag * Prevents creating Metrics Explorer frontend routes when in serverless * Prevents registration of the MetricsExplorerViews saved object when in serverless * Prevents initialization of the `metrics_explorer_views` API routes when in serverless **Trying to access Metrics Explorer in serverless** <img width="1829" alt="CleanShot 2023-09-22 at 12 59 35@2x" src="2b039925
-0f0b-4c07-be29-bbe910de7a34"> **Trying to access views API** <img width="1829" alt="CleanShot 2023-09-22 at 13 00 00@2x" src="15269ec2
-becd-4ee3-9b5e-d916df28a7b8"> **`infra/metrics_explorer` API still works as per ticket requirements** <img width="1829" alt="CleanShot 2023-09-22 at 13 00 06@2x" src="fb23f912
-c6fd-46c8-9084-c17c51e5b064"> ## How to test * Checkout locally * Enable Infra in `serverless.oblt.yml`: `xpack.infra.enabled: true` * Run Kibana in serverless mode * Try accessing `/app/metrics/explorer` route and make sure it's not available * Make sure other Infra routes (`/app/metrics/inventory` and `/app/metrics/hosts`) still load as expected * In Kibana dev console make sure you get 404 for `GET kbn:/api/infra/metrics_explorer_views` * Also check that you don't see `metrics-explorer-view` saved object in the response for `GET kbn:/api/kibana/management/saved_objects/_allowed_types` * Run Kibana in non-serverless mode and make sure Metrics Explorer is accessible and works as usual --------- Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com>
139 lines
6.4 KiB
TypeScript
139 lines
6.4 KiB
TypeScript
/*
|
|
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
|
|
* or more contributor license agreements. Licensed under the Elastic License
|
|
* 2.0; you may not use this file except in compliance with the Elastic License
|
|
* 2.0.
|
|
*/
|
|
|
|
import { i18n } from '@kbn/i18n';
|
|
|
|
import React, { useContext } from 'react';
|
|
import { Routes, Route } from '@kbn/shared-ux-router';
|
|
|
|
import { EuiErrorBoundary, EuiHeaderLinks, EuiHeaderLink } from '@elastic/eui';
|
|
import { useKibana } from '@kbn/kibana-react-plugin/public';
|
|
import { HeaderMenuPortal, useLinkProps } from '@kbn/observability-shared-plugin/public';
|
|
import { ObservabilityAIAssistantActionMenuItem } from '@kbn/observability-ai-assistant-plugin/public';
|
|
import { MetricsSourceConfigurationProperties } from '../../../common/metrics_sources';
|
|
import { HelpCenterContent } from '../../components/help_center_content';
|
|
import { useReadOnlyBadge } from '../../hooks/use_readonly_badge';
|
|
import { MetricsExplorerOptionsContainer } from './metrics_explorer/hooks/use_metrics_explorer_options';
|
|
import { WithMetricsExplorerOptionsUrlState } from '../../containers/metrics_explorer/with_metrics_explorer_options_url_state';
|
|
import { MetricsExplorerPage } from './metrics_explorer';
|
|
import { SnapshotPage } from './inventory_view';
|
|
import { NodeDetail } from './metric_detail';
|
|
import { MetricsSettingsPage } from './settings';
|
|
import { HostsLandingPage } from './hosts/hosts_landing_page';
|
|
import { SourceLoadingPage } from '../../components/source_loading_page';
|
|
import { WaffleOptionsProvider } from './inventory_view/hooks/use_waffle_options';
|
|
import { WaffleTimeProvider } from './inventory_view/hooks/use_waffle_time';
|
|
import { WaffleFiltersProvider } from './inventory_view/hooks/use_waffle_filters';
|
|
import { MetricsAlertDropdown } from '../../alerting/common/components/metrics_alert_dropdown';
|
|
import { AlertPrefillProvider } from '../../alerting/use_alert_prefill';
|
|
import { InfraMLCapabilitiesProvider } from '../../containers/ml/infra_ml_capabilities';
|
|
import { AnomalyDetectionFlyout } from './inventory_view/components/ml/anomaly_detection/anomaly_detection_flyout';
|
|
import { HeaderActionMenuContext } from '../../utils/header_action_menu_provider';
|
|
import { CreateDerivedIndexPattern, useSourceContext } from '../../containers/metrics_source';
|
|
import { NotFoundPage } from '../404';
|
|
import { ReactQueryProvider } from '../../containers/react_query_provider';
|
|
import { usePluginConfig } from '../../containers/plugin_config_context';
|
|
|
|
const ADD_DATA_LABEL = i18n.translate('xpack.infra.metricsHeaderAddDataButtonLabel', {
|
|
defaultMessage: 'Add data',
|
|
});
|
|
|
|
export const InfrastructurePage = () => {
|
|
const config = usePluginConfig();
|
|
const uiCapabilities = useKibana().services.application?.capabilities;
|
|
const { setHeaderActionMenu, theme$ } = useContext(HeaderActionMenuContext);
|
|
|
|
const settingsTabTitle = i18n.translate('xpack.infra.metrics.settingsTabTitle', {
|
|
defaultMessage: 'Settings',
|
|
});
|
|
|
|
const kibana = useKibana();
|
|
|
|
const { source, createDerivedIndexPattern } = useSourceContext();
|
|
|
|
useReadOnlyBadge(!uiCapabilities?.infrastructure?.save);
|
|
|
|
const settingsLinkProps = useLinkProps({
|
|
app: 'metrics',
|
|
pathname: 'settings',
|
|
});
|
|
|
|
return (
|
|
<EuiErrorBoundary>
|
|
<AlertPrefillProvider>
|
|
<WaffleOptionsProvider>
|
|
<WaffleTimeProvider>
|
|
<WaffleFiltersProvider>
|
|
<ReactQueryProvider>
|
|
<InfraMLCapabilitiesProvider>
|
|
<HelpCenterContent
|
|
feedbackLink="https://discuss.elastic.co/c/metrics"
|
|
appName={i18n.translate('xpack.infra.header.infrastructureHelpAppName', {
|
|
defaultMessage: 'Metrics',
|
|
})}
|
|
/>
|
|
{setHeaderActionMenu && theme$ && (
|
|
<HeaderMenuPortal setHeaderActionMenu={setHeaderActionMenu} theme$={theme$}>
|
|
<EuiHeaderLinks gutterSize="xs">
|
|
<EuiHeaderLink color={'text'} {...settingsLinkProps}>
|
|
{settingsTabTitle}
|
|
</EuiHeaderLink>
|
|
<Route path={'/inventory'} component={AnomalyDetectionFlyout} />
|
|
<MetricsAlertDropdown />
|
|
<EuiHeaderLink
|
|
href={kibana.services?.application?.getUrlForApp('/integrations/browse')}
|
|
color="primary"
|
|
iconType="indexOpen"
|
|
>
|
|
{ADD_DATA_LABEL}
|
|
</EuiHeaderLink>
|
|
<ObservabilityAIAssistantActionMenuItem />
|
|
</EuiHeaderLinks>
|
|
</HeaderMenuPortal>
|
|
)}
|
|
<Routes>
|
|
<Route path={'/inventory'} component={SnapshotPage} />
|
|
{config.featureFlags.metricsExplorerEnabled && (
|
|
<Route path={'/explorer'}>
|
|
<MetricsExplorerOptionsContainer>
|
|
<WithMetricsExplorerOptionsUrlState />
|
|
{source?.configuration ? (
|
|
<PageContent
|
|
configuration={source.configuration}
|
|
createDerivedIndexPattern={createDerivedIndexPattern}
|
|
/>
|
|
) : (
|
|
<SourceLoadingPage />
|
|
)}
|
|
</MetricsExplorerOptionsContainer>
|
|
</Route>
|
|
)}
|
|
<Route path="/detail/:type/:node" component={NodeDetail} />
|
|
<Route path={'/hosts'} component={HostsLandingPage} />
|
|
<Route path={'/settings'} component={MetricsSettingsPage} />
|
|
<Route render={() => <NotFoundPage title="Infrastructure" />} />
|
|
</Routes>
|
|
</InfraMLCapabilitiesProvider>
|
|
</ReactQueryProvider>
|
|
</WaffleFiltersProvider>
|
|
</WaffleTimeProvider>
|
|
</WaffleOptionsProvider>
|
|
</AlertPrefillProvider>
|
|
</EuiErrorBoundary>
|
|
);
|
|
};
|
|
|
|
const PageContent = (props: {
|
|
configuration: MetricsSourceConfigurationProperties;
|
|
createDerivedIndexPattern: CreateDerivedIndexPattern;
|
|
}) => {
|
|
const { createDerivedIndexPattern, configuration } = props;
|
|
|
|
return (
|
|
<MetricsExplorerPage derivedIndexPattern={createDerivedIndexPattern()} source={configuration} />
|
|
);
|
|
};
|