From 631e69f3760b44a11949d8acb783d930b4ab5572 Mon Sep 17 00:00:00 2001 From: Robert Stelmach Date: Tue, 27 May 2025 17:08:08 +0200 Subject: [PATCH 01/17] initial version --- .../dataset_quality/table/columns.tsx | 196 ++++++++++-------- 1 file changed, 113 insertions(+), 83 deletions(-) diff --git a/x-pack/platform/plugins/shared/dataset_quality/public/components/dataset_quality/table/columns.tsx b/x-pack/platform/plugins/shared/dataset_quality/public/components/dataset_quality/table/columns.tsx index 71f11a2b00895..7989b2d4ce4c4 100644 --- a/x-pack/platform/plugins/shared/dataset_quality/public/components/dataset_quality/table/columns.tsx +++ b/x-pack/platform/plugins/shared/dataset_quality/public/components/dataset_quality/table/columns.tsx @@ -79,6 +79,7 @@ const actionsColumnName = i18n.translate('xpack.datasetQuality.actionsColumnName const openActionName = i18n.translate('xpack.datasetQuality.openActionName', { defaultMessage: 'Open', }); +const FAILURE_STORE_DOCS_URL = 'https://www.elastic.co/guide/en/elasticsearch/reference/current/data-streams-failure-store.html'; const inactiveDatasetActivityColumnDescription = i18n.translate( 'xpack.datasetQuality.inactiveDatasetActivityColumnDescription', @@ -249,37 +250,37 @@ export const getDatasetQualityTableColumns = ({ }, ...(canUserMonitorDataset && canUserMonitorAnyDataStream ? [ - { - name: ( - - {sizeColumnName} - - ), - field: 'sizeBytes', - sortable: true, - render: (_: any, dataStreamStat: DataStreamStat) => { - return ( - + {sizeColumnName} + + ), + field: 'sizeBytes', + sortable: true, + render: (_: any, dataStreamStat: DataStreamStat) => { + return ( + + - - {formatNumber( - DataStreamStat.calculateFilteredSize(dataStreamStat), - BYTE_NUMBER_FORMAT - )} - - - ); - }, - width: '100px', + {formatNumber( + DataStreamStat.calculateFilteredSize(dataStreamStat), + BYTE_NUMBER_FORMAT + )} + + + ); }, - ] + width: '100px', + }, + ] : []), { name: ( @@ -337,25 +338,53 @@ export const getDatasetQualityTableColumns = ({ }, ...(canReadFailureStore ? [ - { - name: ( - - - - {`${failedDocsColumnName} `} - - - - - ), - field: 'failedDocs.percentage', - sortable: true, - render: (_: any, dataStreamStat: DataStreamStat) => ( + { + name: ( + + + + {`${failedDocsColumnName} `} + + + + + ), + field: 'failedDocs.percentage', + sortable: true, + render: (_: any, dataStreamStat: DataStreamStat) => { + if (!dataStreamStat.userPrivileges?.canReadFailureStore) { + const FailureStoreHoverLink = () => { + const [hovered, setHovered] = React.useState(false); + return ( + + setHovered(true)} + onMouseLeave={() => setHovered(false)} + > + {hovered + ? i18n.translate('xpack.datasetQuality.failureStore.enable', { + defaultMessage: 'Set failure store' + }) + : 'N/A'} + + + ); + }; + return ; + } + return ( - ), - width: '140px', + ); }, - ] + width: '140px', + }, + ] : []), ...(canUserMonitorDataset && canUserMonitorAnyDataStream ? [ - { - name: ( - - {lastActivityColumnName} - - ), - field: 'lastActivity', - render: (timestamp: number) => ( - - {!isActiveDataset(timestamp) ? ( - - {inactiveDatasetActivityColumnDescription} - - - - - ) : ( - fieldFormats - .getDefaultInstance(KBN_FIELD_TYPES.DATE, [ES_FIELD_TYPES.DATE]) - .convert(timestamp) - )} - - ), - width: '300px', - sortable: true, - }, - ] + { + name: ( + + {lastActivityColumnName} + + ), + field: 'lastActivity', + render: (timestamp: number) => ( + + {!isActiveDataset(timestamp) ? ( + + {inactiveDatasetActivityColumnDescription} + + + + + ) : ( + fieldFormats + .getDefaultInstance(KBN_FIELD_TYPES.DATE, [ES_FIELD_TYPES.DATE]) + .convert(timestamp) + )} + + ), + width: '300px', + sortable: true, + }, + ] : []), { name: actionsColumnName, From 520379b069cc9ffba1cacd568ffb2226a33e360b Mon Sep 17 00:00:00 2001 From: Robert Stelmach Date: Tue, 27 May 2025 17:22:27 +0200 Subject: [PATCH 02/17] update documentation link --- .../public/components/dataset_quality/table/columns.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/x-pack/platform/plugins/shared/dataset_quality/public/components/dataset_quality/table/columns.tsx b/x-pack/platform/plugins/shared/dataset_quality/public/components/dataset_quality/table/columns.tsx index 7989b2d4ce4c4..1b561047a5789 100644 --- a/x-pack/platform/plugins/shared/dataset_quality/public/components/dataset_quality/table/columns.tsx +++ b/x-pack/platform/plugins/shared/dataset_quality/public/components/dataset_quality/table/columns.tsx @@ -79,7 +79,7 @@ const actionsColumnName = i18n.translate('xpack.datasetQuality.actionsColumnName const openActionName = i18n.translate('xpack.datasetQuality.openActionName', { defaultMessage: 'Open', }); -const FAILURE_STORE_DOCS_URL = 'https://www.elastic.co/guide/en/elasticsearch/reference/current/data-streams-failure-store.html'; +const FAILURE_STORE_DOCS_URL = 'https://www.elastic.co/docs/manage-data/data-store/data-streams/failure-store'; const inactiveDatasetActivityColumnDescription = i18n.translate( 'xpack.datasetQuality.inactiveDatasetActivityColumnDescription', From 78394914c06d37394161a0edd15d53e222ad2bbb Mon Sep 17 00:00:00 2001 From: kibanamachine <42973632+kibanamachine@users.noreply.github.com> Date: Wed, 28 May 2025 16:16:42 +0000 Subject: [PATCH 03/17] [CI] Auto-commit changed files from 'node scripts/eslint --no-cache --fix' --- .../dataset_quality/table/columns.tsx | 269 +++++++++--------- 1 file changed, 136 insertions(+), 133 deletions(-) diff --git a/x-pack/platform/plugins/shared/dataset_quality/public/components/dataset_quality/table/columns.tsx b/x-pack/platform/plugins/shared/dataset_quality/public/components/dataset_quality/table/columns.tsx index 1b561047a5789..a0caba50280ba 100644 --- a/x-pack/platform/plugins/shared/dataset_quality/public/components/dataset_quality/table/columns.tsx +++ b/x-pack/platform/plugins/shared/dataset_quality/public/components/dataset_quality/table/columns.tsx @@ -79,7 +79,8 @@ const actionsColumnName = i18n.translate('xpack.datasetQuality.actionsColumnName const openActionName = i18n.translate('xpack.datasetQuality.openActionName', { defaultMessage: 'Open', }); -const FAILURE_STORE_DOCS_URL = 'https://www.elastic.co/docs/manage-data/data-store/data-streams/failure-store'; +const FAILURE_STORE_DOCS_URL = + 'https://www.elastic.co/docs/manage-data/data-store/data-streams/failure-store'; const inactiveDatasetActivityColumnDescription = i18n.translate( 'xpack.datasetQuality.inactiveDatasetActivityColumnDescription', @@ -250,37 +251,37 @@ export const getDatasetQualityTableColumns = ({ }, ...(canUserMonitorDataset && canUserMonitorAnyDataStream ? [ - { - name: ( - - {sizeColumnName} - - ), - field: 'sizeBytes', - sortable: true, - render: (_: any, dataStreamStat: DataStreamStat) => { - return ( - - + {sizeColumnName} + + ), + field: 'sizeBytes', + sortable: true, + render: (_: any, dataStreamStat: DataStreamStat) => { + return ( + - {formatNumber( - DataStreamStat.calculateFilteredSize(dataStreamStat), - BYTE_NUMBER_FORMAT - )} - - - ); + + {formatNumber( + DataStreamStat.calculateFilteredSize(dataStreamStat), + BYTE_NUMBER_FORMAT + )} + + + ); + }, + width: '100px', }, - width: '100px', - }, - ] + ] : []), { name: ( @@ -338,114 +339,116 @@ export const getDatasetQualityTableColumns = ({ }, ...(canReadFailureStore ? [ - { - name: ( - - - - {`${failedDocsColumnName} `} - - - - - ), - field: 'failedDocs.percentage', - sortable: true, - render: (_: any, dataStreamStat: DataStreamStat) => { - if (!dataStreamStat.userPrivileges?.canReadFailureStore) { - const FailureStoreHoverLink = () => { - const [hovered, setHovered] = React.useState(false); - return ( - - setHovered(true)} - onMouseLeave={() => setHovered(false)} + { + name: ( + + + + {`${failedDocsColumnName} `} + + + + + ), + field: 'failedDocs.percentage', + sortable: true, + render: (_: any, dataStreamStat: DataStreamStat) => { + if (!dataStreamStat.userPrivileges?.canReadFailureStore) { + const FailureStoreHoverLink = () => { + const [hovered, setHovered] = React.useState(false); + return ( + - {hovered - ? i18n.translate('xpack.datasetQuality.failureStore.enable', { - defaultMessage: 'Set failure store' - }) - : 'N/A'} - - - ); - }; - return ; - } - return ( - - - i18n.translate('xpack.datasetQuality.fewFailedDocsTooltip', { - defaultMessage: '{failedDocsCount} failed docs in this data set.', - values: { - failedDocsCount, - }, - }) - } - dataTestSubj="datasetQualityFailedDocsPercentageLink" - /> - - ); + setHovered(true)} + onMouseLeave={() => setHovered(false)} + > + {hovered + ? i18n.translate('xpack.datasetQuality.failureStore.enable', { + defaultMessage: 'Set failure store', + }) + : 'N/A'} + + + ); + }; + return ; + } + return ( + + + i18n.translate('xpack.datasetQuality.fewFailedDocsTooltip', { + defaultMessage: '{failedDocsCount} failed docs in this data set.', + values: { + failedDocsCount, + }, + }) + } + dataTestSubj="datasetQualityFailedDocsPercentageLink" + /> + + ); + }, + width: '140px', }, - width: '140px', - }, - ] + ] : []), ...(canUserMonitorDataset && canUserMonitorAnyDataStream ? [ - { - name: ( - - {lastActivityColumnName} - - ), - field: 'lastActivity', - render: (timestamp: number) => ( - - {!isActiveDataset(timestamp) ? ( - - {inactiveDatasetActivityColumnDescription} - - - - - ) : ( - fieldFormats - .getDefaultInstance(KBN_FIELD_TYPES.DATE, [ES_FIELD_TYPES.DATE]) - .convert(timestamp) - )} - - ), - width: '300px', - sortable: true, - }, - ] + { + name: ( + + {lastActivityColumnName} + + ), + field: 'lastActivity', + render: (timestamp: number) => ( + + {!isActiveDataset(timestamp) ? ( + + {inactiveDatasetActivityColumnDescription} + + + + + ) : ( + fieldFormats + .getDefaultInstance(KBN_FIELD_TYPES.DATE, [ES_FIELD_TYPES.DATE]) + .convert(timestamp) + )} + + ), + width: '300px', + sortable: true, + }, + ] : []), { name: actionsColumnName, From 35cc59ca46d5578552b7c15e7cddce7be7d162f6 Mon Sep 17 00:00:00 2001 From: Robert Stelmach Date: Fri, 30 May 2025 15:43:39 +0200 Subject: [PATCH 04/17] add hasFailureStore flag to DataStreamStat model, distinguish datasets with/without failure store enabled --- .../common/data_streams_stats/data_stream_stat.ts | 8 +++++++- .../public/components/dataset_quality/table/columns.tsx | 3 ++- .../public/components/dataset_quality/table/table.tsx | 2 +- .../dataset_quality/public/utils/generate_datasets.ts | 7 ++++++- 4 files changed, 16 insertions(+), 4 deletions(-) diff --git a/x-pack/platform/plugins/shared/dataset_quality/common/data_streams_stats/data_stream_stat.ts b/x-pack/platform/plugins/shared/dataset_quality/common/data_streams_stats/data_stream_stat.ts index 9c551a7b5dcc2..87214b1e7a1cd 100644 --- a/x-pack/platform/plugins/shared/dataset_quality/common/data_streams_stats/data_stream_stat.ts +++ b/x-pack/platform/plugins/shared/dataset_quality/common/data_streams_stats/data_stream_stat.ts @@ -17,6 +17,7 @@ interface QualityStat { } export class DataStreamStat { + hasFailureStore: boolean; rawName: string; type: DataStreamType; name: DataStreamStatType['name']; @@ -34,6 +35,7 @@ export class DataStreamStat { failedDocs: QualityStat; private constructor(dataStreamStat: DataStreamStat) { + this.hasFailureStore = dataStreamStat.hasFailureStore ?? false; this.rawName = dataStreamStat.rawName; this.type = dataStreamStat.type; this.name = dataStreamStat.name; @@ -51,11 +53,12 @@ export class DataStreamStat { this.failedDocs = dataStreamStat.failedDocs; } - public static create(dataStreamStat: DataStreamStatType) { + public static create(dataStreamStat: DataStreamStatType & { hasFailureStore?: boolean }) { const { type, dataset, namespace } = indexNameToDataStreamParts(dataStreamStat.name); const dataStreamStatProps = { rawName: dataStreamStat.name, + hasFailureStore: false, type, name: dataset, title: dataset, @@ -79,17 +82,20 @@ export class DataStreamStat { failedDocStat, datasetIntegrationMap, totalDocs, + hasFailureStore, }: { datasetName: string; degradedDocStat: QualityStat; failedDocStat: QualityStat; datasetIntegrationMap: Record; totalDocs: number; + hasFailureStore?: boolean; }) { const { type, dataset, namespace } = indexNameToDataStreamParts(datasetName); const dataStreamStatProps = { rawName: datasetName, + hasFailureStore: hasFailureStore ?? true, type, name: dataset, title: datasetIntegrationMap[dataset]?.title || dataset, diff --git a/x-pack/platform/plugins/shared/dataset_quality/public/components/dataset_quality/table/columns.tsx b/x-pack/platform/plugins/shared/dataset_quality/public/components/dataset_quality/table/columns.tsx index a0caba50280ba..9d0237389f0b1 100644 --- a/x-pack/platform/plugins/shared/dataset_quality/public/components/dataset_quality/table/columns.tsx +++ b/x-pack/platform/plugins/shared/dataset_quality/public/components/dataset_quality/table/columns.tsx @@ -358,7 +358,7 @@ export const getDatasetQualityTableColumns = ({ field: 'failedDocs.percentage', sortable: true, render: (_: any, dataStreamStat: DataStreamStat) => { - if (!dataStreamStat.userPrivileges?.canReadFailureStore) { + if (!dataStreamStat.hasFailureStore) { const FailureStoreHoverLink = () => { const [hovered, setHovered] = React.useState(false); return ( @@ -375,6 +375,7 @@ export const getDatasetQualityTableColumns = ({ data-test-subj="datasetQualitySetFailureStoreLink" onMouseEnter={() => setHovered(true)} onMouseLeave={() => setHovered(false)} + css={{ fontWeight: 'normal' }} > {hovered ? i18n.translate('xpack.datasetQuality.failureStore.enable', { diff --git a/x-pack/platform/plugins/shared/dataset_quality/public/components/dataset_quality/table/table.tsx b/x-pack/platform/plugins/shared/dataset_quality/public/components/dataset_quality/table/table.tsx index a7524198aa24a..96f786cad6947 100644 --- a/x-pack/platform/plugins/shared/dataset_quality/public/components/dataset_quality/table/table.tsx +++ b/x-pack/platform/plugins/shared/dataset_quality/public/components/dataset_quality/table/table.tsx @@ -75,7 +75,7 @@ export const Table = () => { - + dataset)); const degradedMap: Record< DataStreamDocsStat['dataset'], { @@ -110,12 +111,16 @@ export function generateDatasets( failedDocStat: failedMap[dataset] || DEFAULT_QUALITY_DOC_STATS, datasetIntegrationMap, totalDocs: (totalDocsMap[dataset] ?? 0) + (failedMap[dataset]?.count ?? 0), + hasFailureStore: datasetsWithFailureStore.has(dataset), }) ); } return dataStreamStats?.map((dataStream) => { - const dataset = DataStreamStat.create(dataStream); + const dataset = DataStreamStat.create({ + ...dataStream, + hasFailureStore: datasetsWithFailureStore.has(dataStream.name), + }); const degradedDocs = degradedMap[dataset.rawName] || dataset.degradedDocs; const failedDocs = failedMap[dataset.rawName] || dataset.failedDocs; const qualityStats = [degradedDocs.percentage, failedDocs.percentage]; From eff4e3bdf6ac66b327de903e2bb84a7c51a83aac Mon Sep 17 00:00:00 2001 From: Robert Stelmach Date: Fri, 30 May 2025 21:58:04 +0200 Subject: [PATCH 05/17] use passed hasFailureStore value instead of hardcoded false --- .../common/data_streams_stats/data_stream_stat.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/x-pack/platform/plugins/shared/dataset_quality/common/data_streams_stats/data_stream_stat.ts b/x-pack/platform/plugins/shared/dataset_quality/common/data_streams_stats/data_stream_stat.ts index 87214b1e7a1cd..dcf88b6e93478 100644 --- a/x-pack/platform/plugins/shared/dataset_quality/common/data_streams_stats/data_stream_stat.ts +++ b/x-pack/platform/plugins/shared/dataset_quality/common/data_streams_stats/data_stream_stat.ts @@ -58,7 +58,7 @@ export class DataStreamStat { const dataStreamStatProps = { rawName: dataStreamStat.name, - hasFailureStore: false, + hasFailureStore: dataStreamStat.hasFailureStore ?? false, type, name: dataset, title: dataset, From cfdedcdf01e1f92ee20646cf498aecd6f67dd367 Mon Sep 17 00:00:00 2001 From: Robert Stelmach Date: Mon, 2 Jun 2025 12:49:54 +0200 Subject: [PATCH 06/17] adjust tests --- .../public/utils/generate_datasets.test.ts | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/x-pack/platform/plugins/shared/dataset_quality/public/utils/generate_datasets.test.ts b/x-pack/platform/plugins/shared/dataset_quality/public/utils/generate_datasets.test.ts index c24d9941c8919..0a5b085f66dc0 100644 --- a/x-pack/platform/plugins/shared/dataset_quality/public/utils/generate_datasets.test.ts +++ b/x-pack/platform/plugins/shared/dataset_quality/public/utils/generate_datasets.test.ts @@ -123,6 +123,7 @@ describe('generateDatasets', () => { percentage: 1.9607843137254901, count: 2, }, + hasFailureStore: true, }, { name: 'synth', @@ -149,6 +150,7 @@ describe('generateDatasets', () => { percentage: 0, count: 0, }, + hasFailureStore: false, }, ]); }); @@ -188,6 +190,7 @@ describe('generateDatasets', () => { percentage: 100, count: 2, }, + hasFailureStore: true, }, { name: 'synth', @@ -214,6 +217,7 @@ describe('generateDatasets', () => { percentage: 0, count: 0, }, + hasFailureStore: false, }, ]); }); @@ -244,6 +248,7 @@ describe('generateDatasets', () => { percentage: 0, count: 0, }, + hasFailureStore: false, }, { name: 'synth', @@ -267,6 +272,7 @@ describe('generateDatasets', () => { percentage: 0, count: 0, }, + hasFailureStore: false, }, ]); }); @@ -300,6 +306,7 @@ describe('generateDatasets', () => { percentage: 0, count: 0, }, + hasFailureStore: false, }, { name: 'synth', @@ -323,6 +330,7 @@ describe('generateDatasets', () => { percentage: 0, count: 0, }, + hasFailureStore: false, }, { name: 'another', @@ -346,6 +354,7 @@ describe('generateDatasets', () => { percentage: 0, count: 0, }, + hasFailureStore: false, }, ]); }); @@ -379,6 +388,7 @@ describe('generateDatasets', () => { percentage: 0, count: 0, }, + hasFailureStore: false, }, { name: 'synth', @@ -405,6 +415,7 @@ describe('generateDatasets', () => { percentage: 0, count: 0, }, + hasFailureStore: false, }, ]); }); @@ -451,6 +462,7 @@ describe('generateDatasets', () => { percentage: 0, count: 0, }, + hasFailureStore: false, }, ]); }); From 243b2b3d78d00b067af6e1793fe897ff9d5de8db Mon Sep 17 00:00:00 2001 From: Robert Stelmach Date: Mon, 2 Jun 2025 16:51:05 +0200 Subject: [PATCH 07/17] adjust functional tests --- .../functional/apps/dataset_quality/dataset_quality_table.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/x-pack/test/functional/apps/dataset_quality/dataset_quality_table.ts b/x-pack/test/functional/apps/dataset_quality/dataset_quality_table.ts index 33c1556c145ee..2ca8f8b32c35e 100644 --- a/x-pack/test/functional/apps/dataset_quality/dataset_quality_table.ts +++ b/x-pack/test/functional/apps/dataset_quality/dataset_quality_table.ts @@ -204,7 +204,7 @@ export default function ({ getService, getPageObjects }: DatasetQualityFtrProvid const failedDocsCol = cols[PageObjects.datasetQuality.texts.datasetFailedDocsColumn]; const failedDocsColCellTexts = await failedDocsCol.getCellTexts(); - expect(failedDocsColCellTexts).to.eql(['0%', '0%', '20%', '0%']); + expect(failedDocsColCellTexts).to.eql(['N/A', 'N/A', '20%', 'N/A']); }); }); }); From c63c5f4c989c0eccf021e6830bac0a1062525bce Mon Sep 17 00:00:00 2001 From: Robert Stelmach Date: Wed, 4 Jun 2025 14:40:36 +0200 Subject: [PATCH 08/17] add hasFailureStore to dataStreamStats --- .../plugins/shared/dataset_quality/common/api_types.ts | 1 + .../common/data_streams_stats/data_stream_stat.ts | 6 +++--- .../public/utils/generate_datasets.test.ts | 10 ++++++---- .../dataset_quality/public/utils/generate_datasets.ts | 1 - .../routes/data_streams/get_data_streams/index.ts | 1 + 5 files changed, 11 insertions(+), 8 deletions(-) diff --git a/x-pack/platform/plugins/shared/dataset_quality/common/api_types.ts b/x-pack/platform/plugins/shared/dataset_quality/common/api_types.ts index ca1adeff9601f..091d6df6bb217 100644 --- a/x-pack/platform/plugins/shared/dataset_quality/common/api_types.ts +++ b/x-pack/platform/plugins/shared/dataset_quality/common/api_types.ts @@ -34,6 +34,7 @@ export const dataStreamStatRt = rt.intersection([ integration: rt.string, totalDocs: rt.number, creationDate: rt.number, + hasFailureStore: rt.boolean, }), ]); diff --git a/x-pack/platform/plugins/shared/dataset_quality/common/data_streams_stats/data_stream_stat.ts b/x-pack/platform/plugins/shared/dataset_quality/common/data_streams_stats/data_stream_stat.ts index dcf88b6e93478..f47438e6fbc29 100644 --- a/x-pack/platform/plugins/shared/dataset_quality/common/data_streams_stats/data_stream_stat.ts +++ b/x-pack/platform/plugins/shared/dataset_quality/common/data_streams_stats/data_stream_stat.ts @@ -17,7 +17,6 @@ interface QualityStat { } export class DataStreamStat { - hasFailureStore: boolean; rawName: string; type: DataStreamType; name: DataStreamStatType['name']; @@ -33,9 +32,9 @@ export class DataStreamStat { docsInTimeRange?: number; degradedDocs: QualityStat; failedDocs: QualityStat; + hasFailureStore?: DataStreamStatType['hasFailureStore']; private constructor(dataStreamStat: DataStreamStat) { - this.hasFailureStore = dataStreamStat.hasFailureStore ?? false; this.rawName = dataStreamStat.rawName; this.type = dataStreamStat.type; this.name = dataStreamStat.name; @@ -51,6 +50,7 @@ export class DataStreamStat { this.docsInTimeRange = dataStreamStat.docsInTimeRange; this.degradedDocs = dataStreamStat.degradedDocs; this.failedDocs = dataStreamStat.failedDocs; + this.hasFailureStore = dataStreamStat.hasFailureStore; } public static create(dataStreamStat: DataStreamStatType & { hasFailureStore?: boolean }) { @@ -95,7 +95,7 @@ export class DataStreamStat { const dataStreamStatProps = { rawName: datasetName, - hasFailureStore: hasFailureStore ?? true, + hasFailureStore, type, name: dataset, title: datasetIntegrationMap[dataset]?.title || dataset, diff --git a/x-pack/platform/plugins/shared/dataset_quality/public/utils/generate_datasets.test.ts b/x-pack/platform/plugins/shared/dataset_quality/public/utils/generate_datasets.test.ts index 0a5b085f66dc0..9a31dda03c7f9 100644 --- a/x-pack/platform/plugins/shared/dataset_quality/public/utils/generate_datasets.test.ts +++ b/x-pack/platform/plugins/shared/dataset_quality/public/utils/generate_datasets.test.ts @@ -36,6 +36,7 @@ describe('generateDatasets', () => { const dataStreamStats: DataStreamStatType[] = [ { + hasFailureStore: true, name: 'logs-system.application-default', lastActivity: 1712911241117, size: '82.1kb', @@ -48,6 +49,7 @@ describe('generateDatasets', () => { }, }, { + hasFailureStore: true, name: 'logs-synth-default', lastActivity: 1712911241117, size: '62.5kb', @@ -150,7 +152,7 @@ describe('generateDatasets', () => { percentage: 0, count: 0, }, - hasFailureStore: false, + hasFailureStore: true, }, ]); }); @@ -217,7 +219,7 @@ describe('generateDatasets', () => { percentage: 0, count: 0, }, - hasFailureStore: false, + hasFailureStore: true, }, ]); }); @@ -388,7 +390,7 @@ describe('generateDatasets', () => { percentage: 0, count: 0, }, - hasFailureStore: false, + hasFailureStore: true, }, { name: 'synth', @@ -415,7 +417,7 @@ describe('generateDatasets', () => { percentage: 0, count: 0, }, - hasFailureStore: false, + hasFailureStore: true, }, ]); }); diff --git a/x-pack/platform/plugins/shared/dataset_quality/public/utils/generate_datasets.ts b/x-pack/platform/plugins/shared/dataset_quality/public/utils/generate_datasets.ts index 5b5c77564eee3..2895074abd4a3 100644 --- a/x-pack/platform/plugins/shared/dataset_quality/public/utils/generate_datasets.ts +++ b/x-pack/platform/plugins/shared/dataset_quality/public/utils/generate_datasets.ts @@ -119,7 +119,6 @@ export function generateDatasets( return dataStreamStats?.map((dataStream) => { const dataset = DataStreamStat.create({ ...dataStream, - hasFailureStore: datasetsWithFailureStore.has(dataStream.name), }); const degradedDocs = degradedMap[dataset.rawName] || dataset.degradedDocs; const failedDocs = failedMap[dataset.rawName] || dataset.failedDocs; diff --git a/x-pack/platform/plugins/shared/dataset_quality/server/routes/data_streams/get_data_streams/index.ts b/x-pack/platform/plugins/shared/dataset_quality/server/routes/data_streams/get_data_streams/index.ts index 6e0d84d15c26c..308e6b995f43c 100644 --- a/x-pack/platform/plugins/shared/dataset_quality/server/routes/data_streams/get_data_streams/index.ts +++ b/x-pack/platform/plugins/shared/dataset_quality/server/routes/data_streams/get_data_streams/index.ts @@ -68,6 +68,7 @@ export async function getDataStreams(options: { canMonitor: dataStreamsPrivileges[dataStream.name].monitor, canReadFailureStore: dataStreamsPrivileges[dataStream.name][FAILURE_STORE_PRIVILEGE], }, + hasFailureStore: dataStream.failure_store?.enabled ?? false, })); return { From 0597801400d22361287b447ba488ad39ecefb998 Mon Sep 17 00:00:00 2001 From: Robert Stelmach Date: Wed, 4 Jun 2025 14:42:27 +0200 Subject: [PATCH 09/17] remove unnecessary type --- .../common/data_streams_stats/data_stream_stat.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/x-pack/platform/plugins/shared/dataset_quality/common/data_streams_stats/data_stream_stat.ts b/x-pack/platform/plugins/shared/dataset_quality/common/data_streams_stats/data_stream_stat.ts index f47438e6fbc29..b65b91358c14d 100644 --- a/x-pack/platform/plugins/shared/dataset_quality/common/data_streams_stats/data_stream_stat.ts +++ b/x-pack/platform/plugins/shared/dataset_quality/common/data_streams_stats/data_stream_stat.ts @@ -53,7 +53,7 @@ export class DataStreamStat { this.hasFailureStore = dataStreamStat.hasFailureStore; } - public static create(dataStreamStat: DataStreamStatType & { hasFailureStore?: boolean }) { + public static create(dataStreamStat: DataStreamStatType) { const { type, dataset, namespace } = indexNameToDataStreamParts(dataStreamStat.name); const dataStreamStatProps = { From 677be065f94f8930fab384d96d113542ff8f97ed Mon Sep 17 00:00:00 2001 From: Robert Stelmach Date: Thu, 5 Jun 2025 12:47:58 +0200 Subject: [PATCH 10/17] Check if failure store is enabled for datastream in dataset quality details --- .../dataset_quality/common/api_types.ts | 1 + .../overview/document_trends/index.tsx | 6 ++--- .../overview/index.tsx | 24 ++++++++++++++++++- .../overview/summary/index.tsx | 4 ++-- .../use_dataset_quality_details_state.ts | 5 ++++ .../get_data_stream_details/index.ts | 1 + 6 files changed, 35 insertions(+), 6 deletions(-) diff --git a/x-pack/platform/plugins/shared/dataset_quality/common/api_types.ts b/x-pack/platform/plugins/shared/dataset_quality/common/api_types.ts index 091d6df6bb217..4f07eef8797ae 100644 --- a/x-pack/platform/plugins/shared/dataset_quality/common/api_types.ts +++ b/x-pack/platform/plugins/shared/dataset_quality/common/api_types.ts @@ -237,6 +237,7 @@ export const dataStreamSettingsRt = rt.partial({ export type DataStreamSettings = rt.TypeOf; export const dataStreamDetailsRt = rt.partial({ + hasFailureStore: rt.boolean, lastActivity: rt.number, degradedDocsCount: rt.number, failedDocsCount: rt.number, diff --git a/x-pack/platform/plugins/shared/dataset_quality/public/components/dataset_quality_details/overview/document_trends/index.tsx b/x-pack/platform/plugins/shared/dataset_quality/public/components/dataset_quality_details/overview/document_trends/index.tsx index 9c1925a3cecb3..2949f155c9ad9 100644 --- a/x-pack/platform/plugins/shared/dataset_quality/public/components/dataset_quality_details/overview/document_trends/index.tsx +++ b/x-pack/platform/plugins/shared/dataset_quality/public/components/dataset_quality_details/overview/document_trends/index.tsx @@ -60,7 +60,7 @@ const degradedDocsTooltip = ( // Allow for lazy loading // eslint-disable-next-line import/no-default-export export default function DocumentTrends({ lastReloadTime }: { lastReloadTime: number }) { - const { timeRange, updateTimeRange, docsTrendChart, canUserReadFailureStore } = + const { timeRange, updateTimeRange, docsTrendChart, canShowFailureStoreInfo } = useDatasetQualityDetailsState(); const { dataView, @@ -81,7 +81,7 @@ export default function DocumentTrends({ lastReloadTime }: { lastReloadTime: num [updateTimeRange, timeRange.refresh] ); - const accordionTitle = !canUserReadFailureStore ? ( + const accordionTitle = !canShowFailureStoreInfo ? ( - {canUserReadFailureStore && ( + {canShowFailureStoreInfo && ( import('./header')); const Summary = dynamic(() => import('./summary')); const DocumentTrends = dynamic(() => import('./document_trends')); @@ -22,6 +26,7 @@ export function Overview() { dataStream, isNonAggregatable, canUserReadFailureStore, + hasFailureStore, updateTimeRange, loadingState: { dataStreamSettingsLoading }, } = useDatasetQualityDetailsState(); @@ -39,6 +44,23 @@ export function Overview() { {isNonAggregatable && } + {!hasFailureStore && canUserReadFailureStore && ( +
+ + + {i18n.translate('xpack.datasetQuality.learnMore', { + defaultMessage: 'Learn how to enable it', + })} + + +
+ )} {!dataStreamSettingsLoading && !canUserReadFailureStore && ( - {canUserReadFailureStore && ( + {canShowFailureStoreInfo && ( { [service] ); + const hasFailureStore = Boolean(dataStreamDetails?.hasFailureStore); + const canShowFailureStoreInfo = canUserReadFailureStore && hasFailureStore; + return { service, telemetryClient, @@ -182,6 +185,8 @@ export const useDatasetQualityDetailsState = () => { canUserAccessDashboards, canUserViewIntegrations, canUserReadFailureStore, + hasFailureStore, + canShowFailureStoreInfo, expandedQualityIssue, isQualityIssueFlyoutOpen, }; diff --git a/x-pack/platform/plugins/shared/dataset_quality/server/routes/data_streams/get_data_stream_details/index.ts b/x-pack/platform/plugins/shared/dataset_quality/server/routes/data_streams/get_data_stream_details/index.ts index 5ff09db33ba37..e71be20e01a8a 100644 --- a/x-pack/platform/plugins/shared/dataset_quality/server/routes/data_streams/get_data_stream_details/index.ts +++ b/x-pack/platform/plugins/shared/dataset_quality/server/routes/data_streams/get_data_stream_details/index.ts @@ -86,6 +86,7 @@ export async function getDataStreamDetails({ ...dataStreamSummaryStats, failedDocsCount: failedDocs?.count, sizeBytes, + hasFailureStore: esDataStream?.hasFailureStore, lastActivity: esDataStream?.lastActivity, userPrivileges: { canMonitor: dataStreamPrivileges.monitor, From 43f94ccdc3b8aa6002f88d4a84c05b9cfe7d65fb Mon Sep 17 00:00:00 2001 From: Robert Stelmach Date: Fri, 6 Jun 2025 14:04:48 +0200 Subject: [PATCH 11/17] adjust functional tests --- .../page_objects/dataset_quality.ts | 24 ++++++++----------- 1 file changed, 10 insertions(+), 14 deletions(-) diff --git a/x-pack/test/functional/page_objects/dataset_quality.ts b/x-pack/test/functional/page_objects/dataset_quality.ts index cbb147155fcb1..57824c480a909 100644 --- a/x-pack/test/functional/page_objects/dataset_quality.ts +++ b/x-pack/test/functional/page_objects/dataset_quality.ts @@ -463,12 +463,16 @@ export function DatasetQualityPageObject({ getPageObjects, getService }: FtrProv ].filter((item) => !excludeKeys.includes(item.key)); const kpiTexts = await Promise.all( - kpiTitleAndKeys.map(async ({ title, key }) => ({ - key, - value: await testSubjects.getVisibleText( - `${testSubjectSelectors.datasetQualityDetailsSummaryKpiValue}-${title}` - ), - })) + kpiTitleAndKeys.map(async ({ title, key }) => { + const selector = `${testSubjectSelectors.datasetQualityDetailsSummaryKpiValue}-${title}`; + + const exists = await testSubjects.exists(selector); + if (!exists) { + return { key, value: undefined } as { key: string; value: string | undefined }; + } + + return { key, value: await testSubjects.getVisibleText(selector) }; + }) ); return kpiTexts.reduce( @@ -480,10 +484,6 @@ export function DatasetQualityPageObject({ getPageObjects, getService }: FtrProv ); }, - /** - * Selects a breakdown field from the unified histogram breakdown selector - * @param fieldText The text of the field to select. Use 'No breakdown' to clear the selection - */ async selectBreakdownField(fieldText: string) { return euiSelectable.searchAndSelectOption( testSubjectSelectors.unifiedHistogramBreakdownSelectorButton, @@ -522,10 +522,8 @@ export function DatasetQualityPageObject({ getPageObjects, getService }: FtrProv const fieldExpandButton = expandButtons[testDatasetRowIndex]; - // Check if 'title' attribute is "Expand" or "Collapse" const isCollapsed = (await fieldExpandButton.getAttribute('title')) === 'Expand'; - // Open if collapsed if (isCollapsed) { await fieldExpandButton.click(); } @@ -553,10 +551,8 @@ export function DatasetQualityPageObject({ getPageObjects, getService }: FtrProv const fieldExpandButton = expandButtons[testDatasetRowIndex]; - // Check if 'title' attribute is "Expand" or "Collapse" const isCollapsed = (await fieldExpandButton.getAttribute('title')) === 'Expand'; - // Open if collapsed if (isCollapsed) { await fieldExpandButton.click(); } From 7f6db0ed96f89dd6bff41bbdc6e24a38eb6a93c1 Mon Sep 17 00:00:00 2001 From: Robert Stelmach Date: Wed, 18 Jun 2025 13:11:49 +0200 Subject: [PATCH 12/17] add tests for hovering functionality. update tests to have `handleFailureStore`. remove unnecessary nullish coalescing operators --- .../data_streams_stats/data_stream_stat.ts | 2 +- .../dataset_quality_details/overview/index.tsx | 2 +- .../public/utils/generate_datasets.test.ts | 9 +++++---- .../public/utils/generate_datasets.ts | 5 ++++- .../data_streams/get_data_streams/index.ts | 2 +- .../dataset_quality/dataset_quality_table.ts | 16 +++++++++++++++- 6 files changed, 27 insertions(+), 9 deletions(-) diff --git a/x-pack/platform/plugins/shared/dataset_quality/common/data_streams_stats/data_stream_stat.ts b/x-pack/platform/plugins/shared/dataset_quality/common/data_streams_stats/data_stream_stat.ts index b65b91358c14d..05e3efb7782cb 100644 --- a/x-pack/platform/plugins/shared/dataset_quality/common/data_streams_stats/data_stream_stat.ts +++ b/x-pack/platform/plugins/shared/dataset_quality/common/data_streams_stats/data_stream_stat.ts @@ -58,7 +58,7 @@ export class DataStreamStat { const dataStreamStatProps = { rawName: dataStreamStat.name, - hasFailureStore: dataStreamStat.hasFailureStore ?? false, + hasFailureStore: dataStreamStat.hasFailureStore, type, name: dataset, title: dataset, diff --git a/x-pack/platform/plugins/shared/dataset_quality/public/components/dataset_quality_details/overview/index.tsx b/x-pack/platform/plugins/shared/dataset_quality/public/components/dataset_quality_details/overview/index.tsx index 6e704fe110e5a..a35fc55a016c7 100644 --- a/x-pack/platform/plugins/shared/dataset_quality/public/components/dataset_quality_details/overview/index.tsx +++ b/x-pack/platform/plugins/shared/dataset_quality/public/components/dataset_quality_details/overview/index.tsx @@ -44,7 +44,7 @@ export function Overview() { {isNonAggregatable && } - {!hasFailureStore && canUserReadFailureStore && ( + {!dataStreamSettingsLoading && !hasFailureStore && canUserReadFailureStore && (
{ }, }, { - hasFailureStore: true, + hasFailureStore: false, name: 'logs-synth-default', lastActivity: 1712911241117, size: '62.5kb', @@ -152,7 +152,7 @@ describe('generateDatasets', () => { percentage: 0, count: 0, }, - hasFailureStore: true, + hasFailureStore: false, }, ]); }); @@ -219,7 +219,7 @@ describe('generateDatasets', () => { percentage: 0, count: 0, }, - hasFailureStore: true, + hasFailureStore: false, }, ]); }); @@ -417,13 +417,14 @@ describe('generateDatasets', () => { percentage: 0, count: 0, }, - hasFailureStore: true, + hasFailureStore: false, }, ]); }); it('merges integration information with dataStreamStats when dataset is not an integration default one', () => { const nonDefaultDataset = { + hasFailureStore: false, name: 'logs-system.custom-default', lastActivity: 1712911241117, size: '82.1kb', diff --git a/x-pack/platform/plugins/shared/dataset_quality/public/utils/generate_datasets.ts b/x-pack/platform/plugins/shared/dataset_quality/public/utils/generate_datasets.ts index 2895074abd4a3..4828adea9f3cd 100644 --- a/x-pack/platform/plugins/shared/dataset_quality/public/utils/generate_datasets.ts +++ b/x-pack/platform/plugins/shared/dataset_quality/public/utils/generate_datasets.ts @@ -74,7 +74,10 @@ export function generateDatasets( {} ); - const datasetsWithFailureStore = new Set(failedDocStats.map(({ dataset }) => dataset)); + const datasetsWithFailureStore = new Set( + dataStreamStats.filter(({ hasFailureStore }) => hasFailureStore).map(({ name }) => name) + ); + const degradedMap: Record< DataStreamDocsStat['dataset'], { diff --git a/x-pack/platform/plugins/shared/dataset_quality/server/routes/data_streams/get_data_streams/index.ts b/x-pack/platform/plugins/shared/dataset_quality/server/routes/data_streams/get_data_streams/index.ts index 308e6b995f43c..376d2923220ce 100644 --- a/x-pack/platform/plugins/shared/dataset_quality/server/routes/data_streams/get_data_streams/index.ts +++ b/x-pack/platform/plugins/shared/dataset_quality/server/routes/data_streams/get_data_streams/index.ts @@ -68,7 +68,7 @@ export async function getDataStreams(options: { canMonitor: dataStreamsPrivileges[dataStream.name].monitor, canReadFailureStore: dataStreamsPrivileges[dataStream.name][FAILURE_STORE_PRIVILEGE], }, - hasFailureStore: dataStream.failure_store?.enabled ?? false, + hasFailureStore: dataStream.failure_store?.enabled, })); return { diff --git a/x-pack/test/functional/apps/dataset_quality/dataset_quality_table.ts b/x-pack/test/functional/apps/dataset_quality/dataset_quality_table.ts index 830be3465eb3f..c30eb7a53df73 100644 --- a/x-pack/test/functional/apps/dataset_quality/dataset_quality_table.ts +++ b/x-pack/test/functional/apps/dataset_quality/dataset_quality_table.ts @@ -5,7 +5,7 @@ * 2.0. */ -import expect from '@kbn/expect'; +import expect from '@kbn/expect/expect'; import originalExpect from 'expect'; import { IndexTemplateName } from '@kbn/apm-synthtrace/src/lib/logs/custom_logsdb_index_templates'; import { DatasetQualityFtrProviderContext } from './config'; @@ -28,6 +28,7 @@ export default function ({ getService, getPageObjects }: DatasetQualityFtrProvid 'datasetQuality', ]); const retry = getService('retry'); + const testSubjects = getService('testSubjects'); const synthtrace = getService('logSynthtraceEsClient'); const to = '2024-01-01T12:00:00.000Z'; const apacheAccessDatasetName = 'apache.access'; @@ -205,6 +206,19 @@ export default function ({ getService, getPageObjects }: DatasetQualityFtrProvid const failedDocsColCellTexts = await failedDocsCol.getCellTexts(); expect(failedDocsColCellTexts).to.eql(['N/A', 'N/A', '20%', 'N/A']); }); + + it('changes link text on hover when failure store is not enabled', async () => { + const linkSelector = 'datasetQualitySetFailureStoreLink'; + const link = await testSubjects.find(linkSelector); + + expect(await link.getVisibleText()).to.eql('N/A'); + + await link.moveMouseTo(); + + await retry.try(async () => { + expect(await link.getVisibleText()).to.eql('Set failure store'); + }); + }); }); }); } From d3358c6176e05db9ac128228f0b12cc683bdd5a9 Mon Sep 17 00:00:00 2001 From: kibanamachine <42973632+kibanamachine@users.noreply.github.com> Date: Wed, 18 Jun 2025 11:36:45 +0000 Subject: [PATCH 13/17] [CI] Auto-commit changed files from 'node scripts/eslint --no-cache --fix' --- .../functional/apps/dataset_quality/dataset_quality_table.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/x-pack/test/functional/apps/dataset_quality/dataset_quality_table.ts b/x-pack/test/functional/apps/dataset_quality/dataset_quality_table.ts index c30eb7a53df73..38506cdbaaa06 100644 --- a/x-pack/test/functional/apps/dataset_quality/dataset_quality_table.ts +++ b/x-pack/test/functional/apps/dataset_quality/dataset_quality_table.ts @@ -5,7 +5,7 @@ * 2.0. */ -import expect from '@kbn/expect/expect'; +import expect from '@kbn/expect'; import originalExpect from 'expect'; import { IndexTemplateName } from '@kbn/apm-synthtrace/src/lib/logs/custom_logsdb_index_templates'; import { DatasetQualityFtrProviderContext } from './config'; From 257b60d079520dcb042c0e3215aff3b33e82a47e Mon Sep 17 00:00:00 2001 From: Robert Stelmach Date: Wed, 18 Jun 2025 19:07:05 +0200 Subject: [PATCH 14/17] add api integration tests --- .../data_streams_failure_store.ts | 86 +++++++++++++++++++ .../observability/dataset_quality/index.ts | 1 + 2 files changed, 87 insertions(+) create mode 100644 x-pack/test/api_integration/deployment_agnostic/apis/observability/dataset_quality/data_streams_failure_store.ts diff --git a/x-pack/test/api_integration/deployment_agnostic/apis/observability/dataset_quality/data_streams_failure_store.ts b/x-pack/test/api_integration/deployment_agnostic/apis/observability/dataset_quality/data_streams_failure_store.ts new file mode 100644 index 0000000000000..afaa30fc55e56 --- /dev/null +++ b/x-pack/test/api_integration/deployment_agnostic/apis/observability/dataset_quality/data_streams_failure_store.ts @@ -0,0 +1,86 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { LogsSynthtraceEsClient } from '@kbn/apm-synthtrace'; +import { log, timerange } from '@kbn/apm-synthtrace-client'; +import expect from '@kbn/expect'; +import { DeploymentAgnosticFtrProviderContext } from '../../../ftr_provider_context'; + +export default function ({ getService }: DeploymentAgnosticFtrProviderContext) { + const synthtrace = getService('synthtrace'); + const roleScopedSupertest = getService('roleScopedSupertest'); + const es = getService('es'); + + const start = '2025-01-01T00:00:00.000Z'; + const end = '2025-01-01T00:01:00.000Z'; + + const enabledDs = 'logs-synth.fs-default'; + const disabledDs = 'logs-synth.no-default'; + + async function callDetails(supertestApi: any, ds: string) { + return supertestApi + .get(`/internal/dataset_quality/data_streams/${encodeURIComponent(ds)}/details`) + .query({ start, end }); + } + + describe('Failure-store flag on data-streams', () => { + let client: LogsSynthtraceEsClient; + let supertestAdmin: any; + + before(async () => { + client = await synthtrace.createLogsSynthtraceEsClient(); + + await client.createComponentTemplate({ + name: 'logs-failure-enabled@mappings', + dataStreamOptions: { failure_store: { enabled: true } }, + }); + await es.indices.putIndexTemplate({ + name: enabledDs, + index_patterns: [enabledDs], + composed_of: [ + 'logs-failure-enabled@mappings', + 'logs@mappings', + 'logs@settings', + 'ecs@mappings', + ], + priority: 500, + allow_auto_create: true, + data_stream: { hidden: false }, + }); + + await client.index([ + timerange(start, end) + .interval('1m') + .rate(1) + .generator((ts) => log.create().timestamp(ts).dataset('synth.fs')), + timerange(start, end) + .interval('1m') + .rate(1) + .generator((ts) => log.create().timestamp(ts).dataset('synth.no')), + ]); + await client.refresh(); + + supertestAdmin = await roleScopedSupertest.getSupertestWithRoleScope('admin', { + useCookieHeader: true, + withInternalHeaders: true, + }); + }); + + after(async () => { + await es.indices.deleteIndexTemplate({ name: enabledDs }); + await client.deleteComponentTemplate('logs-failure-enabled@mappings'); + await client.clean(); + }); + + it('details API reports correct hasFailureStore flag', async () => { + const enabled = await callDetails(supertestAdmin, enabledDs); + const disabled = await callDetails(supertestAdmin, disabledDs); + expect(enabled.body.hasFailureStore).to.be(true); + expect(disabled.body.hasFailureStore).to.be(false); + }); + }); +} diff --git a/x-pack/test/api_integration/deployment_agnostic/apis/observability/dataset_quality/index.ts b/x-pack/test/api_integration/deployment_agnostic/apis/observability/dataset_quality/index.ts index 3c34171f9de82..4412041286f73 100644 --- a/x-pack/test/api_integration/deployment_agnostic/apis/observability/dataset_quality/index.ts +++ b/x-pack/test/api_integration/deployment_agnostic/apis/observability/dataset_quality/index.ts @@ -24,5 +24,6 @@ export default function ({ loadTestFile }: DeploymentAgnosticFtrProviderContext) loadTestFile(require.resolve('./failed_docs')); loadTestFile(require.resolve('./failed_docs_errors')); loadTestFile(require.resolve('./failed_docs_stats')); + loadTestFile(require.resolve('./data_streams_failure_store')); }); } From 77abd1c57b2a96bf7ca4a4ddaa74a6abaac22216 Mon Sep 17 00:00:00 2001 From: Robert Stelmach Date: Fri, 20 Jun 2025 15:22:21 +0200 Subject: [PATCH 15/17] replace link to docs with datastream details locator --- .../dataset_quality/table/columns.tsx | 12 ++++-- .../overview/index.tsx | 43 +++++++++++++------ 2 files changed, 38 insertions(+), 17 deletions(-) diff --git a/x-pack/platform/plugins/shared/dataset_quality/public/components/dataset_quality/table/columns.tsx b/x-pack/platform/plugins/shared/dataset_quality/public/components/dataset_quality/table/columns.tsx index 9d0237389f0b1..085e3213c1d25 100644 --- a/x-pack/platform/plugins/shared/dataset_quality/public/components/dataset_quality/table/columns.tsx +++ b/x-pack/platform/plugins/shared/dataset_quality/public/components/dataset_quality/table/columns.tsx @@ -79,8 +79,6 @@ const actionsColumnName = i18n.translate('xpack.datasetQuality.actionsColumnName const openActionName = i18n.translate('xpack.datasetQuality.openActionName', { defaultMessage: 'Open', }); -const FAILURE_STORE_DOCS_URL = - 'https://www.elastic.co/docs/manage-data/data-store/data-streams/failure-store'; const inactiveDatasetActivityColumnDescription = i18n.translate( 'xpack.datasetQuality.inactiveDatasetActivityColumnDescription', @@ -361,15 +359,21 @@ export const getDatasetQualityTableColumns = ({ if (!dataStreamStat.hasFailureStore) { const FailureStoreHoverLink = () => { const [hovered, setHovered] = React.useState(false); + const locator = urlService.locators.get('INDEX_MANAGEMENT_LOCATOR_ID'); + const params = { + page: 'data_streams_details', + dataStreamName: dataStreamStat.rawName, + } as const; + return ( import('./header')); const Summary = dynamic(() => import('./summary')); @@ -30,6 +28,16 @@ export function Overview() { updateTimeRange, loadingState: { dataStreamSettingsLoading }, } = useDatasetQualityDetailsState(); + + const { + services: { + share: { url: urlService }, + }, + } = useKibanaContextForPlugin(); + + const locator = urlService.locators.get('INDEX_MANAGEMENT_LOCATOR_ID'); + const locatorParams = { page: 'data_streams_details', dataStreamName: dataStream } as const; + const [lastReloadTime, setLastReloadTime] = useState(Date.now()); const handleRefresh = useCallback( @@ -49,16 +57,25 @@ export function Overview() { - - {i18n.translate('xpack.datasetQuality.learnMore', { - defaultMessage: 'Learn how to enable it', - })} - - + title={ + <> + {i18n.translate('xpack.datasetQuality.noFailureStoreTitle', { + defaultMessage: 'Failure store is not enabled for this data stream. ', + })} + + {i18n.translate('xpack.datasetQuality.enableFailureStore', { + defaultMessage: 'Enable failure store', + })} + + + } + />
)} {!dataStreamSettingsLoading && !canUserReadFailureStore && ( From ed15c9afd5c89a578e92f586e5bd8c54225915a4 Mon Sep 17 00:00:00 2001 From: Robert Stelmach Date: Mon, 23 Jun 2025 16:37:09 +0200 Subject: [PATCH 16/17] wait until tooltip dissapears in ftr --- x-pack/test/functional/page_objects/dataset_quality.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/x-pack/test/functional/page_objects/dataset_quality.ts b/x-pack/test/functional/page_objects/dataset_quality.ts index 6f3f8009f4d72..0d6d4040806ff 100644 --- a/x-pack/test/functional/page_objects/dataset_quality.ts +++ b/x-pack/test/functional/page_objects/dataset_quality.ts @@ -411,6 +411,7 @@ export function DatasetQualityPageObject({ getPageObjects, getService }: FtrProv }, async toggleShowFullDatasetNames() { + await find.waitForDeletedByCssSelector('.euiToolTipPopover', 5 * 1000); return find.clickByCssSelector(selectors.showFullDatasetNamesSwitch); }, From f2bb67a7f787bbc5221b0e178a0a563e8fa403a2 Mon Sep 17 00:00:00 2001 From: Robert Stelmach Date: Mon, 23 Jun 2025 18:19:37 +0200 Subject: [PATCH 17/17] move mouse back to the table after veryfing tooltip next --- .../apps/dataset_quality/dataset_quality_table.ts | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/x-pack/test/functional/apps/dataset_quality/dataset_quality_table.ts b/x-pack/test/functional/apps/dataset_quality/dataset_quality_table.ts index 38506cdbaaa06..9f9bfca4cdc56 100644 --- a/x-pack/test/functional/apps/dataset_quality/dataset_quality_table.ts +++ b/x-pack/test/functional/apps/dataset_quality/dataset_quality_table.ts @@ -209,7 +209,9 @@ export default function ({ getService, getPageObjects }: DatasetQualityFtrProvid it('changes link text on hover when failure store is not enabled', async () => { const linkSelector = 'datasetQualitySetFailureStoreLink'; - const link = await testSubjects.find(linkSelector); + const links = await testSubjects.findAll(linkSelector); + expect(links.length).to.be.greaterThan(0); + const link = links[links.length - 1]; expect(await link.getVisibleText()).to.eql('N/A'); @@ -218,6 +220,9 @@ export default function ({ getService, getPageObjects }: DatasetQualityFtrProvid await retry.try(async () => { expect(await link.getVisibleText()).to.eql('Set failure store'); }); + + const table = await PageObjects.datasetQuality.getDatasetsTable(); + await table.moveMouseTo(); }); }); });