[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
(https://github.com/elastic/kibana/issues/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>
This commit is contained in:
Kyle Pollich 2023-01-30 15:24:38 -05:00 committed by GitHub
parent a489d221dd
commit fe34d7f27e
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 126 additions and 43 deletions

View file

@ -661,6 +661,7 @@ export const getDocLinks = ({ kibanaBranch }: GetDocLinkOptions): DocLinks => {
datastreams: `${FLEET_DOCS}data-streams.html`,
datastreamsILM: `${FLEET_DOCS}data-streams.html#data-streams-ilm`,
datastreamsNamingScheme: `${FLEET_DOCS}data-streams.html#data-streams-naming-scheme`,
datastreamsManualRollover: `${ELASTICSEARCH_DOCS}use-a-data-stream.html#manually-roll-over-a-data-stream`,
installElasticAgent: `${FLEET_DOCS}install-fleet-managed-elastic-agent.html`,
installElasticAgentStandalone: `${FLEET_DOCS}install-standalone-elastic-agent.html`,
upgradeElasticAgent: `${FLEET_DOCS}upgrade-elastic-agent.html`,

View file

@ -433,6 +433,7 @@ export interface DocLinks {
datastreams: string;
datastreamsILM: string;
datastreamsNamingScheme: string;
datastreamsManualRollover: string;
installElasticAgent: string;
installElasticAgentStandalone: string;
packageSignatures: string;

View file

@ -178,14 +178,91 @@ describe('ExperimentDatastreamSettings', () => {
},
},
]);
expect(experimentalDataFeatures).toEqual([
});
});
describe('TSDB', () => {
it('should be enabled and unchecked by default', () => {
const mockSetNewExperimentalDataFeatures = jest.fn();
const res = createFleetTestRendererMock().render(
<ExperimentDatastreamSettings
registryDataStream={{ type: 'logs', dataset: 'test' } as unknown as RegistryDataStream}
experimentalDataFeatures={[]}
setNewExperimentalDataFeatures={mockSetNewExperimentalDataFeatures}
/>
);
const tsdbSwitch = res.getByTestId('packagePolicyEditor.tsdbExperimentalFeature.switch');
expect(tsdbSwitch).toBeEnabled();
expect(tsdbSwitch).not.toBeChecked();
expect(mockSetNewExperimentalDataFeatures).not.toBeCalled();
});
it('should be enabled and checked if registry data streams includes "elasticsearch.index_mode: time_series"', () => {
const mockSetNewExperimentalDataFeatures = jest.fn();
const res = createFleetTestRendererMock().render(
<ExperimentDatastreamSettings
registryDataStream={
{
type: 'logs',
dataset: 'test',
elasticsearch: {
index_mode: 'time_series',
},
} as unknown as RegistryDataStream
}
experimentalDataFeatures={[]}
setNewExperimentalDataFeatures={mockSetNewExperimentalDataFeatures}
/>
);
const tsdbSwitch = res.getByTestId('packagePolicyEditor.tsdbExperimentalFeature.switch');
expect(tsdbSwitch).toBeEnabled();
expect(tsdbSwitch).toBeChecked();
expect(mockSetNewExperimentalDataFeatures).not.toBeCalled();
});
it('should not mutate other experimental features when changed', () => {
const experimentalDataFeatures = [
{
data_stream: 'logs-test',
features: {
synthetic_source: true,
tsdb: false,
doc_value_only_numeric: false,
doc_value_only_other: false,
synthetic_source: true,
tsdb: false,
},
},
];
const mockSetNewExperimentalDataFeatures = jest.fn();
const res = createFleetTestRendererMock().render(
<ExperimentDatastreamSettings
registryDataStream={
{
type: 'logs',
dataset: 'test',
} as unknown as RegistryDataStream
}
experimentalDataFeatures={experimentalDataFeatures}
setNewExperimentalDataFeatures={mockSetNewExperimentalDataFeatures}
/>
);
act(() => {
fireEvent.click(res.getByTestId('packagePolicyEditor.tsdbExperimentalFeature.switch'));
});
expect(mockSetNewExperimentalDataFeatures).toBeCalled();
expect(mockSetNewExperimentalDataFeatures.mock.calls[0][0]).toEqual([
{
data_stream: 'logs-test',
features: {
doc_value_only_numeric: false,
doc_value_only_other: false,
synthetic_source: true,
tsdb: true,
},
},
]);

View file

@ -15,8 +15,11 @@ import {
EuiText,
EuiSpacer,
EuiTitle,
EuiToolTip,
EuiLink,
} from '@elastic/eui';
import { i18n } from '@kbn/i18n';
import { useStartServices } from '../../../../../../../../hooks';
import type {
ExperimentalDataStreamFeature,
@ -50,6 +53,8 @@ export const ExperimentDatastreamSettings: React.FunctionComponent<Props> = ({
experimentalDataFeatures,
setNewExperimentalDataFeatures,
}) => {
const { docLinks } = useStartServices();
const isSyntheticSourceEditable = registryDataStream.elasticsearch?.source_mode !== 'default';
const syntheticSourceExperimentalValue = getExperimentalFeatureValue(
@ -129,27 +134,35 @@ export const ExperimentDatastreamSettings: React.FunctionComponent<Props> = ({
<h5>
<FormattedMessage
id="xpack.fleet.packagePolicyEditor.experimentalSettings.title"
defaultMessage="Indexing settings (experimental)"
defaultMessage="Indexing settings (technical preview)"
/>
</h5>
</EuiTitle>
</EuiFlexItem>
<EuiFlexItem>
<EuiText color="subdued" size="xs">
<FormattedMessage
id="xpack.fleet.packagePolicyEditor.stepConfigure.experimentalFeaturesDescription"
defaultMessage="Select data streams to configure indexing options. This is an {experimentalFeature} and may have effects on other properties."
values={{
experimentalFeature: (
<strong>
<FormattedMessage
id="xpack.fleet.packagePolicyEditor.experimentalFeatureText"
defaultMessage="experimental feature"
/>
</strong>
),
}}
/>
<p>
<FormattedMessage
id="xpack.fleet.packagePolicyEditor.stepConfigure.experimentalFeaturesDescription"
defaultMessage="Choose how you want to store backing indices for this data stream. Changing these settings may affect other properties."
/>
</p>
<p>
<FormattedMessage
id="xpack.fleet.packagePolicyEditor.stepConfigure.experimentalFeaturesRolloverWarning"
defaultMessage="After changing these settings, you need to manually roll over the existing data stream for changes to take effect. {learnMoreLink}"
values={{
learnMoreLink: (
<EuiLink href={docLinks.links.fleet.datastreamsManualRollover} target="_blank">
{i18n.translate(
'xpack.fleet.packagePolicyEditor.experimentalFeatureRolloverLearnMore',
{ defaultMessage: 'Learn more' }
)}
</EuiLink>
),
}}
/>
</p>
</EuiText>
</EuiFlexItem>
<EuiSpacer size="s" />
@ -172,31 +185,21 @@ export const ExperimentDatastreamSettings: React.FunctionComponent<Props> = ({
/>
</EuiFlexItem>
<EuiFlexItem>
<EuiToolTip
content={
<EuiSwitch
checked={newExperimentalIndexingFeature.tsdb ?? false}
data-test-subj="packagePolicyEditor.tsdbExperimentalFeature.switch"
label={
<FormattedMessage
id="xpack.fleet.packagePolicyEditor.experimentalFeatures.TSDBTooltip"
defaultMessage="Enabling this feature is irreversible"
id="xpack.fleet.packagePolicyEditor.experimentalFeatures.TSDBLabel"
defaultMessage="Time-series indexing (TSDB)"
/>
}
>
<EuiSwitch
disabled={newExperimentalIndexingFeature.tsdb ?? false}
checked={newExperimentalIndexingFeature.tsdb ?? false}
data-test-subj="packagePolicyEditor.tsdbExperimentalFeature.switch"
label={
<FormattedMessage
id="xpack.fleet.packagePolicyEditor.experimentalFeatures.TSDBLabel"
defaultMessage="Time-series indexing (TSDB)"
/>
}
onChange={(e) => {
onIndexingSettingChange({
tsdb: e.target.checked,
});
}}
/>
</EuiToolTip>
onChange={(e) => {
onIndexingSettingChange({
tsdb: e.target.checked,
});
}}
/>
</EuiFlexItem>
<EuiFlexItem>
<EuiSwitch

View file

@ -152,7 +152,7 @@ export async function handleExperimentalDatastreamFeatureOptIn({
});
}
if (isTSDBOptInChanged && featureMapEntry.features.tsdb) {
if (isTSDBOptInChanged) {
const indexTemplateRes = await esClient.indices.getIndexTemplate({
name: featureMapEntry.data_stream,
});
@ -165,7 +165,7 @@ export async function handleExperimentalDatastreamFeatureOptIn({
settings: {
...(indexTemplate.template?.settings ?? {}),
index: {
mode: 'time_series',
mode: featureMapEntry.features.tsdb ? 'time_series' : null,
},
},
},
@ -173,6 +173,7 @@ export async function handleExperimentalDatastreamFeatureOptIn({
await esClient.indices.putIndexTemplate({
name: featureMapEntry.data_stream,
// @ts-expect-error
body: indexTemplateBody,
});
}