Skip to content

Commit 3939809

Browse files
mengweiericsumukhswamyAdam Tackett
authored
[Feature] Auto trigger schema setup in assets creation flow of get started page (#2200)
* updated release notes (#1997) Signed-off-by: sumukhswamy <[email protected]> * updated release notes (#1997) Signed-off-by: sumukhswamy <[email protected]> * add template creation to assests creation flow Signed-off-by: Eric <[email protected]> * adopt recent UI changes for the same flow Signed-off-by: Eric <[email protected]> * fix lint issue Signed-off-by: Eric <[email protected]> * add types Signed-off-by: Eric <[email protected]> * update snapshots Signed-off-by: Eric <[email protected]> * fix default selection between metrics / traces Signed-off-by: Adam Tackett <[email protected]> * update snapshots Signed-off-by: Eric <[email protected]> --------- Signed-off-by: sumukhswamy <[email protected]> Signed-off-by: Eric <[email protected]> Signed-off-by: Adam Tackett <[email protected]> Co-authored-by: Sumukh Swamy <[email protected]> Co-authored-by: Adam Tackett <[email protected]>
1 parent f68eba1 commit 3939809

File tree

13 files changed

+250
-15
lines changed

13 files changed

+250
-15
lines changed

public/components/application_analytics/__tests__/__snapshots__/log_config.test.tsx.snap

+6
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,9 @@ exports[`Log Config component renders empty log config 1`] = `
2020
"getHelpExtension$": [MockFunction],
2121
"getIsNavDrawerLocked$": [MockFunction],
2222
"getIsVisible$": [MockFunction],
23+
"globalSearch": Object {
24+
"getAllSearchCommands": [MockFunction],
25+
},
2326
"logos": Object {
2427
"AnimatedMark": Object {
2528
"dark": Object {
@@ -687,6 +690,9 @@ exports[`Log Config component renders with query 1`] = `
687690
"getHelpExtension$": [MockFunction],
688691
"getIsNavDrawerLocked$": [MockFunction],
689692
"getIsVisible$": [MockFunction],
693+
"globalSearch": Object {
694+
"getAllSearchCommands": [MockFunction],
695+
},
690696
"logos": Object {
691697
"AnimatedMark": Object {
692698
"dark": Object {

public/components/application_analytics/__tests__/__snapshots__/service_config.test.tsx.snap

+6
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,9 @@ exports[`Service Config component renders empty service config 1`] = `
2020
"getHelpExtension$": [MockFunction],
2121
"getIsNavDrawerLocked$": [MockFunction],
2222
"getIsVisible$": [MockFunction],
23+
"globalSearch": Object {
24+
"getAllSearchCommands": [MockFunction],
25+
},
2326
"logos": Object {
2427
"AnimatedMark": Object {
2528
"dark": Object {
@@ -1230,6 +1233,9 @@ exports[`Service Config component renders with one service selected 1`] = `
12301233
"getHelpExtension$": [MockFunction],
12311234
"getIsNavDrawerLocked$": [MockFunction],
12321235
"getIsVisible$": [MockFunction],
1236+
"globalSearch": Object {
1237+
"getAllSearchCommands": [MockFunction],
1238+
},
12331239
"logos": Object {
12341240
"AnimatedMark": Object {
12351241
"dark": Object {

public/components/application_analytics/__tests__/__snapshots__/trace_config.test.tsx.snap

+6
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,9 @@ exports[`Trace Config component renders empty trace config 1`] = `
1919
"getHelpExtension$": [MockFunction],
2020
"getIsNavDrawerLocked$": [MockFunction],
2121
"getIsVisible$": [MockFunction],
22+
"globalSearch": Object {
23+
"getAllSearchCommands": [MockFunction],
24+
},
2225
"logos": Object {
2326
"AnimatedMark": Object {
2427
"dark": Object {
@@ -942,6 +945,9 @@ exports[`Trace Config component renders with one trace selected 1`] = `
942945
"getHelpExtension$": [MockFunction],
943946
"getIsNavDrawerLocked$": [MockFunction],
944947
"getIsVisible$": [MockFunction],
948+
"globalSearch": Object {
949+
"getAllSearchCommands": [MockFunction],
950+
},
945951
"logos": Object {
946952
"AnimatedMark": Object {
947953
"dark": Object {

public/components/custom_panels/__tests__/__snapshots__/custom_panel_view.test.tsx.snap

+12
Original file line numberDiff line numberDiff line change
@@ -1167,6 +1167,9 @@ exports[`Panels View Component renders panel view container with visualizations
11671167
],
11681168
},
11691169
"getIsVisible$": [MockFunction],
1170+
"globalSearch": Object {
1171+
"getAllSearchCommands": [MockFunction],
1172+
},
11701173
"logos": Object {
11711174
"AnimatedMark": Object {
11721175
"dark": Object {
@@ -3069,6 +3072,9 @@ exports[`Panels View Component renders panel view container with visualizations
30693072
],
30703073
},
30713074
"getIsVisible$": [MockFunction],
3075+
"globalSearch": Object {
3076+
"getAllSearchCommands": [MockFunction],
3077+
},
30723078
"logos": Object {
30733079
"AnimatedMark": Object {
30743080
"dark": Object {
@@ -3527,6 +3533,9 @@ exports[`Panels View Component renders panel view container without visualizatio
35273533
],
35283534
},
35293535
"getIsVisible$": [MockFunction],
3536+
"globalSearch": Object {
3537+
"getAllSearchCommands": [MockFunction],
3538+
},
35303539
"logos": Object {
35313540
"AnimatedMark": Object {
35323541
"dark": Object {
@@ -5313,6 +5322,9 @@ exports[`Panels View Component renders panel view container without visualizatio
53135322
],
53145323
},
53155324
"getIsVisible$": [MockFunction],
5325+
"globalSearch": Object {
5326+
"getAllSearchCommands": [MockFunction],
5327+
},
53165328
"logos": Object {
53175329
"AnimatedMark": Object {
53185330
"dark": Object {

public/components/custom_panels/panel_modules/panel_grid/__tests__/__snapshots__/panel_grid.test.tsx.snap

+3
Original file line numberDiff line numberDiff line change
@@ -177,6 +177,9 @@ exports[`Panel Grid Component renders panel grid component with empty visualizat
177177
],
178178
},
179179
"getIsVisible$": [MockFunction],
180+
"globalSearch": Object {
181+
"getAllSearchCommands": [MockFunction],
182+
},
180183
"logos": Object {
181184
"AnimatedMark": Object {
182185
"dark": Object {

public/components/getting_started/components/getting_started_collectData.tsx

+38-8
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import {
2121
EuiButton,
2222
EuiIcon,
2323
EuiCard,
24+
EuiSelectableOption,
2425
} from '@elastic/eui';
2526
import React, { useEffect, useState } from 'react';
2627

@@ -52,7 +53,7 @@ interface CollectAndShipDataProps {
5253
selectedDataSourceLabel: string;
5354
}
5455

55-
interface CollectorOption {
56+
export interface CollectorOption {
5657
label: string;
5758
value: string;
5859
}
@@ -70,6 +71,21 @@ export const CollectAndShipData: React.FC<CollectAndShipDataProps> = ({
7071
const [collectorOptions, setCollectorOptions] = useState<CollectorOption[]>([]);
7172
const [patternsContent, setPatternsContent] = useState<any[]>([]);
7273

74+
const getTelemetryOption = (collectionMethodOtel: string) => {
75+
switch (collectionMethodOtel) {
76+
case cardTwo:
77+
return { label: 'Open Telemetry', value: 'otelMetrics' };
78+
case cardThree:
79+
return { label: 'Open Telemetry', value: 'otelTraces' };
80+
default:
81+
return { label: 'Open Telemetry', value: 'otelLogs' };
82+
}
83+
};
84+
85+
const [selectedIntegration, setSelectedIntegration] = useState<
86+
Array<EuiSelectableOption<CollectorOption>>
87+
>([getTelemetryOption(cardOne)]);
88+
7389
const technologyJsonMap: Record<string, any> = {
7490
otelLogs: otelJsonLogs,
7591
otelMetrics: otelJsonMetrics,
@@ -122,13 +138,14 @@ export const CollectAndShipData: React.FC<CollectAndShipDataProps> = ({
122138
};
123139
}, [specificMethod]);
124140

125-
const handleSpecificMethodChange = (newOption: any) => {
141+
const handleSpecificMethodChange = (newOption: Array<EuiSelectableOption<CollectorOption>>) => {
126142
const selectedOptionValue = newOption[0]?.value;
127143

128144
if (selectedOptionValue === specificMethod) {
129145
return;
130146
}
131147

148+
setSelectedIntegration(newOption);
132149
setSpecificMethod(selectedOptionValue);
133150
setSelectedWorkflow('');
134151
setGettingStarted(null);
@@ -138,7 +155,8 @@ export const CollectAndShipData: React.FC<CollectAndShipDataProps> = ({
138155
// Auto-select first collector if nothing is selected and a collection method is set
139156
useEffect(() => {
140157
if (collectorOptions.length > 0 && !specificMethod && collectionMethod) {
141-
handleSpecificMethodChange([{ value: collectorOptions[0].value }]);
158+
const telemetryOption = getTelemetryOption(collectionMethod);
159+
handleSpecificMethodChange([{ ...telemetryOption }]);
142160
}
143161
}, [collectorOptions, specificMethod, collectionMethod]);
144162

@@ -151,17 +169,19 @@ export const CollectAndShipData: React.FC<CollectAndShipDataProps> = ({
151169

152170
if (value === cardOne) {
153171
setCollectorOptions([
154-
{ label: 'Open Telemetry', value: 'otelLogs' },
172+
getTelemetryOption(cardOne),
155173
{ label: 'Nginx', value: 'nginx' },
156174
{ label: 'Java', value: 'java' },
157175
{ label: 'Python', value: 'python' },
158176
{ label: 'Golang', value: 'golang' },
159177
]);
160178
} else if (value === cardTwo) {
161-
setCollectorOptions([{ label: 'Open Telemetry', value: 'otelMetrics' }]);
179+
setCollectorOptions([getTelemetryOption(cardTwo)]);
162180
} else if (value === cardThree) {
163-
setCollectorOptions([{ label: 'Open Telemetry', value: 'otelTraces' }]);
181+
setCollectorOptions([getTelemetryOption(cardThree)]);
164182
}
183+
184+
setSelectedIntegration([getTelemetryOption(value)]);
165185
};
166186

167187
const renderSpecificMethodDropdown = () => {
@@ -200,7 +220,9 @@ export const CollectAndShipData: React.FC<CollectAndShipDataProps> = ({
200220
singleSelection={{ asPlainText: true }}
201221
options={optionsWithIcons}
202222
selectedOptions={selectedOption ? [selectedOption] : []}
203-
onChange={(newOptions) => handleSpecificMethodChange(newOptions)}
223+
onChange={(newOptions) =>
224+
handleSpecificMethodChange(newOptions as Array<EuiSelectableOption<CollectorOption>>)
225+
}
204226
renderOption={(option) => (
205227
<div style={{ display: 'flex', alignItems: 'center' }}>
206228
{option.prepend}
@@ -347,7 +369,15 @@ export const CollectAndShipData: React.FC<CollectAndShipDataProps> = ({
347369
</EuiListGroup>
348370
<EuiButton
349371
onClick={async () => {
350-
await UploadAssets(specificMethod, selectedDataSourceId, selectedDataSourceLabel);
372+
await UploadAssets(
373+
specificMethod,
374+
selectedDataSourceId,
375+
selectedDataSourceLabel,
376+
technologyJsonMap[specificMethod]?.['getting-started']?.schema ||
377+
technologyJsonMap[specificMethod]?.schema ||
378+
[],
379+
selectedIntegration
380+
);
351381
}}
352382
fill
353383
>

public/components/getting_started/components/utils.tsx

+55-1
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,27 @@
33
* SPDX-License-Identifier: Apache-2.0
44
*/
55

6+
import { MappingTypeMapping } from '@opensearch-project/opensearch/api/types';
7+
import { EuiSelectableOption } from '@elastic/eui';
68
import { coreRefs } from '../../../framework/core_refs';
79
import { useToast } from '../../../../public/components/common/toast';
10+
import { CollectorOption } from './getting_started_collectData';
11+
12+
export interface ICollectorIndexTemplate {
13+
name: string;
14+
templatePath: string;
15+
template: MappingTypeMapping;
16+
}
17+
18+
export interface ICollectorSchema {
19+
alias: string;
20+
content: string;
21+
description: string;
22+
'index-pattern-name': string;
23+
type: string;
24+
'index-template': string;
25+
info: string[];
26+
}
827

928
const fetchAssets = async (tutorialId: string, assetFilter?: 'dashboards' | 'indexPatterns') => {
1029
const assetFilterParam = assetFilter ? `${assetFilter}/` : '';
@@ -20,16 +39,51 @@ const fetchAssets = async (tutorialId: string, assetFilter?: 'dashboards' | 'ind
2039
return responeData;
2140
};
2241

23-
export const UploadAssets = async (tutorialId: string, mdsId: string, mdsLabel: string) => {
42+
export const UploadAssets = async (
43+
tutorialId: string,
44+
mdsId: string,
45+
mdsLabel: string,
46+
schema: ICollectorSchema[],
47+
selectedIntegration: Array<EuiSelectableOption<CollectorOption>>
48+
) => {
2449
const { setToast } = useToast();
2550
const http = coreRefs.http;
2651

52+
let curIntegration: string | undefined;
53+
if (selectedIntegration !== undefined) {
54+
if (/^otel[A-Za-z]+$/i.test(selectedIntegration[0].value)) {
55+
curIntegration = 'otel-services';
56+
} else if (selectedIntegration[0].value === 'nginx') {
57+
curIntegration = selectedIntegration[0].value;
58+
}
59+
}
60+
2761
try {
62+
// Auto-generate index templates based on the selected integration
63+
let templates: ICollectorIndexTemplate[] = [];
64+
if (curIntegration !== undefined) {
65+
const indexTemplateMappings = await http!.get(
66+
`/api/integrations/repository/${curIntegration}/schema`
67+
);
68+
templates = schema.reduce((acc: ICollectorIndexTemplate[], sh) => {
69+
const templateMapping = indexTemplateMappings?.data?.mappings?.[sh.type.toLowerCase()];
70+
if (!!templateMapping) {
71+
acc.push({
72+
name: sh.content.match(/[^/]+$/)?.[0] || '',
73+
templatePath: sh.content.match(/PUT\s+(.+)/)?.[1] || '',
74+
template: templateMapping,
75+
});
76+
}
77+
return acc;
78+
}, []);
79+
}
80+
2881
const response = await http!.post(`/api/observability/gettingStarted/createAssets`, {
2982
body: JSON.stringify({
3083
mdsId,
3184
mdsLabel,
3285
tutorialId,
86+
indexTemplates: templates,
3387
}),
3488
});
3589

public/components/metrics/view/__tests__/__snapshots__/metrics_grid.test.tsx.snap

+6
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,9 @@ exports[`Metrics Grid Component renders Metrics Grid Component 1`] = `
3030
"getHelpExtension$": [MockFunction],
3131
"getIsNavDrawerLocked$": [MockFunction],
3232
"getIsVisible$": [MockFunction],
33+
"globalSearch": Object {
34+
"getAllSearchCommands": [MockFunction],
35+
},
3336
"logos": Object {
3437
"AnimatedMark": Object {
3538
"dark": Object {
@@ -204,6 +207,9 @@ exports[`Metrics Grid Component renders Metrics Grid Component 1`] = `
204207
"getHelpExtension$": [MockFunction],
205208
"getIsNavDrawerLocked$": [MockFunction],
206209
"getIsVisible$": [MockFunction],
210+
"globalSearch": Object {
211+
"getAllSearchCommands": [MockFunction],
212+
},
207213
"logos": Object {
208214
"AnimatedMark": Object {
209215
"dark": Object {

public/components/trace_analytics/components/dashboard/__tests__/__snapshots__/dashboard.test.tsx.snap

+18
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,9 @@ exports[`Dashboard component renders dashboard 1`] = `
3333
"getHelpExtension$": [MockFunction],
3434
"getIsNavDrawerLocked$": [MockFunction],
3535
"getIsVisible$": [MockFunction],
36+
"globalSearch": Object {
37+
"getAllSearchCommands": [MockFunction],
38+
},
3639
"logos": Object {
3740
"AnimatedMark": Object {
3841
"dark": Object {
@@ -423,6 +426,9 @@ exports[`Dashboard component renders dashboard 1`] = `
423426
"getHelpExtension$": [MockFunction],
424427
"getIsNavDrawerLocked$": [MockFunction],
425428
"getIsVisible$": [MockFunction],
429+
"globalSearch": Object {
430+
"getAllSearchCommands": [MockFunction],
431+
},
426432
"logos": Object {
427433
"AnimatedMark": Object {
428434
"dark": Object {
@@ -1285,6 +1291,9 @@ exports[`Dashboard component renders empty dashboard 1`] = `
12851291
"getHelpExtension$": [MockFunction],
12861292
"getIsNavDrawerLocked$": [MockFunction],
12871293
"getIsVisible$": [MockFunction],
1294+
"globalSearch": Object {
1295+
"getAllSearchCommands": [MockFunction],
1296+
},
12881297
"logos": Object {
12891298
"AnimatedMark": Object {
12901299
"dark": Object {
@@ -1674,6 +1683,9 @@ exports[`Dashboard component renders empty dashboard 1`] = `
16741683
"getHelpExtension$": [MockFunction],
16751684
"getIsNavDrawerLocked$": [MockFunction],
16761685
"getIsVisible$": [MockFunction],
1686+
"globalSearch": Object {
1687+
"getAllSearchCommands": [MockFunction],
1688+
},
16771689
"logos": Object {
16781690
"AnimatedMark": Object {
16791691
"dark": Object {
@@ -2536,6 +2548,9 @@ exports[`Dashboard component renders empty jaeger dashboard 1`] = `
25362548
"getHelpExtension$": [MockFunction],
25372549
"getIsNavDrawerLocked$": [MockFunction],
25382550
"getIsVisible$": [MockFunction],
2551+
"globalSearch": Object {
2552+
"getAllSearchCommands": [MockFunction],
2553+
},
25392554
"logos": Object {
25402555
"AnimatedMark": Object {
25412556
"dark": Object {
@@ -2927,6 +2942,9 @@ exports[`Dashboard component renders empty jaeger dashboard 1`] = `
29272942
"getHelpExtension$": [MockFunction],
29282943
"getIsNavDrawerLocked$": [MockFunction],
29292944
"getIsVisible$": [MockFunction],
2945+
"globalSearch": Object {
2946+
"getAllSearchCommands": [MockFunction],
2947+
},
29302948
"logos": Object {
29312949
"AnimatedMark": Object {
29322950
"dark": Object {

0 commit comments

Comments
 (0)