Skip to content

Commit fe34d7f

Browse files
[Fleet] Update experimental indexing features text + allow disabling TSDB (#149594)
## Summary Closes #149591 Making some needed improvements/changes to our experimental data stream features: - Improve copy to better explain what these features are and what they do - Add explainer + link to https://www.elastic.co/guide/en/elasticsearch/reference/master/use-a-data-stream.html#manually-roll-over-a-data-stream for current need around manual rollovers (#143448 coming soon for automating this) ![image](https://user-images.githubusercontent.com/6766512/214857301-bb522d2a-f241-4c34-8bf5-bd96e610a139.png) ## Screen recording https://user-images.githubusercontent.com/6766512/214861783-0efdbab9-51de-44f0-93ba-86011d6e9612.mov --------- Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com>
1 parent a489d22 commit fe34d7f

File tree

5 files changed

+124
-41
lines changed

5 files changed

+124
-41
lines changed

packages/kbn-doc-links/src/get_doc_links.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -661,6 +661,7 @@ export const getDocLinks = ({ kibanaBranch }: GetDocLinkOptions): DocLinks => {
661661
datastreams: `${FLEET_DOCS}data-streams.html`,
662662
datastreamsILM: `${FLEET_DOCS}data-streams.html#data-streams-ilm`,
663663
datastreamsNamingScheme: `${FLEET_DOCS}data-streams.html#data-streams-naming-scheme`,
664+
datastreamsManualRollover: `${ELASTICSEARCH_DOCS}use-a-data-stream.html#manually-roll-over-a-data-stream`,
664665
installElasticAgent: `${FLEET_DOCS}install-fleet-managed-elastic-agent.html`,
665666
installElasticAgentStandalone: `${FLEET_DOCS}install-standalone-elastic-agent.html`,
666667
upgradeElasticAgent: `${FLEET_DOCS}upgrade-elastic-agent.html`,

packages/kbn-doc-links/src/types.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -433,6 +433,7 @@ export interface DocLinks {
433433
datastreams: string;
434434
datastreamsILM: string;
435435
datastreamsNamingScheme: string;
436+
datastreamsManualRollover: string;
436437
installElasticAgent: string;
437438
installElasticAgentStandalone: string;
438439
packageSignatures: string;

x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/create_package_policy_page/components/steps/components/experimental_datastream_settings.test.tsx

Lines changed: 78 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -178,14 +178,91 @@ describe('ExperimentDatastreamSettings', () => {
178178
},
179179
},
180180
]);
181-
expect(experimentalDataFeatures).toEqual([
181+
});
182+
});
183+
describe('TSDB', () => {
184+
it('should be enabled and unchecked by default', () => {
185+
const mockSetNewExperimentalDataFeatures = jest.fn();
186+
const res = createFleetTestRendererMock().render(
187+
<ExperimentDatastreamSettings
188+
registryDataStream={{ type: 'logs', dataset: 'test' } as unknown as RegistryDataStream}
189+
experimentalDataFeatures={[]}
190+
setNewExperimentalDataFeatures={mockSetNewExperimentalDataFeatures}
191+
/>
192+
);
193+
194+
const tsdbSwitch = res.getByTestId('packagePolicyEditor.tsdbExperimentalFeature.switch');
195+
196+
expect(tsdbSwitch).toBeEnabled();
197+
expect(tsdbSwitch).not.toBeChecked();
198+
expect(mockSetNewExperimentalDataFeatures).not.toBeCalled();
199+
});
200+
201+
it('should be enabled and checked if registry data streams includes "elasticsearch.index_mode: time_series"', () => {
202+
const mockSetNewExperimentalDataFeatures = jest.fn();
203+
const res = createFleetTestRendererMock().render(
204+
<ExperimentDatastreamSettings
205+
registryDataStream={
206+
{
207+
type: 'logs',
208+
dataset: 'test',
209+
elasticsearch: {
210+
index_mode: 'time_series',
211+
},
212+
} as unknown as RegistryDataStream
213+
}
214+
experimentalDataFeatures={[]}
215+
setNewExperimentalDataFeatures={mockSetNewExperimentalDataFeatures}
216+
/>
217+
);
218+
219+
const tsdbSwitch = res.getByTestId('packagePolicyEditor.tsdbExperimentalFeature.switch');
220+
221+
expect(tsdbSwitch).toBeEnabled();
222+
expect(tsdbSwitch).toBeChecked();
223+
expect(mockSetNewExperimentalDataFeatures).not.toBeCalled();
224+
});
225+
226+
it('should not mutate other experimental features when changed', () => {
227+
const experimentalDataFeatures = [
182228
{
183229
data_stream: 'logs-test',
184230
features: {
231+
doc_value_only_numeric: false,
232+
doc_value_only_other: false,
185233
synthetic_source: true,
186234
tsdb: false,
235+
},
236+
},
237+
];
238+
239+
const mockSetNewExperimentalDataFeatures = jest.fn();
240+
const res = createFleetTestRendererMock().render(
241+
<ExperimentDatastreamSettings
242+
registryDataStream={
243+
{
244+
type: 'logs',
245+
dataset: 'test',
246+
} as unknown as RegistryDataStream
247+
}
248+
experimentalDataFeatures={experimentalDataFeatures}
249+
setNewExperimentalDataFeatures={mockSetNewExperimentalDataFeatures}
250+
/>
251+
);
252+
253+
act(() => {
254+
fireEvent.click(res.getByTestId('packagePolicyEditor.tsdbExperimentalFeature.switch'));
255+
});
256+
257+
expect(mockSetNewExperimentalDataFeatures).toBeCalled();
258+
expect(mockSetNewExperimentalDataFeatures.mock.calls[0][0]).toEqual([
259+
{
260+
data_stream: 'logs-test',
261+
features: {
187262
doc_value_only_numeric: false,
188263
doc_value_only_other: false,
264+
synthetic_source: true,
265+
tsdb: true,
189266
},
190267
},
191268
]);

x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/create_package_policy_page/components/steps/components/experimental_datastream_settings.tsx

Lines changed: 41 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,11 @@ import {
1515
EuiText,
1616
EuiSpacer,
1717
EuiTitle,
18-
EuiToolTip,
18+
EuiLink,
1919
} from '@elastic/eui';
20+
import { i18n } from '@kbn/i18n';
21+
22+
import { useStartServices } from '../../../../../../../../hooks';
2023

2124
import type {
2225
ExperimentalDataStreamFeature,
@@ -50,6 +53,8 @@ export const ExperimentDatastreamSettings: React.FunctionComponent<Props> = ({
5053
experimentalDataFeatures,
5154
setNewExperimentalDataFeatures,
5255
}) => {
56+
const { docLinks } = useStartServices();
57+
5358
const isSyntheticSourceEditable = registryDataStream.elasticsearch?.source_mode !== 'default';
5459

5560
const syntheticSourceExperimentalValue = getExperimentalFeatureValue(
@@ -129,27 +134,35 @@ export const ExperimentDatastreamSettings: React.FunctionComponent<Props> = ({
129134
<h5>
130135
<FormattedMessage
131136
id="xpack.fleet.packagePolicyEditor.experimentalSettings.title"
132-
defaultMessage="Indexing settings (experimental)"
137+
defaultMessage="Indexing settings (technical preview)"
133138
/>
134139
</h5>
135140
</EuiTitle>
136141
</EuiFlexItem>
137142
<EuiFlexItem>
138143
<EuiText color="subdued" size="xs">
139-
<FormattedMessage
140-
id="xpack.fleet.packagePolicyEditor.stepConfigure.experimentalFeaturesDescription"
141-
defaultMessage="Select data streams to configure indexing options. This is an {experimentalFeature} and may have effects on other properties."
142-
values={{
143-
experimentalFeature: (
144-
<strong>
145-
<FormattedMessage
146-
id="xpack.fleet.packagePolicyEditor.experimentalFeatureText"
147-
defaultMessage="experimental feature"
148-
/>
149-
</strong>
150-
),
151-
}}
152-
/>
144+
<p>
145+
<FormattedMessage
146+
id="xpack.fleet.packagePolicyEditor.stepConfigure.experimentalFeaturesDescription"
147+
defaultMessage="Choose how you want to store backing indices for this data stream. Changing these settings may affect other properties."
148+
/>
149+
</p>
150+
<p>
151+
<FormattedMessage
152+
id="xpack.fleet.packagePolicyEditor.stepConfigure.experimentalFeaturesRolloverWarning"
153+
defaultMessage="After changing these settings, you need to manually roll over the existing data stream for changes to take effect. {learnMoreLink}"
154+
values={{
155+
learnMoreLink: (
156+
<EuiLink href={docLinks.links.fleet.datastreamsManualRollover} target="_blank">
157+
{i18n.translate(
158+
'xpack.fleet.packagePolicyEditor.experimentalFeatureRolloverLearnMore',
159+
{ defaultMessage: 'Learn more' }
160+
)}
161+
</EuiLink>
162+
),
163+
}}
164+
/>
165+
</p>
153166
</EuiText>
154167
</EuiFlexItem>
155168
<EuiSpacer size="s" />
@@ -172,31 +185,21 @@ export const ExperimentDatastreamSettings: React.FunctionComponent<Props> = ({
172185
/>
173186
</EuiFlexItem>
174187
<EuiFlexItem>
175-
<EuiToolTip
176-
content={
188+
<EuiSwitch
189+
checked={newExperimentalIndexingFeature.tsdb ?? false}
190+
data-test-subj="packagePolicyEditor.tsdbExperimentalFeature.switch"
191+
label={
177192
<FormattedMessage
178-
id="xpack.fleet.packagePolicyEditor.experimentalFeatures.TSDBTooltip"
179-
defaultMessage="Enabling this feature is irreversible"
193+
id="xpack.fleet.packagePolicyEditor.experimentalFeatures.TSDBLabel"
194+
defaultMessage="Time-series indexing (TSDB)"
180195
/>
181196
}
182-
>
183-
<EuiSwitch
184-
disabled={newExperimentalIndexingFeature.tsdb ?? false}
185-
checked={newExperimentalIndexingFeature.tsdb ?? false}
186-
data-test-subj="packagePolicyEditor.tsdbExperimentalFeature.switch"
187-
label={
188-
<FormattedMessage
189-
id="xpack.fleet.packagePolicyEditor.experimentalFeatures.TSDBLabel"
190-
defaultMessage="Time-series indexing (TSDB)"
191-
/>
192-
}
193-
onChange={(e) => {
194-
onIndexingSettingChange({
195-
tsdb: e.target.checked,
196-
});
197-
}}
198-
/>
199-
</EuiToolTip>
197+
onChange={(e) => {
198+
onIndexingSettingChange({
199+
tsdb: e.target.checked,
200+
});
201+
}}
202+
/>
200203
</EuiFlexItem>
201204
<EuiFlexItem>
202205
<EuiSwitch

x-pack/plugins/fleet/server/services/package_policies/experimental_datastream_features.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -152,7 +152,7 @@ export async function handleExperimentalDatastreamFeatureOptIn({
152152
});
153153
}
154154

155-
if (isTSDBOptInChanged && featureMapEntry.features.tsdb) {
155+
if (isTSDBOptInChanged) {
156156
const indexTemplateRes = await esClient.indices.getIndexTemplate({
157157
name: featureMapEntry.data_stream,
158158
});
@@ -165,14 +165,15 @@ export async function handleExperimentalDatastreamFeatureOptIn({
165165
settings: {
166166
...(indexTemplate.template?.settings ?? {}),
167167
index: {
168-
mode: 'time_series',
168+
mode: featureMapEntry.features.tsdb ? 'time_series' : null,
169169
},
170170
},
171171
},
172172
};
173173

174174
await esClient.indices.putIndexTemplate({
175175
name: featureMapEntry.data_stream,
176+
// @ts-expect-error
176177
body: indexTemplateBody,
177178
});
178179
}

0 commit comments

Comments
 (0)