Skip to content

Commit 6576fcd

Browse files
committed
feat: disable anomaly detection for otel
1 parent d4d3447 commit 6576fcd

7 files changed

Lines changed: 110 additions & 25 deletions

File tree

x-pack/solutions/observability/plugins/infra/public/components/asset_details/hooks/use_asset_details_render_props.ts

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,9 @@
66
*/
77

88
import createContainer from 'constate';
9-
import { useMemo } from 'react';
9+
import { useEffect, useMemo } from 'react';
1010
import type { DataSchemaFormat } from '@kbn/metrics-data-access-plugin/common';
11+
import { useInfraMLCapabilitiesContext } from '../../../containers/ml/infra_ml_capabilities';
1112
import type { AssetDetailsProps } from '../types';
1213
import { useAssetDetailsUrlState } from './use_asset_details_url_state';
1314
import { useMetadataStateContext } from './use_metadata_state';
@@ -22,13 +23,18 @@ export function useAssetDetailsRenderProps(props: UseAssetDetailsRenderProps) {
2223
const [urlState] = useAssetDetailsUrlState();
2324
const { metadata } = useMetadataStateContext();
2425
const { data: timeRangeMetadata } = useTimeRangeMetadataContext();
26+
const { updateTopbarMenuVisibilityBySchema } = useInfraMLCapabilitiesContext();
2527
const { entityId, entityName, entityType, ...rest } = props;
2628

2729
const schema = useMemo<DataSchemaFormat | null>(() => {
2830
if (!timeRangeMetadata) return null;
2931
return timeRangeMetadata.preferredSchema;
3032
}, [timeRangeMetadata]);
3133

34+
useEffect(() => {
35+
updateTopbarMenuVisibilityBySchema(schema);
36+
}, [schema, updateTopbarMenuVisibilityBySchema]);
37+
3238
// When the asset entity.name is known we can load the page faster
3339
// Otherwise we need to use metadata response.
3440
const loading = !entityName && !urlState?.name && !metadata?.name;

x-pack/solutions/observability/plugins/infra/public/components/asset_details/hooks/use_page_header.tsx

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import type { RouteState } from '@kbn/metrics-data-access-plugin/public';
1616
import { capitalize, isEmpty } from 'lodash';
1717
import React, { useCallback, useMemo } from 'react';
1818
import { useHistory, useLocation } from 'react-router-dom';
19+
import { useInfraMLCapabilitiesContext } from '../../../containers/ml/infra_ml_capabilities';
1920
import { usePluginConfig } from '../../../containers/plugin_config_context';
2021
import { useKibanaContextForPlugin } from '../../../hooks/use_kibana';
2122
import { useProfilingPluginSetting } from '../../../hooks/use_profiling_integration_setting';
@@ -110,16 +111,18 @@ const useRightSideItems = (links?: LinkOptions[]) => {
110111
return { rightSideItems };
111112
};
112113

113-
const useFeatureFlagTabs = () => {
114+
const useConditionalTabs = () => {
115+
const { isTopbarMenuVisible } = useInfraMLCapabilitiesContext();
114116
const { featureFlags } = usePluginConfig();
115117
const isProfilingPluginEnabled = useProfilingPluginSetting();
116118

117119
const featureFlagControlledTabs: Partial<Record<ContentTabIds, boolean>> = useMemo(
118120
() => ({
119121
[ContentTabIds.OSQUERY]: Boolean(featureFlags.osqueryEnabled),
120122
[ContentTabIds.PROFILING]: Boolean(isProfilingPluginEnabled),
123+
[ContentTabIds.ANOMALIES]: isTopbarMenuVisible,
121124
}),
122-
[featureFlags.osqueryEnabled, isProfilingPluginEnabled]
125+
[featureFlags.osqueryEnabled, isProfilingPluginEnabled, isTopbarMenuVisible]
123126
);
124127

125128
const isTabEnabled = useCallback(
@@ -136,7 +139,7 @@ const useFeatureFlagTabs = () => {
136139

137140
const useTabs = (tabs: Tab[]) => {
138141
const { showTab, activeTabId } = useTabSwitcherContext();
139-
const { isTabEnabled } = useFeatureFlagTabs();
142+
const { isTabEnabled } = useConditionalTabs();
140143

141144
const onTabClick = useCallback(
142145
(tabId: TabIds) => {

x-pack/solutions/observability/plugins/infra/public/components/ml/anomaly_detection/job_setup_screen.tsx

Lines changed: 56 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -29,15 +29,21 @@ import { FormattedMessage } from '@kbn/i18n-react';
2929
import type { Moment } from 'moment';
3030
import moment from 'moment';
3131
import { i18n } from '@kbn/i18n';
32-
import { FeatureFeedbackButton, useUiTracker } from '@kbn/observability-shared-plugin/public';
32+
import {
33+
FeatureFeedbackButton,
34+
useKibanaQuerySettings,
35+
useUiTracker,
36+
} from '@kbn/observability-shared-plugin/public';
3337
import { css } from '@emotion/react';
3438
import type { Query } from '@kbn/es-query';
39+
import { buildEsQuery, fromKueryExpression } from '@kbn/es-query';
40+
import { findInventoryModel } from '@kbn/metrics-data-access-plugin/common';
41+
import type { estypes } from '@elastic/elasticsearch';
3542
import { useMetricsDataViewContext } from '../../../containers/metrics_source';
3643
import { useMetricHostsModuleContext } from '../../../containers/ml/modules/metrics_hosts/module';
3744
import { useMetricK8sModuleContext } from '../../../containers/ml/modules/metrics_k8s/module';
3845
import { FixedDatePicker } from '../../fixed_datepicker';
3946
import { DEFAULT_K8S_PARTITION_FIELD } from '../../../containers/ml/modules/metrics_k8s/module_descriptor';
40-
import { convertKueryToElasticSearchQuery } from '../../../utils/kuery';
4147
import { INFRA_ML_FLYOUT_FEEDBACK_LINK } from './flyout_home';
4248
import { KibanaEnvironmentContext, useKibanaContextForPlugin } from '../../../hooks/use_kibana';
4349
import { UnifiedSearchBar } from '../../shared/unified_search_bar';
@@ -57,11 +63,11 @@ export const JobSetupScreen = (props: Props) => {
5763
const kubernetes = useMetricK8sModuleContext();
5864
const { metricsView } = useMetricsDataViewContext();
5965
const [filter, setFilter] = useState<string>('');
60-
const [filterQuery, setFilterQuery] = useState<string>('');
6166
const trackMetric = useUiTracker({ app: 'infra_metrics' });
6267
const { kibanaVersion, isCloudEnv, isServerlessEnv } = useContext(KibanaEnvironmentContext);
6368
const { euiTheme } = useEuiTheme();
6469
const { telemetry } = useKibanaContextForPlugin().services;
70+
const kibanaQuerySettings = useKibanaQuerySettings();
6571

6672
const indices = host.sourceConfiguration.indices;
6773

@@ -108,7 +114,42 @@ export const JobSetupScreen = (props: Props) => {
108114
[telemetry, props.jobType]
109115
);
110116

117+
const isValidKuery = useCallback(
118+
(expression: string) => {
119+
try {
120+
fromKueryExpression(expression, kibanaQuerySettings);
121+
} catch (err) {
122+
return false;
123+
}
124+
return true;
125+
},
126+
[kibanaQuerySettings]
127+
);
128+
129+
const getFilterForHosts = useCallback(
130+
(baseQuery: estypes.QueryDslQueryContainer): estypes.QueryDslQueryContainer[] => {
131+
const inventoryModel = findInventoryModel('host');
132+
133+
return [...[baseQuery], ...(inventoryModel.nodeFilter?.({ schema: 'ecs' }) ?? [])];
134+
},
135+
[]
136+
);
137+
111138
const createJobs = useCallback(() => {
139+
const baseQuery = buildEsQuery(
140+
metricsView?.dataViewReference,
141+
{
142+
language: 'kuery',
143+
query: isValidKuery(filter) ? filter : '',
144+
},
145+
[],
146+
kibanaQuerySettings
147+
);
148+
149+
const filterQuery = JSON.stringify(
150+
props.jobType === 'hosts' ? getFilterForHosts(baseQuery) : [baseQuery]
151+
);
152+
112153
const date = moment(startDate).toDate();
113154
if (hasSummaries) {
114155
telemetry.reportAnomalyDetectionSetup({
@@ -144,29 +185,31 @@ export const JobSetupScreen = (props: Props) => {
144185
);
145186
}
146187
}, [
147-
cleanUpAndSetUpModule,
148-
filterQuery,
149-
setUpModule,
150-
hasSummaries,
151-
indices,
152-
partitionField,
153-
startDate,
154-
telemetry,
188+
metricsView?.dataViewReference,
189+
isValidKuery,
155190
filter,
191+
kibanaQuerySettings,
156192
props.jobType,
193+
getFilterForHosts,
194+
startDate,
195+
hasSummaries,
196+
telemetry,
197+
partitionField,
198+
cleanUpAndSetUpModule,
199+
indices,
200+
setUpModule,
157201
]);
158202

159203
const onFilterChange = useCallback(
160204
(payload: { query?: Query }) => {
161205
const kuery = payload.query?.query as string;
162206
setFilter(kuery);
163-
setFilterQuery(convertKueryToElasticSearchQuery(kuery, metricsView?.dataViewReference) || '');
164207
telemetry.reportAnomalyDetectionFilterFieldChange({
165208
job_type: props.jobType,
166209
filter_field: kuery ? kuery : undefined,
167210
});
168211
},
169-
[metricsView?.dataViewReference, telemetry, props.jobType]
212+
[telemetry, props.jobType]
170213
);
171214

172215
const onPartitionFieldChange = useCallback(

x-pack/solutions/observability/plugins/infra/public/containers/ml/infra_ml_capabilities.tsx

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,13 @@
66
*/
77

88
import createContainer from 'constate';
9-
import { useMemo, useState, useEffect } from 'react';
9+
import { useMemo, useState, useEffect, useCallback } from 'react';
1010
import { fold } from 'fp-ts/Either';
1111
import { pipe } from 'fp-ts/pipeable';
1212
import { identity } from 'fp-ts/function';
1313
import { throwErrors, createPlainError } from '@kbn/io-ts-utils';
14+
import { useBoolean } from '@kbn/react-hooks';
15+
import type { DataSchemaFormat } from '@kbn/metrics-data-access-plugin/common';
1416
import { useTrackedPromise } from '../../hooks/use_tracked_promise';
1517
import type { GetMlCapabilitiesResponsePayload } from './api/ml_api_types';
1618
import { getMlCapabilitiesResponsePayloadRT } from './api/ml_api_types';
@@ -20,6 +22,7 @@ export const useInfraMLCapabilities = () => {
2022
const { services } = useKibanaContextForPlugin();
2123
const [mlCapabilities, setMlCapabilities] =
2224
useState<GetMlCapabilitiesResponsePayload>(initialMlCapabilities);
25+
const [isTopbarMenuVisible, { on: showTopbarMenu, off: hideTopbarMenu }] = useBoolean(false);
2326

2427
const [fetchMlCapabilitiesRequest, fetchMlCapabilities] = useTrackedPromise(
2528
{
@@ -50,6 +53,21 @@ export const useInfraMLCapabilities = () => {
5053
[fetchMlCapabilitiesRequest.state]
5154
);
5255

56+
const updateTopbarMenuVisibilityBySchema = useCallback(
57+
(schema?: DataSchemaFormat | null) => {
58+
if (!schema) {
59+
return;
60+
}
61+
62+
if (schema === 'semconv') {
63+
hideTopbarMenu();
64+
} else {
65+
showTopbarMenu();
66+
}
67+
},
68+
[hideTopbarMenu, showTopbarMenu]
69+
);
70+
5371
const hasInfraMLSetupCapabilities = mlCapabilities.capabilities.canCreateJob;
5472
const hasInfraMLReadCapabilities = mlCapabilities.capabilities.canGetJobs;
5573
const hasInfraMLCapabilities =
@@ -60,6 +78,8 @@ export const useInfraMLCapabilities = () => {
6078
hasInfraMLReadCapabilities,
6179
hasInfraMLSetupCapabilities,
6280
isLoading,
81+
isTopbarMenuVisible,
82+
updateTopbarMenuVisibilityBySchema,
6383
};
6484
};
6585

x-pack/solutions/observability/plugins/infra/public/pages/metrics/hosts/hooks/use_unified_search.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import { Subscription, map, tap } from 'rxjs';
1212
import deepEqual from 'fast-deep-equal';
1313
import useEffectOnce from 'react-use/lib/useEffectOnce';
1414
import { useKibanaQuerySettings } from '@kbn/observability-shared-plugin/public';
15+
import { useInfraMLCapabilitiesContext } from '../../../../containers/ml/infra_ml_capabilities';
1516
import type { HostsViewQuerySubmittedParams } from '../../../../services/telemetry';
1617
import { useTimeRange } from '../../../../hooks/use_time_range';
1718
import { useReloadRequestTimeContext } from '../../../../hooks/use_reload_request_time';
@@ -58,6 +59,7 @@ export const useUnifiedSearch = () => {
5859
const [searchCriteria, setSearch] = useHostsUrlState();
5960
const { metricsView } = useMetricsDataViewContext();
6061
const { updateReloadRequestTime } = useReloadRequestTimeContext();
62+
const { updateTopbarMenuVisibilityBySchema } = useInfraMLCapabilitiesContext();
6163
const { services } = useKibanaContextForPlugin();
6264
const kibanaQuerySettings = useKibanaQuerySettings();
6365

@@ -111,9 +113,11 @@ export const useUnifiedSearch = () => {
111113
const onPreferredSchemaChange = useCallback(
112114
(preferredSchema: HostsState['preferredSchema']) => {
113115
setSearch({ type: 'SET_PREFERRED_SCHEMA', preferredSchema });
116+
117+
updateTopbarMenuVisibilityBySchema(preferredSchema);
114118
updateReloadRequestTime();
115119
},
116-
[setSearch, updateReloadRequestTime]
120+
[setSearch, updateReloadRequestTime, updateTopbarMenuVisibilityBySchema]
117121
);
118122

119123
const onDateRangeChange = useCallback(

x-pack/solutions/observability/plugins/infra/public/pages/metrics/index.tsx

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,10 @@ import { useReadOnlyBadge } from '../../hooks/use_readonly_badge';
2727
import { MetricsSettingsPage } from './settings';
2828
import { MetricsAlertDropdown } from '../../alerting/common/components/metrics_alert_dropdown';
2929
import { AlertPrefillProvider } from '../../alerting/use_alert_prefill';
30-
import { InfraMLCapabilitiesProvider } from '../../containers/ml/infra_ml_capabilities';
30+
import {
31+
InfraMLCapabilitiesProvider,
32+
useInfraMLCapabilitiesContext,
33+
} from '../../containers/ml/infra_ml_capabilities';
3134
import { AnomalyDetectionFlyout } from '../../components/ml/anomaly_detection/anomaly_detection_flyout';
3235
import { HeaderActionMenuContext } from '../../containers/header_action_menu_provider';
3336
import { NotFoundPage } from '../404';
@@ -160,12 +163,15 @@ export const InfrastructurePage = () => {
160163

161164
const HeaderLinkAnomalyFlyoutRoute = ({ path }: { path: string }) => {
162165
const isInventory = path !== '/inventory';
166+
const { isTopbarMenuVisible } = useInfraMLCapabilitiesContext();
163167
return (
164168
<Route
165169
path={path}
166-
render={() => (
167-
<AnomalyDetectionFlyout hideJobType={isInventory} hideSelectGroup={isInventory} />
168-
)}
170+
render={() =>
171+
isTopbarMenuVisible ? (
172+
<AnomalyDetectionFlyout hideJobType={isInventory} hideSelectGroup={isInventory} />
173+
) : null
174+
}
169175
/>
170176
);
171177
};

x-pack/solutions/observability/plugins/infra/public/pages/metrics/inventory_view/hooks/use_waffle_options.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import createContainer from 'constate';
1313
import type { DataSchemaFormat } from '@kbn/metrics-data-access-plugin/common';
1414
import { type InventoryItemType } from '@kbn/metrics-data-access-plugin/common';
1515
import { useUrlState } from '@kbn/observability-shared-plugin/public';
16+
import { useInfraMLCapabilitiesContext } from '../../../../containers/ml/infra_ml_capabilities';
1617
import type {
1718
InventoryView,
1819
InventoryViewOptions,
@@ -101,7 +102,7 @@ function mapInventoryViewToState(savedView: InventoryView): WaffleOptionsState {
101102

102103
export const useWaffleOptions = () => {
103104
const { currentView } = useInventoryViewsContext();
104-
105+
const { updateTopbarMenuVisibilityBySchema } = useInfraMLCapabilitiesContext();
105106
const [urlState, setUrlState] = useUrlState<WaffleOptionsState>({
106107
defaultState: currentView ? mapInventoryViewToState(currentView) : DEFAULT_WAFFLE_OPTIONS_STATE,
107108
decodeUrlState,
@@ -194,8 +195,10 @@ export const useWaffleOptions = () => {
194195
metric: DEFAULT_WAFFLE_OPTIONS_STATE.metric,
195196
groupBy: DEFAULT_WAFFLE_OPTIONS_STATE.groupBy,
196197
}));
198+
199+
updateTopbarMenuVisibilityBySchema(preferredSchema);
197200
},
198-
[setUrlState]
201+
[setUrlState, updateTopbarMenuVisibilityBySchema]
199202
);
200203

201204
const { inventoryPrefill } = useAlertPrefillContext();

0 commit comments

Comments
 (0)