Skip to content

Commit 6aa37a2

Browse files
authored
[Automatic Import V2] Edit pipeline for data stream (#252399)
This PR allows: - Allows to view the results of the AI pipeline after processing. - A table view displaying a inMemoryTable for viewing and filtering. - A code editor view for looking at the pipeline processors. - Document pagination for viewing the results for different documents. - Tests for the component. - Some translation additions to this component and other tables.
1 parent 0fa4322 commit 6aa37a2

20 files changed

Lines changed: 1321 additions & 55 deletions

File tree

packages/kbn-optimizer/limits.yml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ pageLoadAssetSize:
99
apm: 38573
1010
apmSourcesAccess: 2278
1111
automaticImport: 12162
12-
automaticImportVTwo: 12306
12+
automaticImportVTwo: 13752
1313
banners: 4087
1414
canvas: 15142
1515
cases: 225900
@@ -50,7 +50,7 @@ pageLoadAssetSize:
5050
discoverShared: 2322
5151
elasticAssistant: 338870
5252
elasticAssistantSharedState: 4881
53-
embeddable: 17521
53+
embeddable: 17466
5454
embeddableAlertsTable: 6524
5555
embeddableEnhanced: 4488
5656
enterpriseSearch: 40244
@@ -83,7 +83,7 @@ pageLoadAssetSize:
8383
globalSearchProviders: 4646
8484
graph: 9924
8585
grokdebugger: 5484
86-
home: 13560
86+
home: 13091
8787
imageEmbeddable: 6727
8888
indexLifecycleManagement: 29818
8989
indexManagement: 35522

x-pack/platform/plugins/shared/automatic_import_v2/moon.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ dependsOn:
5656
- '@kbn/kibana-utils-plugin'
5757
- '@kbn/ingest-pipelines-plugin'
5858
- '@kbn/utility-types'
59+
- '@kbn/code-editor'
5960
tags:
6061
- plugin
6162
- prod
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
/*
2+
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
3+
* or more contributor license agreements. Licensed under the Elastic License
4+
* 2.0; you may not use this file except in compliance with the Elastic License
5+
* 2.0.
6+
*/
7+
8+
import { useQuery } from '@kbn/react-query';
9+
import type { GetDataStreamResultsResponse } from '../lib/api';
10+
import { getDataStreamResults } from '../lib/api';
11+
import { useKibana } from './use_kibana';
12+
13+
export interface UseGetDataStreamResultsResult {
14+
data: GetDataStreamResultsResponse | undefined;
15+
isLoading: boolean;
16+
isError: boolean;
17+
error: Error | null;
18+
refetch: () => void;
19+
}
20+
21+
/**
22+
* Hook to fetch data stream results (ingest pipeline and processed documents) from the automatic_import_v2 backend.
23+
*/
24+
export function useGetDataStreamResults(
25+
integrationId: string | undefined,
26+
dataStreamId: string | undefined
27+
): UseGetDataStreamResultsResult {
28+
const { http } = useKibana().services;
29+
30+
const { data, isLoading, isError, error, refetch } = useQuery({
31+
queryKey: ['dataStreamResults', integrationId, dataStreamId],
32+
queryFn: async () => {
33+
if (!integrationId || !dataStreamId) {
34+
return undefined;
35+
}
36+
return getDataStreamResults({ http, integrationId, dataStreamId });
37+
},
38+
enabled: !!integrationId && !!dataStreamId,
39+
});
40+
41+
return {
42+
data,
43+
isLoading,
44+
isError,
45+
error: error as Error | null,
46+
refetch,
47+
};
48+
}

x-pack/platform/plugins/shared/automatic_import_v2/public/common/index.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ export { useLoadConnectors } from './hooks/use_load_connectors';
1313
export { useValidateIndex } from './hooks/use_validate_index';
1414
export { useUploadSamples } from './hooks/use_upload_samples';
1515
export { useDeleteDataStream } from './hooks/use_delete_data_stream';
16+
export { useGetDataStreamResults } from './hooks/use_get_data_stream_results';
1617

1718
export {
1819
INDEX_VALIDATION_FAILED,
@@ -32,7 +33,11 @@ export {
3233
getIntegrationById,
3334
} from './lib/api';
3435

35-
export type { CreateUpdateIntegrationRequest, UploadSamplesRequest } from './lib/api';
36+
export type {
37+
CreateUpdateIntegrationRequest,
38+
UploadSamplesRequest,
39+
GetDataStreamResultsResponse,
40+
} from './lib/api';
3641

3742
export { getLangSmithOptions } from './lib/lang_smith';
3843
export type { LangSmithOptions } from './lib/lang_smith';

x-pack/platform/plugins/shared/automatic_import_v2/public/common/lib/api.ts

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,3 +127,29 @@ export const deleteDataStream = async ({
127127
version: '1',
128128
}
129129
);
130+
131+
export interface GetDataStreamResultsRequest {
132+
integrationId: string;
133+
dataStreamId: string;
134+
}
135+
136+
export interface GetDataStreamResultsResponse {
137+
ingest_pipeline: Record<string, unknown>;
138+
results: Array<Record<string, unknown>>;
139+
}
140+
141+
export const getDataStreamResults = async ({
142+
http,
143+
abortSignal,
144+
integrationId,
145+
dataStreamId,
146+
}: RequestDeps & GetDataStreamResultsRequest): Promise<GetDataStreamResultsResponse> =>
147+
http.get<GetDataStreamResultsResponse>(
148+
`${AUTOMATIC_IMPORT_INTEGRATIONS_PATH}/${encodeURIComponent(
149+
integrationId
150+
)}/data_streams/${encodeURIComponent(dataStreamId)}/results`,
151+
{
152+
version: '1',
153+
signal: abortSignal,
154+
}
155+
);

x-pack/platform/plugins/shared/automatic_import_v2/public/components/integration_management/contexts/types.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,21 @@
55
* 2.0.
66
*/
77

8+
import type { DataStreamResponse } from '../../../../common';
9+
810
export interface UIState {
911
isCreateDataStreamFlyoutOpen: boolean;
12+
isEditPipelineFlyoutOpen: boolean;
13+
selectedDataStream: DataStreamResponse | null;
1014
}
1115

1216
export interface UIStateActions {
1317
openCreateDataStreamFlyout: () => void;
1418
closeCreateDataStreamFlyout: () => void;
19+
openEditPipelineFlyout: (dataStream: DataStreamResponse) => void;
20+
closeEditPipelineFlyout: () => void;
21+
selectPipelineTab: (tab: 'table' | 'pipeline') => void;
22+
selectedPipelineTab: 'table' | 'pipeline';
1523
}
1624

1725
export type UIStateContextValue = UIState & UIStateActions;

x-pack/platform/plugins/shared/automatic_import_v2/public/components/integration_management/contexts/ui_state_context.test.tsx

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,12 @@ describe('UIStateContext', () => {
3434
isCreateDataStreamFlyoutOpen: false,
3535
openCreateDataStreamFlyout: expect.any(Function),
3636
closeCreateDataStreamFlyout: expect.any(Function),
37+
isEditPipelineFlyoutOpen: false,
38+
selectedDataStream: null,
39+
openEditPipelineFlyout: expect.any(Function),
40+
closeEditPipelineFlyout: expect.any(Function),
41+
selectedPipelineTab: 'table',
42+
selectPipelineTab: expect.any(Function),
3743
});
3844
});
3945
});

x-pack/platform/plugins/shared/automatic_import_v2/public/components/integration_management/contexts/ui_state_context.tsx

Lines changed: 34 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77

88
import React, { createContext, useContext, useState, useCallback, useMemo } from 'react';
99

10+
import type { DataStreamResponse } from '../../../../common';
1011
import type { UIStateContextValue } from './types';
1112

1213
const UIStateContext = createContext<UIStateContextValue | undefined>(undefined);
@@ -17,6 +18,8 @@ export interface UIStateProviderProps {
1718

1819
export const UIStateProvider: React.FC<UIStateProviderProps> = ({ children }) => {
1920
const [isCreateDataStreamFlyoutOpen, setIsCreateDataStreamFlyoutOpen] = useState(false);
21+
const [selectedDataStream, setSelectedDataStream] = useState<DataStreamResponse | null>(null);
22+
const [selectedPipelineTab, setSelectedPipelineTab] = useState<'table' | 'pipeline'>('table');
2023

2124
const openCreateDataStreamFlyout = useCallback(() => {
2225
setIsCreateDataStreamFlyoutOpen(true);
@@ -26,13 +29,43 @@ export const UIStateProvider: React.FC<UIStateProviderProps> = ({ children }) =>
2629
setIsCreateDataStreamFlyoutOpen(false);
2730
}, []);
2831

32+
const openEditPipelineFlyout = useCallback((dataStream: DataStreamResponse) => {
33+
setSelectedDataStream(dataStream);
34+
}, []);
35+
36+
const closeEditPipelineFlyout = useCallback(() => {
37+
setSelectedDataStream(null);
38+
}, []);
39+
40+
const selectPipelineTab = useCallback((tab: 'table' | 'pipeline') => {
41+
setSelectedPipelineTab(tab);
42+
}, []);
43+
44+
const isEditPipelineFlyoutOpen = selectedDataStream !== null;
45+
2946
const value = useMemo<UIStateContextValue>(
3047
() => ({
3148
isCreateDataStreamFlyoutOpen,
3249
openCreateDataStreamFlyout,
3350
closeCreateDataStreamFlyout,
51+
isEditPipelineFlyoutOpen,
52+
selectedDataStream,
53+
openEditPipelineFlyout,
54+
closeEditPipelineFlyout,
55+
selectedPipelineTab,
56+
selectPipelineTab,
3457
}),
35-
[isCreateDataStreamFlyoutOpen, closeCreateDataStreamFlyout, openCreateDataStreamFlyout]
58+
[
59+
isCreateDataStreamFlyoutOpen,
60+
closeCreateDataStreamFlyout,
61+
openCreateDataStreamFlyout,
62+
isEditPipelineFlyoutOpen,
63+
selectedDataStream,
64+
openEditPipelineFlyout,
65+
closeEditPipelineFlyout,
66+
selectedPipelineTab,
67+
selectPipelineTab,
68+
]
3669
);
3770

3871
return <UIStateContext.Provider value={value}>{children}</UIStateContext.Provider>;

x-pack/platform/plugins/shared/automatic_import_v2/public/components/integration_management/management_contents/data_streams/create_data_stream_flyout.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -242,7 +242,7 @@ export const CreateDataStreamFlyout: React.FC<CreateDataStreamFlyoutProps> = ({
242242
if (!formData) return;
243243

244244
const integrationId = currentIntegrationId ?? generateId();
245-
const dataStreamId = integrationId + '-' + generateId();
245+
const dataStreamId = generateId();
246246
const inputTypes: InputType[] = (formData.dataCollectionMethod ?? []).map((method) => ({
247247
name: method as InputType['name'],
248248
}));
@@ -416,7 +416,7 @@ export const CreateDataStreamFlyout: React.FC<CreateDataStreamFlyoutProps> = ({
416416
initialPromptText={i18n.FILE_PICKER_PROMPT}
417417
onChange={onChangeLogFile}
418418
display="large"
419-
aria-label="Upload log file"
419+
aria-label={i18n.ARIA_LABELS.uploadLogFile}
420420
isLoading={isParsing}
421421
isInvalid={fileError != null}
422422
disabled={logsSourceOption !== 'upload'}
@@ -442,7 +442,7 @@ export const CreateDataStreamFlyout: React.FC<CreateDataStreamFlyoutProps> = ({
442442
fullWidth
443443
isInvalid={!!indexValidationError}
444444
error={indexValidationError}
445-
aria-label="Select an index"
445+
aria-label={i18n.ARIA_LABELS.selectIndex}
446446
>
447447
<EuiComboBox
448448
key={field.value ?? ''}

x-pack/platform/plugins/shared/automatic_import_v2/public/components/integration_management/management_contents/data_streams/data_streams.tsx

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,17 @@ import { CreateDataStreamFlyout } from './create_data_stream_flyout';
1919
import * as i18n from './translations';
2020
import { useGetIntegrationById } from '../../../../common';
2121
import { DataStreamsTable } from './data_streams_table/data_steams_table';
22+
import { EditPipelineFlyout } from './edit_pipeline_flyout';
2223

2324
export const DataStreams = React.memo<{ integrationId?: string }>(() => {
24-
const { isCreateDataStreamFlyoutOpen, openCreateDataStreamFlyout, closeCreateDataStreamFlyout } =
25-
useUIState();
25+
const {
26+
isCreateDataStreamFlyoutOpen,
27+
openCreateDataStreamFlyout,
28+
closeCreateDataStreamFlyout,
29+
isEditPipelineFlyoutOpen,
30+
selectedDataStream,
31+
closeEditPipelineFlyout,
32+
} = useUIState();
2633
const { integrationId } = useParams<{ integrationId?: string }>();
2734
const { integration } = useGetIntegrationById(integrationId);
2835

@@ -84,6 +91,14 @@ export const DataStreams = React.memo<{ integrationId?: string }>(() => {
8491
{isCreateDataStreamFlyoutOpen && (
8592
<CreateDataStreamFlyout onClose={closeCreateDataStreamFlyout} />
8693
)}
94+
95+
{isEditPipelineFlyoutOpen && selectedDataStream && integrationId && (
96+
<EditPipelineFlyout
97+
integrationId={integrationId}
98+
dataStream={selectedDataStream}
99+
onClose={closeEditPipelineFlyout}
100+
/>
101+
)}
87102
</>
88103
);
89104
});

0 commit comments

Comments
 (0)