[data views] Type cleanup, monitoring uses data views service instead of faking data view (#128853)

* remove deprecated types

* remove more IIndexPattern

* Update x-pack/plugins/monitoring/kibana.json

Co-authored-by: Felix Stürmer <weltenwort@users.noreply.github.com>

* switch conditional to guard statement

* add data view to triggers_actions_ui

Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com>
Co-authored-by: Felix Stürmer <weltenwort@users.noreply.github.com>
This commit is contained in:
Matthew Kime 2022-04-14 09:13:07 -05:00 committed by GitHub
parent d5d798f09c
commit 0a800c4b8a
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
29 changed files with 115 additions and 76 deletions

View file

@ -701,7 +701,7 @@ export const getOperatorOptions = (
* to find it's corresponding keyword type (if available) which does
* generate autocomplete values
*
* @param fields IFieldType fields
* @param fields DataViewFieldBase fields
* @param selectedField the field name that was selected
* @param isTextType we only want a corresponding keyword field if
* the selected field is of type 'text'

View file

@ -39,7 +39,7 @@ describe('_terms_enum suggestions', () => {
'fieldName',
'query',
[],
{ name: 'field_name', type: 'string' }
{ name: 'field_name', type: 'string', searchable: true, aggregatable: true }
);
const [[args]] = esClientMock.termsEnum.mock.calls;

View file

@ -8,7 +8,7 @@
import { ElasticsearchClient, SavedObjectsClientContract } from 'kibana/server';
import type * as estypes from '@elastic/elasticsearch/lib/api/typesWithBodyKey';
import { IFieldType } from '../../common';
import { FieldSpec } from '../../common';
import { findIndexPatternById, getFieldByName } from '../data_views';
import { ConfigSchema } from '../../config';
@ -20,7 +20,7 @@ export async function termsEnumSuggestions(
fieldName: string,
query: string,
filters?: estypes.QueryDslQueryContainer[],
field?: IFieldType,
field?: FieldSpec,
abortSignal?: AbortSignal
) {
const { tiers } = config.autocomplete.valueSuggestions;

View file

@ -43,7 +43,7 @@ export {
getCapabilitiesForRollupIndices,
} from './data_views';
export type { IFieldType, IndexPatternAttributes } from '../common';
export type { IndexPatternAttributes } from '../common';
export {
IndexPatternField,
ES_FIELD_TYPES,

View file

@ -6,9 +6,9 @@
* Side Public License, v 1.
*/
import { IFieldType } from './types';
import { FieldSpec } from '..';
export const fields: IFieldType[] = [
export const fields: FieldSpec[] = [
{
name: 'bytes',
type: 'number',
@ -308,4 +308,4 @@ export const fields: IFieldType[] = [
},
];
export const getField = (name: string) => fields.find((field) => field.name === name) as IFieldType;
export const getField = (name: string) => fields.find((field) => field.name === name) as FieldSpec;

View file

@ -7,18 +7,13 @@
*/
import { SavedObjectsClientContract } from 'kibana/server';
import {
IFieldType,
DATA_VIEW_SAVED_OBJECT_TYPE,
DataViewAttributes,
SavedObject,
} from '../common';
import { DATA_VIEW_SAVED_OBJECT_TYPE, DataViewAttributes, SavedObject, FieldSpec } from '../common';
export const getFieldByName = (
fieldName: string,
indexPattern: SavedObject<DataViewAttributes>
): IFieldType | undefined => {
const fields: IFieldType[] = indexPattern && JSON.parse(indexPattern.attributes.fields);
): FieldSpec | undefined => {
const fields: FieldSpec[] = indexPattern && JSON.parse(indexPattern.attributes.fields);
const field = fields && fields.find((f) => f.name === fieldName);
return field;

View file

@ -6,7 +6,7 @@
* Side Public License, v 1.
*/
import { IIndexPatternFieldList, DataView } from '../../../data_views/public';
import { DataView } from '../../../data_views/public';
const fields = [
{
@ -62,7 +62,7 @@ const fields = [
filterable: true,
aggregatable: true,
},
] as IIndexPatternFieldList;
] as DataView['fields'];
fields.getByName = (name: string) => {
return fields.find((field) => field.name === name);

View file

@ -6,7 +6,7 @@
* Side Public License, v 1.
*/
import { IIndexPatternFieldList, DataView } from '../../../data_views/public';
import { DataView } from '../../../data_views/public';
const fields = [
{
@ -49,7 +49,7 @@ const fields = [
scripted: true,
filterable: false,
},
] as IIndexPatternFieldList;
] as DataView['fields'];
fields.getByName = (name: string) => {
return fields.find((field) => field.name === name);

View file

@ -13,6 +13,7 @@ import { coreMock as mockCoreMock } from 'src/core/public/mocks';
import { Comparator, InventoryMetricConditions } from '../../../../common/alerting/metrics';
import { SnapshotCustomMetricInput } from '../../../../common/http_api/snapshot_api';
import { AlertContextMeta, defaultExpression, ExpressionRow, Expressions } from './expression';
import { dataViewPluginMocks } from 'src/plugins/data_views/public/mocks';
jest.mock('../../../containers/metrics_source/use_source_via_http', () => ({
useSourceViaHttp: () => ({
@ -34,6 +35,8 @@ const exampleCustomMetric = {
type: 'custom',
} as SnapshotCustomMetricInput;
const dataViewMock = dataViewPluginMocks.createStartContract();
describe('Expression', () => {
async function setup(currentOptions: AlertContextMeta) {
const ruleParams = {
@ -51,6 +54,7 @@ describe('Expression', () => {
setRuleParams={(key, value) => Reflect.set(ruleParams, key, value)}
setRuleProperty={() => {}}
metadata={currentOptions}
dataViews={dataViewMock}
/>
);
@ -116,6 +120,7 @@ describe('Expression', () => {
setRuleParams={(key, value) => Reflect.set(ruleParams, key, value)}
setRuleProperty={() => {}}
metadata={{}}
dataViews={dataViewMock}
/>
);

View file

@ -11,6 +11,7 @@ import { coreMock as mockCoreMock } from 'src/core/public/mocks';
import React from 'react';
import { Expression, AlertContextMeta } from './expression';
import { act } from 'react-dom/test-utils';
import { dataViewPluginMocks } from 'src/plugins/data_views/public/mocks';
jest.mock('../../../containers/metrics_source/use_source_via_http', () => ({
useSourceViaHttp: () => ({
@ -38,6 +39,8 @@ jest.mock('../../../containers/ml/infra_ml_capabilities', () => ({
}),
}));
const dataViewMock = dataViewPluginMocks.createStartContract();
describe('Expression', () => {
async function setup(currentOptions: AlertContextMeta) {
const ruleParams = {
@ -55,6 +58,7 @@ describe('Expression', () => {
setRuleParams={(key, value) => Reflect.set(ruleParams, key, value)}
setRuleProperty={() => {}}
metadata={currentOptions}
dataViews={dataViewMock}
/>
);

View file

@ -13,6 +13,7 @@ import { coreMock as mockCoreMock } from 'src/core/public/mocks';
import { Comparator } from '../../../../common/alerting/metrics';
import { MetricsExplorerMetric } from '../../../../common/http_api/metrics_explorer';
import { Expressions } from './expression';
import { dataViewPluginMocks } from 'src/plugins/data_views/public/mocks';
jest.mock('../../../containers/metrics_source/use_source_via_http', () => ({
useSourceViaHttp: () => ({
@ -27,6 +28,8 @@ jest.mock('../../../hooks/use_kibana', () => ({
}),
}));
const dataViewMock = dataViewPluginMocks.createStartContract();
describe('Expression', () => {
async function setup(currentOptions: {
metrics?: MetricsExplorerMetric[];
@ -51,6 +54,7 @@ describe('Expression', () => {
metadata={{
currentOptions,
}}
dataViews={dataViewMock}
/>
);

View file

@ -7,7 +7,7 @@
"githubTeam": "stack-monitoring-ui"
},
"configPath": ["monitoring"],
"requiredPlugins": ["licensing", "features", "data", "navigation", "observability"],
"requiredPlugins": ["licensing", "features", "data", "navigation", "observability", "dataViews"],
"optionalPlugins": [
"infra",
"usageCollection",

View file

@ -7,7 +7,7 @@
import React, { Fragment, useCallback } from 'react';
import { EuiForm, EuiFormRow, EuiSpacer } from '@elastic/eui';
import { DataPublicPluginStart } from 'src/plugins/data/public';
import { DataViewsPublicPluginStart } from 'src/plugins/data_views/public';
import { debounce } from 'lodash';
import { i18n } from '@kbn/i18n';
import { CommonAlertParamDetails } from '../../../../common/types/alerts';
@ -29,14 +29,14 @@ export interface Props {
setRuleProperty: (property: string, value: any) => void;
errors: { [key: string]: string[] };
paramDetails: CommonAlertParamDetails;
data: DataPublicPluginStart;
dataViews: DataViewsPublicPluginStart;
config?: MonitoringConfig;
}
export const Expression: React.FC<Props> = (props) => {
const { ruleParams, paramDetails, setRuleParams, errors, config, data } = props;
const { ruleParams, paramDetails, setRuleParams, errors, config, dataViews } = props;
const { derivedIndexPattern } = useDerivedIndexPattern(data, config);
const { derivedIndexPattern } = useDerivedIndexPattern(dataViews, config);
const alertParamsUi = Object.keys(paramDetails).map((alertParamName) => {
const details = paramDetails[alertParamName];
@ -92,11 +92,12 @@ export const Expression: React.FC<Props> = (props) => {
const onFilterChange = useCallback(
(filter: string) => {
setRuleParams('filterQueryText', filter);
setRuleParams(
'filterQuery',
convertKueryToElasticSearchQuery(filter, derivedIndexPattern) || ''
);
if (derivedIndexPattern) setRuleParams('filterQueryText', filter);
if (derivedIndexPattern)
setRuleParams(
'filterQuery',
convertKueryToElasticSearchQuery(filter, derivedIndexPattern) || ''
);
},
[setRuleParams, derivedIndexPattern]
);
@ -106,6 +107,17 @@ export const Expression: React.FC<Props> = (props) => {
onFilterChange,
]);
const kueryBar = derivedIndexPattern ? (
<KueryBar
value={ruleParams.filterQueryText}
derivedIndexPattern={derivedIndexPattern}
onSubmit={onFilterChange}
onChange={debouncedOnFilterChange}
/>
) : (
<></>
);
return (
<Fragment>
<EuiForm component="form">
@ -119,12 +131,7 @@ export const Expression: React.FC<Props> = (props) => {
defaultMessage: 'Use a KQL expression to limit the scope of your alert trigger.',
})}
>
<KueryBar
value={ruleParams.filterQueryText}
derivedIndexPattern={derivedIndexPattern}
onSubmit={onFilterChange}
onChange={debouncedOnFilterChange}
/>
{kueryBar}
</EuiFormRow>
<EuiSpacer />
</EuiForm>

View file

@ -5,9 +5,8 @@
* 2.0.
*/
import { DataViewFieldBase } from '@kbn/es-query';
import { useEffect, useState } from 'react';
import { DataPublicPluginStart, IIndexPattern } from 'src/plugins/data/public';
import { DataViewsPublicPluginStart, DataView } from 'src/plugins/data_views/public';
import { prefixIndexPattern } from '../../../../common/ccs_utils';
import {
INDEX_PATTERN_BEATS,
@ -20,26 +19,21 @@ import { MonitoringConfig } from '../../../types';
const INDEX_PATTERNS = `${INDEX_PATTERN_ELASTICSEARCH},${INDEX_PATTERN_KIBANA},${INDEX_PATTERN_LOGSTASH},${INDEX_PATTERN_BEATS}`;
export const useDerivedIndexPattern = (
data: DataPublicPluginStart,
dataViews: DataViewsPublicPluginStart,
config?: MonitoringConfig
): { loading: boolean; derivedIndexPattern: IIndexPattern } => {
): { loading: boolean; derivedIndexPattern?: DataView } => {
const indexPattern = prefixIndexPattern(config || ({} as MonitoringConfig), INDEX_PATTERNS, '*');
const [loading, setLoading] = useState<boolean>(true);
const [fields, setFields] = useState<DataViewFieldBase[]>([]);
const [dataView, setDataView] = useState<DataView>();
useEffect(() => {
(async function fetchData() {
const result = await data.indexPatterns.getFieldsForWildcard({
pattern: indexPattern,
});
setFields(result);
const result = await dataViews.create({ title: indexPattern });
setDataView(result);
setLoading(false);
})();
}, [indexPattern, data.indexPatterns]);
}, [indexPattern, dataViews]);
return {
loading,
derivedIndexPattern: {
title: indexPattern,
fields,
},
derivedIndexPattern: dataView,
};
};

View file

@ -15,15 +15,16 @@ import { Props } from '../components/param_details_form/expression';
const FILTER_TYPING_DEBOUNCE_MS = 500;
export const Expression = ({ ruleParams, config, setRuleParams, data }: Props) => {
const { derivedIndexPattern } = useDerivedIndexPattern(data, config);
export const Expression = ({ ruleParams, config, setRuleParams, dataViews }: Props) => {
const { derivedIndexPattern } = useDerivedIndexPattern(dataViews, config);
const onFilterChange = useCallback(
(filter: string) => {
setRuleParams('filterQueryText', filter);
setRuleParams(
'filterQuery',
convertKueryToElasticSearchQuery(filter, derivedIndexPattern) || ''
);
if (derivedIndexPattern) setRuleParams('filterQueryText', filter);
if (derivedIndexPattern)
setRuleParams(
'filterQuery',
convertKueryToElasticSearchQuery(filter, derivedIndexPattern) || ''
);
},
[setRuleParams, derivedIndexPattern]
);
@ -32,6 +33,18 @@ export const Expression = ({ ruleParams, config, setRuleParams, data }: Props) =
const debouncedOnFilterChange = useCallback(debounce(onFilterChange, FILTER_TYPING_DEBOUNCE_MS), [
onFilterChange,
]);
const kueryBar = derivedIndexPattern ? (
<KueryBar
value={ruleParams.filterQueryText}
derivedIndexPattern={derivedIndexPattern}
onSubmit={onFilterChange}
onChange={debouncedOnFilterChange}
/>
) : (
<></>
);
return (
<EuiForm component="form">
<EuiFormRow
@ -43,12 +56,7 @@ export const Expression = ({ ruleParams, config, setRuleParams, data }: Props) =
defaultMessage: 'Use a KQL expression to limit the scope of your alert trigger.',
})}
>
<KueryBar
value={ruleParams.filterQueryText}
derivedIndexPattern={derivedIndexPattern}
onSubmit={onFilterChange}
onChange={debouncedOnFilterChange}
/>
{kueryBar}
</EuiFormRow>
<EuiSpacer />
</EuiForm>

View file

@ -8,7 +8,8 @@
import { fromKueryExpression } from '@kbn/es-query';
import { i18n } from '@kbn/i18n';
import React, { useEffect, useState } from 'react';
import { IIndexPattern, QuerySuggestion } from '../../../../../../src/plugins/data/public';
import type { DataView } from 'src/plugins/data_views/public';
import { QuerySuggestion } from '../../../../../../src/plugins/data/public';
import { AutocompleteField } from './autocomplete_field';
import { WithKueryAutocompletion } from './with_kuery_autocompletion';
@ -21,7 +22,7 @@ type LoadSuggestionsFn = (
export type CurryLoadSuggestionsType = (loadSuggestions: LoadSuggestionsFn) => LoadSuggestionsFn;
interface Props {
derivedIndexPattern: IIndexPattern;
derivedIndexPattern: DataView;
onSubmit: (query: string) => void;
onChange?: (query: string) => void;
value?: string | null;
@ -64,17 +65,12 @@ export const KueryBar = ({
}
};
const filteredDerivedIndexPattern = {
...derivedIndexPattern,
fields: derivedIndexPattern.fields,
};
const defaultPlaceholder = i18n.translate('xpack.monitoring.alerts.kqlSearchFieldPlaceholder', {
defaultMessage: 'Search for monitoring data',
});
return (
<WithKueryAutocompletion indexPattern={filteredDerivedIndexPattern}>
<WithKueryAutocompletion indexPattern={derivedIndexPattern}>
{({ isLoadingSuggestions, loadSuggestions, suggestions }) => (
<AutocompleteField
aria-label={placeholder}

View file

@ -6,7 +6,8 @@
*/
import React from 'react';
import { QuerySuggestion, IIndexPattern, DataPublicPluginStart } from 'src/plugins/data/public';
import { QuerySuggestion, DataPublicPluginStart } from 'src/plugins/data/public';
import { DataView } from 'src/plugins/data_views/public';
import {
withKibana,
KibanaReactContextValue,
@ -21,7 +22,7 @@ interface WithKueryAutocompletionLifecycleProps {
loadSuggestions: (expression: string, cursorPosition: number, maxSuggestions?: number) => void;
suggestions: QuerySuggestion[];
}>;
indexPattern: IIndexPattern;
indexPattern: DataView;
}
interface WithKueryAutocompletionLifecycleState {

View file

@ -6,11 +6,11 @@
*/
import { fromKueryExpression, toElasticsearchQuery } from '@kbn/es-query';
import { IIndexPattern } from '../../../../../src/plugins/data/public';
import { DataView } from '../../../../../src/plugins/data_views/public';
export const convertKueryToElasticSearchQuery = (
kueryExpression: string,
indexPattern: IIndexPattern
indexPattern: DataView
) => {
try {
return kueryExpression

View file

@ -109,6 +109,7 @@ export class MonitoringPlugin
triggersActionsUi: pluginsStart.triggersActionsUi,
usageCollection: plugins.usageCollection,
appMountParameters: params,
dataViews: pluginsStart.dataViews,
};
Legacy.init({
@ -122,6 +123,7 @@ export class MonitoringPlugin
triggersActionsUi: deps.triggersActionsUi,
usageCollection: deps.usageCollection,
appMountParameters: deps.appMountParameters,
dataViews: deps.dataViews,
});
const config = Object.fromEntries(externalConfig);

View file

@ -14,12 +14,14 @@ import { UsageCollectionSetup } from '../../../../src/plugins/usage_collection/p
export type { MonitoringConfig } from '../server';
// eslint-disable-next-line @kbn/eslint/no-restricted-paths
export type { MLJobs } from '../server/lib/elasticsearch/get_ml_jobs';
import { DataViewsPublicPluginStart } from '../../../../src/plugins/data_views/public';
export interface MonitoringStartPluginDependencies {
navigation: NavigationStart;
data: DataPublicPluginStart;
triggersActionsUi: TriggersAndActionsUIPublicPluginStart;
usageCollection: UsageCollectionSetup;
dataViews: DataViewsPublicPluginStart;
}
interface LegacyStartDependencies {

View file

@ -11,6 +11,7 @@ import { of } from 'rxjs';
import { mountWithIntl, nextTick } from '@kbn/test-jest-helpers';
import { act } from 'react-dom/test-utils';
import { dataPluginMock } from 'src/plugins/data/public/mocks';
import { dataViewPluginMocks } from 'src/plugins/data_views/public/mocks';
import { unifiedSearchPluginMock } from 'src/plugins/unified_search/public/mocks';
import { chartPluginMock } from 'src/plugins/charts/public/mocks';
import {
@ -99,6 +100,7 @@ const createDataPluginMock = () => {
};
const dataMock = createDataPluginMock();
const dataViewMock = dataViewPluginMocks.createStartContract();
const unifiedSearchMock = unifiedSearchPluginMock.createStartContract();
const chartsStartMock = chartPluginMock.createStartContract();
@ -150,6 +152,7 @@ describe('EsQueryAlertTypeExpression', () => {
setRuleProperty={() => {}}
errors={errors}
data={dataMock}
dataViews={dataViewMock}
defaultActionGroupId=""
actionGroups={[]}
charts={chartsStartMock}

View file

@ -8,6 +8,7 @@
import { mountWithIntl, nextTick } from '@kbn/test-jest-helpers';
import React from 'react';
import { dataPluginMock } from 'src/plugins/data/public/mocks';
import { dataViewPluginMocks } from 'src/plugins/data_views/public/mocks';
import { unifiedSearchPluginMock } from 'src/plugins/unified_search/public/mocks';
import { DataPublicPluginStart, ISearchStart } from 'src/plugins/data/public';
import { EsQueryAlertParams, SearchType } from '../types';
@ -21,6 +22,8 @@ const dataMock = dataPluginMock.createStartContract() as DataPublicPluginStart &
// eslint-disable-next-line @typescript-eslint/no-explicit-any
search: ISearchStart & { searchSource: { create: jest.MockedFunction<any> } };
};
const dataViewPluginMock = dataViewPluginMocks.createStartContract();
const chartsStartMock = chartPluginMock.createStartContract();
const unifiedSearchMock = unifiedSearchPluginMock.createStartContract();
@ -64,6 +67,7 @@ const setup = async (alertParams: EsQueryAlertParams<SearchType.searchSource>) =
errors={errors}
unifiedSearch={unifiedSearchMock}
data={dataMock}
dataViews={dataViewPluginMock}
defaultActionGroupId=""
actionGroups={[]}
charts={chartsStartMock}

View file

@ -10,6 +10,7 @@ import { mountWithIntl, nextTick } from '@kbn/test-jest-helpers';
import { act } from 'react-dom/test-utils';
import IndexThresholdAlertTypeExpression, { DEFAULT_VALUES } from './expression';
import { dataPluginMock } from 'src/plugins/data/public/mocks';
import { dataViewPluginMocks } from 'src/plugins/data_views/public/mocks';
import { chartPluginMock } from 'src/plugins/charts/public/mocks';
import { IndexThresholdAlertParams } from './types';
import { validateExpression } from './validation';
@ -68,6 +69,7 @@ jest.mock('../../../../triggers_actions_ui/public', () => {
});
const dataMock = dataPluginMock.createStartContract();
const dataViewMock = dataViewPluginMocks.createStartContract();
const chartsStartMock = chartPluginMock.createStartContract();
describe('IndexThresholdAlertTypeExpression', () => {
@ -95,6 +97,7 @@ describe('IndexThresholdAlertTypeExpression', () => {
setRuleProperty={() => {}}
errors={errors}
data={dataMock}
dataViews={dataViewMock}
defaultActionGroupId=""
actionGroups={[]}
charts={chartsStartMock}

View file

@ -8,7 +8,7 @@
"server": true,
"ui": true,
"optionalPlugins": ["alerting", "cloud", "features", "home", "spaces"],
"requiredPlugins": ["management", "charts", "data", "kibanaReact", "kibanaUtils", "savedObjects", "unifiedSearch"],
"requiredPlugins": ["management", "charts", "data", "kibanaReact", "kibanaUtils", "savedObjects", "unifiedSearch", "dataViews"],
"configPath": ["xpack", "trigger_actions_ui"],
"extraPublicDirs": ["public/common", "public/common/constants"],
"requiredBundles": ["home", "alerting", "esUiShared", "kibanaReact", "kibanaUtils"]

View file

@ -18,6 +18,7 @@ import { Section, routeToRuleDetails, legacyRouteToRuleDetails } from './constan
import { ActionTypeRegistryContract, RuleTypeRegistryContract } from '../types';
import { ChartsPluginStart } from '../../../../../src/plugins/charts/public';
import { DataPublicPluginStart } from '../../../../../src/plugins/data/public';
import { DataViewsPublicPluginStart } from '../../../../../src/plugins/data_views/public';
import { UnifiedSearchPublicPluginStart } from '../../../../../src/plugins/unified_search/public';
import { PluginStartContract as AlertingStart } from '../../../alerting/public';
import type { SpacesPluginStart } from '../../../spaces/public';
@ -36,6 +37,7 @@ const RuleDetailsRoute = lazy(
export interface TriggersAndActionsUiServices extends CoreStart {
data: DataPublicPluginStart;
dataViews: DataViewsPublicPluginStart;
charts: ChartsPluginStart;
alerting?: AlertingStart;
spaces?: SpacesPluginStart;

View file

@ -120,6 +120,7 @@ export const RuleForm = ({
charts,
data,
unifiedSearch,
dataViews,
} = useKibana().services;
const canShowActions = hasShowActionsCapability(capabilities);
@ -524,6 +525,7 @@ export const RuleForm = ({
metadata={metadata}
charts={charts}
data={data}
dataViews={dataViews}
unifiedSearch={unifiedSearch}
/>
</Suspense>

View file

@ -8,6 +8,7 @@
import React from 'react';
import { chartPluginMock } from '../../../../../../../src/plugins/charts/public/mocks';
import { dataPluginMock } from '../../../../../../../src/plugins/data/public/mocks';
import { dataViewPluginMocks } from '../../../../../../../src/plugins/data_views/public/mocks';
import { unifiedSearchPluginMock } from '../../../../../../../src/plugins/unified_search/public/mocks';
import {
coreMock,
@ -38,6 +39,7 @@ export const createStartServicesMock = (): TriggersAndActionsUiServices => {
history: scopedHistoryMock.create(),
setBreadcrumbs: jest.fn(),
data: dataPluginMock.createStartContract(),
dataViews: dataViewPluginMocks.createStartContract(),
unifiedSearch: unifiedSearchPluginMock.createStartContract(),
actionTypeRegistry: {
has: jest.fn(),

View file

@ -25,6 +25,7 @@ import {
import { ChartsPluginStart } from '../../../../src/plugins/charts/public';
import { PluginStartContract as AlertingStart } from '../../alerting/public';
import { DataPublicPluginStart } from '../../../../src/plugins/data/public';
import { DataViewsPublicPluginStart } from '../../../../src/plugins/data_views/public';
import { Storage } from '../../../../src/plugins/kibana_utils/public';
import type { SpacesPluginStart } from '../../spaces/public';
@ -82,6 +83,7 @@ interface PluginsSetup {
interface PluginsStart {
data: DataPublicPluginStart;
dataViews: DataViewsPublicPluginStart;
charts: ChartsPluginStart;
alerting?: AlertingStart;
spaces?: SpacesPluginStart;
@ -165,6 +167,7 @@ export class Plugin
return renderApp({
...coreStart,
data: pluginsStart.data,
dataViews: pluginsStart.dataViews,
charts: pluginsStart.charts,
alerting: pluginsStart.alerting,
spaces: pluginsStart.spaces,

View file

@ -10,6 +10,7 @@ import type { DocLinksStart } from 'kibana/public';
import type { ComponentType } from 'react';
import type { ChartsPluginSetup } from 'src/plugins/charts/public';
import type { DataPublicPluginStart } from 'src/plugins/data/public';
import type { DataViewsPublicPluginStart } from 'src/plugins/data_views/public';
import type { UnifiedSearchPublicPluginStart } from 'src/plugins/unified_search/public';
import type { IconType } from '@elastic/eui';
import { AlertConsumers } from '@kbn/rule-data-utils';
@ -282,6 +283,7 @@ export interface RuleTypeParamsExpressionProps<
metadata?: MetaData;
charts: ChartsPluginSetup;
data: DataPublicPluginStart;
dataViews: DataViewsPublicPluginStart;
unifiedSearch: UnifiedSearchPublicPluginStart;
}