Skip to content

Commit 1a477b3

Browse files
[8.19] [Dataset quality] degradedDocs rule (elastic#216026) (elastic#224904)
# Backport This will backport the following commits from `main` to `8.19`: - [[Dataset quality] degradedDocs rule (elastic#216026)](elastic#216026) <!--- Backport version: 10.0.0 --> ### Questions ? Please refer to the [Backport tool documentation](https://github.com/sorenlouv/backport) <!--BACKPORT [{"author":{"name":"Yngrid Coello","email":"[email protected]"},"sourceCommit":{"committedDate":"2025-06-23T09:30:14Z","message":"[Dataset quality] degradedDocs rule (elastic#216026)\n\nCloses https://github.com/elastic/kibana/issues/179173.\n\n## Rule type\nA dedicated stack rule type was created `datasetQuality.degradedDocs`.\n<img width=\"1759\" alt=\"image\"\nsrc=\"https://github.com/user-attachments/assets/5004a08d-6f12-4f5e-b27f-5f4db242dcf0\"\n/>\n<img width=\"2318\" alt=\"image\"\nsrc=\"https://github.com/user-attachments/assets/f8b2664a-f1c6-48c5-a617-c6f1b79bf0f7\"\n/>\n\n\nThis new rule is aggregated by default using `_index` and could be\nfurther configured by the user (e.g. user can also aggregate by\n`cloud.provider`).\n\nA new rule type was needed to be created since there is no actual way to\naggregate all documents in a dataStream if we use a DataView like\n`logs-*-*`. Inside datasStream documents there is no indication about\nthe dataStream where they belong to, instead we just have `_index` which\ncontains backingIndexName instead of actual index.\n\nIt's important to note, that this rule type is also visible from\n`Observability > Alerts`, which is useful specially for serverless.\n\n\nhttps://github.com/user-attachments/assets/000aee51-4895-4f4c-9484-924ace4325c5\n\n\n## Role Based Access-Control (RBAC)\nRBAC for dataset quality alerts is defined within dataQuality kibana\nfeature.\nWe have three privileges defined:\n1. `all`: This privilege now contains a subFeature `manage_rules` that\nwill allow for more granularity on alerting level. It's by default\nassigned to `all` but can be disabled.\n2. `read`: This privilege is only related to serverless (when we don't\nhave yet custom roles).\n\nhttps://github.com/user-attachments/assets/70ed5bde-bf45-4024-b448-228799fcaf71\n3. `none`: This privilege is only relevant for stateful (in serverless\nwe don't have custom roles).\n\n## 🎥 Demo\n### Serverless\n#### `all` privileges\n\nhttps://github.com/user-attachments/assets/8dad6e30-a261-4a69-979f-6dfc2a41c888\n\n#### `read` privileges\n\nhttps://github.com/user-attachments/assets/e1cb108d-22a0-4e7f-b252-9cc12d1e9d65\n\n### Stateful\n#### `all` privileges\n\nhttps://github.com/user-attachments/assets/d96f3b70-35b2-466b-aa59-a07190d24d93\n\n#### `all` privileges with subFeature disabled\n\nhttps://github.com/user-attachments/assets/808ab811-9320-43e4-b2a6-06d530a78b82\n\n#### `none` privileges (Stateful)\n\nhttps://github.com/user-attachments/assets/18f2a2d6-d825-4713-acea-0d72f451e9ab\n\n## How to test?\n1. run synthrace scenario `degraded_logs` in live mode\n```\nnode scripts/synthtrace degraded_logs --live\n```\n2. Open dataset quality page (/app/management/data/data_quality)\n3. Select `synth.3` dataset\n(/app/management/data/data_quality/details?pageState=(dataStream:logs-synth.3-default)\n4. Click on `Actions` and then select `Create rule`\n5. Fill out the alert form\n6. Go to `Observability > Alerts` or `Stack management > Alerts`\n(/app/observability/alerts)\n\n## Release note\nAdds the Create alert rule action to dataset quality page and dataset\nquality details. This allows you to generate an alert when the\npercentage of degraded docs on the chart crosses a certain threshold.\n\n---------\n\nCo-authored-by: kibanamachine <[email protected]>\nCo-authored-by: Aleh Zasypkin <[email protected]>\nCo-authored-by: Faisal Kanout <[email protected]>","sha":"64df229998b0db7e5d381c847e60c0d39e6c3120","branchLabelMapping":{"^v9.1.0$":"main","^v(\\d+).(\\d+).\\d+$":"$1.$2"}},"sourcePullRequest":{"labels":["backport","release_note:feature","Team:obs-ux-management","backport:version","v9.1.0","v8.19.0"],"title":"[Dataset quality] degradedDocs rule","number":216026,"url":"https://github.com/elastic/kibana/pull/216026","mergeCommit":{"message":"[Dataset quality] degradedDocs rule (elastic#216026)\n\nCloses https://github.com/elastic/kibana/issues/179173.\n\n## Rule type\nA dedicated stack rule type was created `datasetQuality.degradedDocs`.\n<img width=\"1759\" alt=\"image\"\nsrc=\"https://github.com/user-attachments/assets/5004a08d-6f12-4f5e-b27f-5f4db242dcf0\"\n/>\n<img width=\"2318\" alt=\"image\"\nsrc=\"https://github.com/user-attachments/assets/f8b2664a-f1c6-48c5-a617-c6f1b79bf0f7\"\n/>\n\n\nThis new rule is aggregated by default using `_index` and could be\nfurther configured by the user (e.g. user can also aggregate by\n`cloud.provider`).\n\nA new rule type was needed to be created since there is no actual way to\naggregate all documents in a dataStream if we use a DataView like\n`logs-*-*`. Inside datasStream documents there is no indication about\nthe dataStream where they belong to, instead we just have `_index` which\ncontains backingIndexName instead of actual index.\n\nIt's important to note, that this rule type is also visible from\n`Observability > Alerts`, which is useful specially for serverless.\n\n\nhttps://github.com/user-attachments/assets/000aee51-4895-4f4c-9484-924ace4325c5\n\n\n## Role Based Access-Control (RBAC)\nRBAC for dataset quality alerts is defined within dataQuality kibana\nfeature.\nWe have three privileges defined:\n1. `all`: This privilege now contains a subFeature `manage_rules` that\nwill allow for more granularity on alerting level. It's by default\nassigned to `all` but can be disabled.\n2. `read`: This privilege is only related to serverless (when we don't\nhave yet custom roles).\n\nhttps://github.com/user-attachments/assets/70ed5bde-bf45-4024-b448-228799fcaf71\n3. `none`: This privilege is only relevant for stateful (in serverless\nwe don't have custom roles).\n\n## 🎥 Demo\n### Serverless\n#### `all` privileges\n\nhttps://github.com/user-attachments/assets/8dad6e30-a261-4a69-979f-6dfc2a41c888\n\n#### `read` privileges\n\nhttps://github.com/user-attachments/assets/e1cb108d-22a0-4e7f-b252-9cc12d1e9d65\n\n### Stateful\n#### `all` privileges\n\nhttps://github.com/user-attachments/assets/d96f3b70-35b2-466b-aa59-a07190d24d93\n\n#### `all` privileges with subFeature disabled\n\nhttps://github.com/user-attachments/assets/808ab811-9320-43e4-b2a6-06d530a78b82\n\n#### `none` privileges (Stateful)\n\nhttps://github.com/user-attachments/assets/18f2a2d6-d825-4713-acea-0d72f451e9ab\n\n## How to test?\n1. run synthrace scenario `degraded_logs` in live mode\n```\nnode scripts/synthtrace degraded_logs --live\n```\n2. Open dataset quality page (/app/management/data/data_quality)\n3. Select `synth.3` dataset\n(/app/management/data/data_quality/details?pageState=(dataStream:logs-synth.3-default)\n4. Click on `Actions` and then select `Create rule`\n5. Fill out the alert form\n6. Go to `Observability > Alerts` or `Stack management > Alerts`\n(/app/observability/alerts)\n\n## Release note\nAdds the Create alert rule action to dataset quality page and dataset\nquality details. This allows you to generate an alert when the\npercentage of degraded docs on the chart crosses a certain threshold.\n\n---------\n\nCo-authored-by: kibanamachine <[email protected]>\nCo-authored-by: Aleh Zasypkin <[email protected]>\nCo-authored-by: Faisal Kanout <[email protected]>","sha":"64df229998b0db7e5d381c847e60c0d39e6c3120"}},"sourceBranch":"main","suggestedTargetBranches":["8.19"],"targetPullRequestStates":[{"branch":"main","label":"v9.1.0","branchLabelMappingKey":"^v9.1.0$","isSourceBranch":true,"state":"MERGED","url":"https://github.com/elastic/kibana/pull/216026","number":216026,"mergeCommit":{"message":"[Dataset quality] degradedDocs rule (elastic#216026)\n\nCloses https://github.com/elastic/kibana/issues/179173.\n\n## Rule type\nA dedicated stack rule type was created `datasetQuality.degradedDocs`.\n<img width=\"1759\" alt=\"image\"\nsrc=\"https://github.com/user-attachments/assets/5004a08d-6f12-4f5e-b27f-5f4db242dcf0\"\n/>\n<img width=\"2318\" alt=\"image\"\nsrc=\"https://github.com/user-attachments/assets/f8b2664a-f1c6-48c5-a617-c6f1b79bf0f7\"\n/>\n\n\nThis new rule is aggregated by default using `_index` and could be\nfurther configured by the user (e.g. user can also aggregate by\n`cloud.provider`).\n\nA new rule type was needed to be created since there is no actual way to\naggregate all documents in a dataStream if we use a DataView like\n`logs-*-*`. Inside datasStream documents there is no indication about\nthe dataStream where they belong to, instead we just have `_index` which\ncontains backingIndexName instead of actual index.\n\nIt's important to note, that this rule type is also visible from\n`Observability > Alerts`, which is useful specially for serverless.\n\n\nhttps://github.com/user-attachments/assets/000aee51-4895-4f4c-9484-924ace4325c5\n\n\n## Role Based Access-Control (RBAC)\nRBAC for dataset quality alerts is defined within dataQuality kibana\nfeature.\nWe have three privileges defined:\n1. `all`: This privilege now contains a subFeature `manage_rules` that\nwill allow for more granularity on alerting level. It's by default\nassigned to `all` but can be disabled.\n2. `read`: This privilege is only related to serverless (when we don't\nhave yet custom roles).\n\nhttps://github.com/user-attachments/assets/70ed5bde-bf45-4024-b448-228799fcaf71\n3. `none`: This privilege is only relevant for stateful (in serverless\nwe don't have custom roles).\n\n## 🎥 Demo\n### Serverless\n#### `all` privileges\n\nhttps://github.com/user-attachments/assets/8dad6e30-a261-4a69-979f-6dfc2a41c888\n\n#### `read` privileges\n\nhttps://github.com/user-attachments/assets/e1cb108d-22a0-4e7f-b252-9cc12d1e9d65\n\n### Stateful\n#### `all` privileges\n\nhttps://github.com/user-attachments/assets/d96f3b70-35b2-466b-aa59-a07190d24d93\n\n#### `all` privileges with subFeature disabled\n\nhttps://github.com/user-attachments/assets/808ab811-9320-43e4-b2a6-06d530a78b82\n\n#### `none` privileges (Stateful)\n\nhttps://github.com/user-attachments/assets/18f2a2d6-d825-4713-acea-0d72f451e9ab\n\n## How to test?\n1. run synthrace scenario `degraded_logs` in live mode\n```\nnode scripts/synthtrace degraded_logs --live\n```\n2. Open dataset quality page (/app/management/data/data_quality)\n3. Select `synth.3` dataset\n(/app/management/data/data_quality/details?pageState=(dataStream:logs-synth.3-default)\n4. Click on `Actions` and then select `Create rule`\n5. Fill out the alert form\n6. Go to `Observability > Alerts` or `Stack management > Alerts`\n(/app/observability/alerts)\n\n## Release note\nAdds the Create alert rule action to dataset quality page and dataset\nquality details. This allows you to generate an alert when the\npercentage of degraded docs on the chart crosses a certain threshold.\n\n---------\n\nCo-authored-by: kibanamachine <[email protected]>\nCo-authored-by: Aleh Zasypkin <[email protected]>\nCo-authored-by: Faisal Kanout <[email protected]>","sha":"64df229998b0db7e5d381c847e60c0d39e6c3120"}},{"branch":"8.19","label":"v8.19.0","branchLabelMappingKey":"^v(\\d+).(\\d+).\\d+$","isSourceBranch":false,"state":"NOT_CREATED"}]}] BACKPORT--> --------- Co-authored-by: kibanamachine <[email protected]>
1 parent c05e189 commit 1a477b3

File tree

59 files changed

+2968
-118
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

59 files changed

+2968
-118
lines changed
Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
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", the "GNU Affero General Public License v3.0 only", and the "Server Side
5+
* Public License v 1"; you may not use this file except in compliance with, at
6+
* your election, the "Elastic License 2.0", the "GNU Affero General Public
7+
* License v3.0 only", or the "Server Side Public License, v 1".
8+
*/
9+
// ---------------------------------- WARNING ----------------------------------
10+
// this file was generated, and should not be edited by hand
11+
// ---------------------------------- WARNING ----------------------------------
12+
import * as rt from 'io-ts';
13+
import type { Either } from 'fp-ts/lib/Either';
14+
import { AlertSchema } from './alert_schema';
15+
import { EcsSchema } from './ecs_schema';
16+
const ISO_DATE_PATTERN = /^d{4}-d{2}-d{2}Td{2}:d{2}:d{2}.d{3}Z$/;
17+
export const IsoDateString = new rt.Type<string, string, unknown>(
18+
'IsoDateString',
19+
rt.string.is,
20+
(input, context): Either<rt.Errors, string> => {
21+
if (typeof input === 'string' && ISO_DATE_PATTERN.test(input)) {
22+
return rt.success(input);
23+
} else {
24+
return rt.failure(input, context);
25+
}
26+
},
27+
rt.identity
28+
);
29+
export type IsoDateStringC = typeof IsoDateString;
30+
export const schemaUnknown = rt.unknown;
31+
export const schemaUnknownArray = rt.array(rt.unknown);
32+
export const schemaString = rt.string;
33+
export const schemaStringArray = rt.array(schemaString);
34+
export const schemaNumber = rt.number;
35+
export const schemaNumberArray = rt.array(schemaNumber);
36+
export const schemaDate = rt.union([IsoDateString, schemaNumber]);
37+
export const schemaDateArray = rt.array(schemaDate);
38+
export const schemaDateRange = rt.partial({
39+
gte: schemaDate,
40+
lte: schemaDate,
41+
});
42+
export const schemaDateRangeArray = rt.array(schemaDateRange);
43+
export const schemaStringOrNumber = rt.union([schemaString, schemaNumber]);
44+
export const schemaStringOrNumberArray = rt.array(schemaStringOrNumber);
45+
export const schemaBoolean = rt.boolean;
46+
export const schemaBooleanArray = rt.array(schemaBoolean);
47+
const schemaGeoPointCoords = rt.type({
48+
type: schemaString,
49+
coordinates: schemaNumberArray,
50+
});
51+
const schemaGeoPointString = schemaString;
52+
const schemaGeoPointLatLon = rt.type({
53+
lat: schemaNumber,
54+
lon: schemaNumber,
55+
});
56+
const schemaGeoPointLocation = rt.type({
57+
location: schemaNumberArray,
58+
});
59+
const schemaGeoPointLocationString = rt.type({
60+
location: schemaString,
61+
});
62+
export const schemaGeoPoint = rt.union([
63+
schemaGeoPointCoords,
64+
schemaGeoPointString,
65+
schemaGeoPointLatLon,
66+
schemaGeoPointLocation,
67+
schemaGeoPointLocationString,
68+
]);
69+
export const schemaGeoPointArray = rt.array(schemaGeoPoint);
70+
// prettier-ignore
71+
const DatasetQualityAlertRequired = rt.type({
72+
});
73+
// prettier-ignore
74+
const DatasetQualityAlertOptional = rt.partial({
75+
'kibana.alert.evaluation.threshold': schemaStringOrNumber,
76+
'kibana.alert.evaluation.value': schemaString,
77+
'kibana.alert.grouping': schemaUnknown,
78+
'kibana.alert.reason': schemaString,
79+
});
80+
81+
// prettier-ignore
82+
export const DatasetQualityAlertSchema = rt.intersection([DatasetQualityAlertRequired, DatasetQualityAlertOptional, AlertSchema, EcsSchema]);
83+
// prettier-ignore
84+
export type DatasetQualityAlert = rt.TypeOf<typeof DatasetQualityAlertSchema>;

src/platform/packages/shared/kbn-router-utils/src/get_router_link_props/index.ts

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,19 +9,18 @@
99

1010
export interface RouterLinkProps {
1111
href: string | undefined;
12-
onClick: (event: React.MouseEvent<HTMLAnchorElement | HTMLButtonElement, MouseEvent>) => void;
12+
onClick: (event: React.MouseEvent<Element, MouseEvent>) => void;
1313
}
1414

1515
interface GetRouterLinkPropsDeps {
1616
href?: string;
17-
onClick(event: React.MouseEvent<HTMLAnchorElement | HTMLButtonElement>): void;
17+
onClick(event: React.MouseEvent<Element, MouseEvent>): void;
1818
}
1919

20-
const isModifiedEvent = (event: React.MouseEvent<HTMLAnchorElement | HTMLButtonElement>) =>
20+
const isModifiedEvent = (event: React.MouseEvent<Element, MouseEvent>) =>
2121
!!(event.metaKey || event.altKey || event.ctrlKey || event.shiftKey);
2222

23-
const isLeftClickEvent = (event: React.MouseEvent<HTMLAnchorElement | HTMLButtonElement>) =>
24-
event.button === 0;
23+
const isLeftClickEvent = (event: React.MouseEvent<Element, MouseEvent>) => event.button === 0;
2524

2625
/**
2726
*
@@ -36,7 +35,7 @@ const isLeftClickEvent = (event: React.MouseEvent<HTMLAnchorElement | HTMLButton
3635
* manage behaviours such as leftClickEvent and event with modifiers (Ctrl, Shift, etc)
3736
*/
3837
export const getRouterLinkProps = ({ href, onClick }: GetRouterLinkPropsDeps): RouterLinkProps => {
39-
const guardedClickHandler = (event: React.MouseEvent<HTMLAnchorElement | HTMLButtonElement>) => {
38+
const guardedClickHandler = (event: React.MouseEvent<Element, MouseEvent>) => {
4039
if (event.defaultPrevented) {
4140
return;
4241
}

src/platform/packages/shared/kbn-rule-data-utils/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,3 +16,4 @@ export * from './src/alerts_as_data_status';
1616
export * from './src/alerts_as_data_cases';
1717
export * from './src/routes/stack_rule_paths';
1818
export * from './src/rule_types';
19+
export * from './src/rule_constants';
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
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", the "GNU Affero General Public License v3.0 only", and the "Server Side
5+
* Public License v 1"; you may not use this file except in compliance with, at
6+
* your election, the "Elastic License 2.0", the "GNU Affero General Public
7+
* License v3.0 only", or the "Server Side Public License, v 1".
8+
*/
9+
10+
export const ALERT_KEY_JOINER = ',';

src/platform/packages/shared/kbn-rule-data-utils/src/rule_types/stack_rules.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@ export const STACK_ALERTS_FEATURE_ID = 'stackAlerts';
1111
export const ES_QUERY_ID = '.es-query';
1212
export const ML_ANOMALY_DETECTION_RULE_TYPE_ID = 'xpack.ml.anomaly_detection_alert';
1313

14+
export const DEGRADED_DOCS_RULE_TYPE_ID = 'datasetQuality.degradedDocs';
15+
1416
/**
1517
* These rule types are not the only stack rules. There are more.
1618
* The variable holds all stack rule types that support multiple
@@ -19,4 +21,5 @@ export const ML_ANOMALY_DETECTION_RULE_TYPE_ID = 'xpack.ml.anomaly_detection_ale
1921
export const STACK_RULE_TYPE_IDS_SUPPORTED_BY_OBSERVABILITY = [
2022
ES_QUERY_ID,
2123
ML_ANOMALY_DETECTION_RULE_TYPE_ID,
24+
DEGRADED_DOCS_RULE_TYPE_ID,
2225
];
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
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", the "GNU Affero General Public License v3.0 only", and the "Server Side
5+
* Public License v 1"; you may not use this file except in compliance with, at
6+
* your election, the "Elastic License 2.0", the "GNU Affero General Public
7+
* License v3.0 only", or the "Server Side Public License, v 1".
8+
*/
9+
10+
export { degradedDocsParamsSchema } from './latest';
11+
12+
export type { DegradedDocsRuleParams } from './latest';
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
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", the "GNU Affero General Public License v3.0 only", and the "Server Side
5+
* Public License v 1"; you may not use this file except in compliance with, at
6+
* your election, the "Elastic License 2.0", the "GNU Affero General Public
7+
* License v3.0 only", or the "Server Side Public License, v 1".
8+
*/
9+
10+
export * from './v1';
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
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", the "GNU Affero General Public License v3.0 only", and the "Server Side
5+
* Public License v 1"; you may not use this file except in compliance with, at
6+
* your election, the "Elastic License 2.0", the "GNU Affero General Public
7+
* License v3.0 only", or the "Server Side Public License, v 1".
8+
*/
9+
10+
import { COMPARATORS } from '@kbn/alerting-comparators';
11+
import type { TypeOf } from '@kbn/config-schema';
12+
import { schema } from '@kbn/config-schema';
13+
import { oneOfLiterals } from '../common/utils';
14+
15+
const comparators = Object.values(COMPARATORS);
16+
17+
const searchConfigSchema = schema.object({
18+
index: schema.string(),
19+
});
20+
21+
export const degradedDocsParamsSchema = schema.object({
22+
timeUnit: schema.string(),
23+
timeSize: schema.number(),
24+
threshold: schema.arrayOf(schema.number()),
25+
comparator: oneOfLiterals(comparators),
26+
groupBy: schema.maybe(schema.arrayOf(schema.string())),
27+
searchConfiguration: searchConfigSchema,
28+
});
29+
30+
export type DegradedDocsRuleParams = TypeOf<typeof degradedDocsParamsSchema>;

x-pack/platform/plugins/shared/alerting/server/integration_tests/__snapshots__/alert_as_data_fields.test.ts.snap

Lines changed: 40 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

x-pack/platform/plugins/shared/alerting/server/integration_tests/alert_as_data_fields.test.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@ const ruleTypes: string[] = [
6464
'siem.thresholdRule',
6565
'siem.newTermsRule',
6666
'siem.notifications',
67+
'datasetQuality.degradedDocs',
6768
];
6869

6970
describe('Alert as data fields checks', () => {

0 commit comments

Comments
 (0)