From 3aa5c018c4bdcddb0101966e1a55e242d3dd920d Mon Sep 17 00:00:00 2001 From: Walter Rafelsberger Date: Tue, 9 Apr 2024 09:59:55 +0200 Subject: [PATCH 1/8] types cleanup --- x-pack/plugins/transform/common/constants.ts | 38 +++++++++++- .../transform/common/types/transform_stats.ts | 61 +++---------------- .../app/common/reauthorization_utils.ts | 5 +- .../expanded_row_health_pane.tsx | 7 ++- .../transform_health_colored_dot.tsx | 4 +- .../transform_search_bar_filters.tsx | 4 +- .../components/transform_list/use_columns.tsx | 4 +- .../register_transform_health_rule_type.ts | 4 +- .../transform_health_service.ts | 7 ++- 9 files changed, 66 insertions(+), 68 deletions(-) diff --git a/x-pack/plugins/transform/common/constants.ts b/x-pack/plugins/transform/common/constants.ts index bc6e87295ea7a..00eeffa27c0bb 100644 --- a/x-pack/plugins/transform/common/constants.ts +++ b/x-pack/plugins/transform/common/constants.ts @@ -103,48 +103,82 @@ export const TRANSFORM_STATE = { export type TransformState = typeof TRANSFORM_STATE[keyof typeof TRANSFORM_STATE]; -export const TRANSFORM_HEALTH = { +export const TRANSFORM_HEALTH_STATUS = { + GREEN: 'GREEN', green: 'green', + UNKNOWN: 'UNKNOWN', unknown: 'unknown', + YELLOW: 'YELLOW', yellow: 'yellow', + RED: 'RED', red: 'red', } as const; -export type TransformHealth = typeof TRANSFORM_HEALTH[keyof typeof TRANSFORM_HEALTH]; +export type TransformHealthStatus = + typeof TRANSFORM_HEALTH_STATUS[keyof typeof TRANSFORM_HEALTH_STATUS]; export const TRANSFORM_HEALTH_COLOR = { + GREEN: 'success', green: 'success', + UNKNOWN: 'subdued', unknown: 'subdued', + YELLOW: 'warning', yellow: 'warning', + RED: 'danger', red: 'danger', } as const; export const TRANSFORM_HEALTH_LABEL = { + GREEN: i18n.translate('xpack.transform.transformHealth.greenLabel', { + defaultMessage: 'Healthy', + }), green: i18n.translate('xpack.transform.transformHealth.greenLabel', { defaultMessage: 'Healthy', }), + UNKNOWN: i18n.translate('xpack.transform.transformHealth.unknownLabel', { + defaultMessage: 'Unknown', + }), unknown: i18n.translate('xpack.transform.transformHealth.unknownLabel', { defaultMessage: 'Unknown', }), + YELLOW: i18n.translate('xpack.transform.transformHealth.yellowLabel', { + defaultMessage: 'Degraded', + }), yellow: i18n.translate('xpack.transform.transformHealth.yellowLabel', { defaultMessage: 'Degraded', }), + RED: i18n.translate('xpack.transform.transformHealth.redLabel', { + defaultMessage: 'Unavailable', + }), red: i18n.translate('xpack.transform.transformHealth.redLabel', { defaultMessage: 'Unavailable', }), } as const; export const TRANSFORM_HEALTH_DESCRIPTION = { + GREEN: i18n.translate('xpack.transform.transformHealth.greenDescription', { + defaultMessage: 'The transform is running as expected.', + }), green: i18n.translate('xpack.transform.transformHealth.greenDescription', { defaultMessage: 'The transform is running as expected.', }), + UNKNOWN: i18n.translate('xpack.transform.transformHealth.unknownDescription', { + defaultMessage: 'The health of the transform could not be determined.', + }), unknown: i18n.translate('xpack.transform.transformHealth.unknownDescription', { defaultMessage: 'The health of the transform could not be determined.', }), + YELLOW: i18n.translate('xpack.transform.transformHealth.yellowDescription', { + defaultMessage: + 'The functionality of the transform is in a degraded state and may need remediation to avoid the health becoming red.', + }), yellow: i18n.translate('xpack.transform.transformHealth.yellowDescription', { defaultMessage: 'The functionality of the transform is in a degraded state and may need remediation to avoid the health becoming red.', }), + RED: i18n.translate('xpack.transform.transformHealth.redDescription', { + defaultMessage: 'The transform is experiencing an outage or is unavailable for use.', + }), red: i18n.translate('xpack.transform.transformHealth.redDescription', { defaultMessage: 'The transform is experiencing an outage or is unavailable for use.', }), diff --git a/x-pack/plugins/transform/common/types/transform_stats.ts b/x-pack/plugins/transform/common/types/transform_stats.ts index a250616da8a73..5b846055dc941 100644 --- a/x-pack/plugins/transform/common/types/transform_stats.ts +++ b/x-pack/plugins/transform/common/types/transform_stats.ts @@ -5,10 +5,11 @@ * 2.0. */ +import type * as estypes from '@elastic/elasticsearch/lib/api/typesWithBodyKey'; + import { isPopulatedObject } from '@kbn/ml-is-populated-object'; -import { type TransformHealth, type TransformState, TRANSFORM_STATE } from '../constants'; -import type { TransformId } from './transform'; +import { type TransformState, TRANSFORM_STATE } from '../constants'; export interface TransformHealthIssue { type: string; @@ -18,56 +19,12 @@ export interface TransformHealthIssue { first_occurrence?: number; } -export interface TransformStats { - id: TransformId; - checkpointing: { - last: { - checkpoint: number; - timestamp_millis?: number; - }; - next?: { - checkpoint: number; - checkpoint_progress?: { - total_docs: number; - docs_remaining: number; - percent_complete: number; - }; - }; - changes_last_detected_at: number; - last_search_time?: number; - operations_behind?: number; - }; - health: { - status: TransformHealth; - issues?: TransformHealthIssue[]; - }; - node?: { - id: string; - name: string; - ephemeral_id: string; - transport_address: string; - attributes: Record; - }; - stats: { - delete_time_in_ms: number; - documents_deleted: number; - documents_indexed: number; - documents_processed: number; - index_failures: number; - index_time_in_ms: number; - index_total: number; - pages_processed: number; - search_failures: number; - search_time_in_ms: number; - search_total: number; - trigger_count: number; - processing_time_in_ms: number; - processing_total: number; - exponential_avg_checkpoint_duration_ms: number; - exponential_avg_documents_indexed: number; - exponential_avg_documents_processed: number; - }; - reason?: string; +export interface TransformHealth extends estypes.TransformGetTransformStatsTransformStatsHealth { + issues?: TransformHealthIssue[]; +} + +export interface TransformStats extends estypes.TransformGetTransformStatsTransformStats { + health?: TransformHealth; state: TransformState; } diff --git a/x-pack/plugins/transform/public/app/common/reauthorization_utils.ts b/x-pack/plugins/transform/public/app/common/reauthorization_utils.ts index d32383ccd683e..cd80f99ee1bf3 100644 --- a/x-pack/plugins/transform/public/app/common/reauthorization_utils.ts +++ b/x-pack/plugins/transform/public/app/common/reauthorization_utils.ts @@ -7,14 +7,15 @@ import { isPopulatedObject } from '@kbn/ml-is-populated-object'; import type { TransformHealthIssue } from '../../../common/types/transform_stats'; -import { TRANSFORM_HEALTH } from '../../../common/constants'; +import { TRANSFORM_HEALTH_STATUS } from '../../../common/constants'; import type { TransformListRow } from './transform_list'; export const needsReauthorization = (transform: Partial) => { return ( isPopulatedObject(transform.config?.authorization, ['api_key']) && isPopulatedObject(transform.stats) && - transform.stats.health.status === TRANSFORM_HEALTH.red && + isPopulatedObject(transform.stats.health) && + transform.stats.health.status === TRANSFORM_HEALTH_STATUS.red && transform.stats.health.issues?.find( (issue) => (issue as TransformHealthIssue).issue === 'Privileges check failed' ) !== undefined diff --git a/x-pack/plugins/transform/public/app/sections/transform_management/components/transform_list/expanded_row_health_pane.tsx b/x-pack/plugins/transform/public/app/sections/transform_management/components/transform_list/expanded_row_health_pane.tsx index 3a088d5a9b273..af4aaa3aa95ba 100644 --- a/x-pack/plugins/transform/public/app/sections/transform_management/components/transform_list/expanded_row_health_pane.tsx +++ b/x-pack/plugins/transform/public/app/sections/transform_management/components/transform_list/expanded_row_health_pane.tsx @@ -16,6 +16,10 @@ import type { TransformHealthIssue, TransformStats, } from '../../../../../../common/types/transform_stats'; +import { + type TransformHealthStatus, + TRANSFORM_HEALTH_STATUS, +} from '../../../../../../common/constants'; import { TransformHealthColoredDot } from './transform_health_colored_dot'; @@ -24,7 +28,8 @@ interface ExpandedRowHealthPaneProps { } export const ExpandedRowHealthPane: FC = ({ health }) => { - const { status, issues } = health; + const status: TransformHealthStatus = health?.status ?? TRANSFORM_HEALTH_STATUS.UNKNOWN; + const issues = health?.issues; const sorting = { sort: { diff --git a/x-pack/plugins/transform/public/app/sections/transform_management/components/transform_list/transform_health_colored_dot.tsx b/x-pack/plugins/transform/public/app/sections/transform_management/components/transform_list/transform_health_colored_dot.tsx index 632e5ee1c6bbd..9d151ca7b8deb 100644 --- a/x-pack/plugins/transform/public/app/sections/transform_management/components/transform_list/transform_health_colored_dot.tsx +++ b/x-pack/plugins/transform/public/app/sections/transform_management/components/transform_list/transform_health_colored_dot.tsx @@ -10,14 +10,14 @@ import React, { type FC } from 'react'; import { EuiHealth, EuiToolTip } from '@elastic/eui'; import { - type TransformHealth, + type TransformHealthStatus, TRANSFORM_HEALTH_COLOR, TRANSFORM_HEALTH_DESCRIPTION, TRANSFORM_HEALTH_LABEL, } from '../../../../../../common/constants'; interface TransformHealthProps { - healthStatus: TransformHealth; + healthStatus: TransformHealthStatus; compact?: boolean; showToolTip?: boolean; } diff --git a/x-pack/plugins/transform/public/app/sections/transform_management/components/transform_list/transform_search_bar_filters.tsx b/x-pack/plugins/transform/public/app/sections/transform_management/components/transform_list/transform_search_bar_filters.tsx index 09fb5cb049ac4..c60c302d86e06 100644 --- a/x-pack/plugins/transform/public/app/sections/transform_management/components/transform_list/transform_search_bar_filters.tsx +++ b/x-pack/plugins/transform/public/app/sections/transform_management/components/transform_list/transform_search_bar_filters.tsx @@ -14,7 +14,7 @@ import { TRANSFORM_FUNCTION, TRANSFORM_MODE, TRANSFORM_STATE, - TRANSFORM_HEALTH, + TRANSFORM_HEALTH_STATUS, } from '../../../../../../common/constants'; import { isLatestTransform, isPivotTransform } from '../../../../../../common/types/transform'; import type { TransformListRow } from '../../../../common'; @@ -53,7 +53,7 @@ export const transformFilters: SearchFilterConfig[] = [ field: 'health', name: i18n.translate('xpack.transform.healthFilter', { defaultMessage: 'Health' }), multiSelect: false, - options: Object.values(TRANSFORM_HEALTH).map((val) => ({ + options: Object.values(TRANSFORM_HEALTH_STATUS).map((val) => ({ value: val, name: val, view: , diff --git a/x-pack/plugins/transform/public/app/sections/transform_management/components/transform_list/use_columns.tsx b/x-pack/plugins/transform/public/app/sections/transform_management/components/transform_list/use_columns.tsx index 55941929009b3..7348cd560cdac 100644 --- a/x-pack/plugins/transform/public/app/sections/transform_management/components/transform_list/use_columns.tsx +++ b/x-pack/plugins/transform/public/app/sections/transform_management/components/transform_list/use_columns.tsx @@ -349,10 +349,10 @@ export const useColumns = ( { name: i18n.translate('xpack.transform.health', { defaultMessage: 'Health' }), 'data-test-subj': 'transformListColumnHealth', - sortable: (item: TransformListRow) => item.stats?.health.status, + sortable: (item: TransformListRow) => item.stats?.health?.status, truncateText: true, render(item: TransformListRow) { - return item.stats ? ( + return item.stats && item.stats.health ? ( ) : ( diff --git a/x-pack/plugins/transform/server/lib/alerting/transform_health_rule_type/register_transform_health_rule_type.ts b/x-pack/plugins/transform/server/lib/alerting/transform_health_rule_type/register_transform_health_rule_type.ts index dc4a9391bdeac..ac04ff6a7662e 100644 --- a/x-pack/plugins/transform/server/lib/alerting/transform_health_rule_type/register_transform_health_rule_type.ts +++ b/x-pack/plugins/transform/server/lib/alerting/transform_health_rule_type/register_transform_health_rule_type.ts @@ -27,7 +27,7 @@ import { ALERT_REASON } from '@kbn/rule-data-utils'; import { ES_FIELD_TYPES } from '@kbn/field-types'; import { PLUGIN, - type TransformHealth, + type TransformHealthStatus, TRANSFORM_RULE_TYPE, TRANSFORM_HEALTH_RESULTS, } from '../../../../common/constants'; @@ -38,7 +38,7 @@ import { transformHealthServiceProvider } from './transform_health_service'; export interface BaseTransformAlertResponse { transform_id: string; description?: string; - health_status: TransformHealth; + health_status: TransformHealthStatus; issues?: Array<{ issue: string; details?: string; count: number; first_occurrence?: string }>; } diff --git a/x-pack/plugins/transform/server/lib/alerting/transform_health_rule_type/transform_health_service.ts b/x-pack/plugins/transform/server/lib/alerting/transform_health_rule_type/transform_health_service.ts index 313717e54debb..2234523cd7658 100644 --- a/x-pack/plugins/transform/server/lib/alerting/transform_health_rule_type/transform_health_service.ts +++ b/x-pack/plugins/transform/server/lib/alerting/transform_health_rule_type/transform_health_service.ts @@ -13,6 +13,7 @@ import type { RulesClient } from '@kbn/alerting-plugin/server'; import type { FieldFormatsRegistry } from '@kbn/field-formats-plugin/common'; import { FIELD_FORMAT_IDS } from '@kbn/field-formats-plugin/common'; import type { TransformStats } from '../../../../common/types/transform_stats'; +import { TRANSFORM_HEALTH_STATUS } from '../../../../common/constants'; import type { TransformHealthRuleParams } from './schema'; import { ALL_TRANSFORMS_SELECTION, @@ -116,8 +117,8 @@ export function transformHealthServiceProvider({ description: transformsDict.get(transformStats.id)?.description, transform_state: transformStats.state, node_name: transformStats.node?.name, - health_status: transformStats.health.status, - ...(transformStats.health.issues + health_status: transformStats.health?.status ?? TRANSFORM_HEALTH_STATUS.UNKNOWN, + ...(transformStats.health?.issues ? { issues: transformStats.health.issues.map((issue) => { return { @@ -238,7 +239,7 @@ export function transformHealthServiceProvider({ const transformsStats = await getTransformStats(transformIds); return transformsStats - .filter((t) => t.health.status !== 'green') + .filter((t) => t.health?.status !== TRANSFORM_HEALTH_STATUS.green) .map(baseTransformAlertResponseFormatter); }, /** From ee682fb10cbab7f3bef32bcd071834b74baab2c9 Mon Sep 17 00:00:00 2001 From: Walter Rafelsberger Date: Tue, 9 Apr 2024 09:42:24 +0200 Subject: [PATCH 2/8] clean up health status --- x-pack/plugins/transform/common/constants.ts | 50 +++++-------------- .../app/common/reauthorization_utils.ts | 8 ++- .../expanded_row_health_pane.tsx | 10 ++-- .../components/transform_list/use_columns.tsx | 9 +++- .../transform_health_service.ts | 3 +- 5 files changed, 31 insertions(+), 49 deletions(-) diff --git a/x-pack/plugins/transform/common/constants.ts b/x-pack/plugins/transform/common/constants.ts index 00eeffa27c0bb..d2dc774072df3 100644 --- a/x-pack/plugins/transform/common/constants.ts +++ b/x-pack/plugins/transform/common/constants.ts @@ -5,8 +5,9 @@ * 2.0. */ -import { i18n } from '@kbn/i18n'; +import type * as estypes from '@elastic/elasticsearch/lib/api/typesWithBodyKey'; +import { i18n } from '@kbn/i18n'; import type { LicenseType } from '@kbn/licensing-plugin/common/types'; import { ALERT_NAMESPACE } from '@kbn/rule-data-utils'; import type { TransformHealthTests } from './types/alerting'; @@ -104,81 +105,54 @@ export const TRANSFORM_STATE = { export type TransformState = typeof TRANSFORM_STATE[keyof typeof TRANSFORM_STATE]; export const TRANSFORM_HEALTH_STATUS = { - GREEN: 'GREEN', green: 'green', - UNKNOWN: 'UNKNOWN', - unknown: 'unknown', - YELLOW: 'YELLOW', yellow: 'yellow', - RED: 'RED', red: 'red', + unknown: 'unknown', } as const; - -export type TransformHealthStatus = - typeof TRANSFORM_HEALTH_STATUS[keyof typeof TRANSFORM_HEALTH_STATUS]; +export type TransformHealthStatus = keyof typeof TRANSFORM_HEALTH_STATUS; +export const isTransformHealthStatus = (arg: unknown): arg is TransformHealthStatus => + typeof arg === 'string' && Object.keys(TRANSFORM_HEALTH_STATUS).includes(arg); +export const mapEsHealthStatus2TransformHealthStatus = ( + healthStatus?: estypes.HealthStatus +): TransformHealthStatus => + typeof healthStatus === 'string' && isTransformHealthStatus(healthStatus.toLowerCase()) + ? (healthStatus.toLowerCase() as TransformHealthStatus) + : 'unknown'; export const TRANSFORM_HEALTH_COLOR = { - GREEN: 'success', green: 'success', - UNKNOWN: 'subdued', unknown: 'subdued', - YELLOW: 'warning', yellow: 'warning', - RED: 'danger', red: 'danger', } as const; export const TRANSFORM_HEALTH_LABEL = { - GREEN: i18n.translate('xpack.transform.transformHealth.greenLabel', { - defaultMessage: 'Healthy', - }), green: i18n.translate('xpack.transform.transformHealth.greenLabel', { defaultMessage: 'Healthy', }), - UNKNOWN: i18n.translate('xpack.transform.transformHealth.unknownLabel', { - defaultMessage: 'Unknown', - }), unknown: i18n.translate('xpack.transform.transformHealth.unknownLabel', { defaultMessage: 'Unknown', }), - YELLOW: i18n.translate('xpack.transform.transformHealth.yellowLabel', { - defaultMessage: 'Degraded', - }), yellow: i18n.translate('xpack.transform.transformHealth.yellowLabel', { defaultMessage: 'Degraded', }), - RED: i18n.translate('xpack.transform.transformHealth.redLabel', { - defaultMessage: 'Unavailable', - }), red: i18n.translate('xpack.transform.transformHealth.redLabel', { defaultMessage: 'Unavailable', }), } as const; export const TRANSFORM_HEALTH_DESCRIPTION = { - GREEN: i18n.translate('xpack.transform.transformHealth.greenDescription', { - defaultMessage: 'The transform is running as expected.', - }), green: i18n.translate('xpack.transform.transformHealth.greenDescription', { defaultMessage: 'The transform is running as expected.', }), - UNKNOWN: i18n.translate('xpack.transform.transformHealth.unknownDescription', { - defaultMessage: 'The health of the transform could not be determined.', - }), unknown: i18n.translate('xpack.transform.transformHealth.unknownDescription', { defaultMessage: 'The health of the transform could not be determined.', }), - YELLOW: i18n.translate('xpack.transform.transformHealth.yellowDescription', { - defaultMessage: - 'The functionality of the transform is in a degraded state and may need remediation to avoid the health becoming red.', - }), yellow: i18n.translate('xpack.transform.transformHealth.yellowDescription', { defaultMessage: 'The functionality of the transform is in a degraded state and may need remediation to avoid the health becoming red.', }), - RED: i18n.translate('xpack.transform.transformHealth.redDescription', { - defaultMessage: 'The transform is experiencing an outage or is unavailable for use.', - }), red: i18n.translate('xpack.transform.transformHealth.redDescription', { defaultMessage: 'The transform is experiencing an outage or is unavailable for use.', }), diff --git a/x-pack/plugins/transform/public/app/common/reauthorization_utils.ts b/x-pack/plugins/transform/public/app/common/reauthorization_utils.ts index cd80f99ee1bf3..26dee745a4b99 100644 --- a/x-pack/plugins/transform/public/app/common/reauthorization_utils.ts +++ b/x-pack/plugins/transform/public/app/common/reauthorization_utils.ts @@ -7,7 +7,10 @@ import { isPopulatedObject } from '@kbn/ml-is-populated-object'; import type { TransformHealthIssue } from '../../../common/types/transform_stats'; -import { TRANSFORM_HEALTH_STATUS } from '../../../common/constants'; +import { + mapEsHealthStatus2TransformHealthStatus, + TRANSFORM_HEALTH_STATUS, +} from '../../../common/constants'; import type { TransformListRow } from './transform_list'; export const needsReauthorization = (transform: Partial) => { @@ -15,7 +18,8 @@ export const needsReauthorization = (transform: Partial) => { isPopulatedObject(transform.config?.authorization, ['api_key']) && isPopulatedObject(transform.stats) && isPopulatedObject(transform.stats.health) && - transform.stats.health.status === TRANSFORM_HEALTH_STATUS.red && + mapEsHealthStatus2TransformHealthStatus(transform.stats.health.status) === + TRANSFORM_HEALTH_STATUS.red && transform.stats.health.issues?.find( (issue) => (issue as TransformHealthIssue).issue === 'Privileges check failed' ) !== undefined diff --git a/x-pack/plugins/transform/public/app/sections/transform_management/components/transform_list/expanded_row_health_pane.tsx b/x-pack/plugins/transform/public/app/sections/transform_management/components/transform_list/expanded_row_health_pane.tsx index af4aaa3aa95ba..2741efc8b143f 100644 --- a/x-pack/plugins/transform/public/app/sections/transform_management/components/transform_list/expanded_row_health_pane.tsx +++ b/x-pack/plugins/transform/public/app/sections/transform_management/components/transform_list/expanded_row_health_pane.tsx @@ -16,10 +16,8 @@ import type { TransformHealthIssue, TransformStats, } from '../../../../../../common/types/transform_stats'; -import { - type TransformHealthStatus, - TRANSFORM_HEALTH_STATUS, -} from '../../../../../../common/constants'; + +import { mapEsHealthStatus2TransformHealthStatus } from '../../../../../../common/constants'; import { TransformHealthColoredDot } from './transform_health_colored_dot'; @@ -28,7 +26,7 @@ interface ExpandedRowHealthPaneProps { } export const ExpandedRowHealthPane: FC = ({ health }) => { - const status: TransformHealthStatus = health?.status ?? TRANSFORM_HEALTH_STATUS.UNKNOWN; + const healthStatus = mapEsHealthStatus2TransformHealthStatus(health?.status); const issues = health?.issues; const sorting = { @@ -85,7 +83,7 @@ export const ExpandedRowHealthPane: FC = ({ health } data-test-subj="transformHealthTabContent" > - + {Array.isArray(issues) && issues.length > 0 && ( <> diff --git a/x-pack/plugins/transform/public/app/sections/transform_management/components/transform_list/use_columns.tsx b/x-pack/plugins/transform/public/app/sections/transform_management/components/transform_list/use_columns.tsx index 7348cd560cdac..42dd77b6dd41e 100644 --- a/x-pack/plugins/transform/public/app/sections/transform_management/components/transform_list/use_columns.tsx +++ b/x-pack/plugins/transform/public/app/sections/transform_management/components/transform_list/use_columns.tsx @@ -31,7 +31,10 @@ import { useTransformCapabilities } from '../../../../hooks'; import { needsReauthorization } from '../../../../common/reauthorization_utils'; import type { TransformId } from '../../../../../../common/types/transform'; import { isLatestTransform, isPivotTransform } from '../../../../../../common/types/transform'; -import { TRANSFORM_STATE } from '../../../../../../common/constants'; +import { + mapEsHealthStatus2TransformHealthStatus, + TRANSFORM_STATE, +} from '../../../../../../common/constants'; import type { TransformListRow } from '../../../../common'; import { getTransformProgress, TRANSFORM_LIST_COLUMN } from '../../../../common'; @@ -353,7 +356,9 @@ export const useColumns = ( truncateText: true, render(item: TransformListRow) { return item.stats && item.stats.health ? ( - + ) : ( ); diff --git a/x-pack/plugins/transform/server/lib/alerting/transform_health_rule_type/transform_health_service.ts b/x-pack/plugins/transform/server/lib/alerting/transform_health_rule_type/transform_health_service.ts index 2234523cd7658..c0c3bba984c9a 100644 --- a/x-pack/plugins/transform/server/lib/alerting/transform_health_rule_type/transform_health_service.ts +++ b/x-pack/plugins/transform/server/lib/alerting/transform_health_rule_type/transform_health_service.ts @@ -16,6 +16,7 @@ import type { TransformStats } from '../../../../common/types/transform_stats'; import { TRANSFORM_HEALTH_STATUS } from '../../../../common/constants'; import type { TransformHealthRuleParams } from './schema'; import { + mapEsHealthStatus2TransformHealthStatus, ALL_TRANSFORMS_SELECTION, TRANSFORM_HEALTH_CHECK_NAMES, TRANSFORM_NOTIFICATIONS_INDEX, @@ -117,7 +118,7 @@ export function transformHealthServiceProvider({ description: transformsDict.get(transformStats.id)?.description, transform_state: transformStats.state, node_name: transformStats.node?.name, - health_status: transformStats.health?.status ?? TRANSFORM_HEALTH_STATUS.UNKNOWN, + health_status: mapEsHealthStatus2TransformHealthStatus(transformStats.health?.status), ...(transformStats.health?.issues ? { issues: transformStats.health.issues.map((issue) => { From ead07ffc93b878a10923ae5a0d54478f42bf4200 Mon Sep 17 00:00:00 2001 From: Walter Rafelsberger Date: Tue, 9 Apr 2024 09:47:52 +0200 Subject: [PATCH 3/8] adds jest test for mapEsHealthStatus2TransformHealthStatus --- .../transform/common/constants.test.ts | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 x-pack/plugins/transform/common/constants.test.ts diff --git a/x-pack/plugins/transform/common/constants.test.ts b/x-pack/plugins/transform/common/constants.test.ts new file mode 100644 index 0000000000000..50d6aceb12e58 --- /dev/null +++ b/x-pack/plugins/transform/common/constants.test.ts @@ -0,0 +1,20 @@ +/* + * 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 { mapEsHealthStatus2TransformHealthStatus } from './constants'; + +describe('mapEsHealthStatus2TransformHealthStatus', () => { + it('maps estypes HealthStatus to TransformHealthStatus', () => { + expect(mapEsHealthStatus2TransformHealthStatus(undefined)).toBe('unknown'); + expect(mapEsHealthStatus2TransformHealthStatus('green')).toBe('green'); + expect(mapEsHealthStatus2TransformHealthStatus('GREEN')).toBe('green'); + expect(mapEsHealthStatus2TransformHealthStatus('yellow')).toBe('yellow'); + expect(mapEsHealthStatus2TransformHealthStatus('YELLOW')).toBe('yellow'); + expect(mapEsHealthStatus2TransformHealthStatus('red')).toBe('red'); + expect(mapEsHealthStatus2TransformHealthStatus('RED')).toBe('red'); + }); +}); From 21cb5f807abc3abe40d39388fbd04ac71e03b053 Mon Sep 17 00:00:00 2001 From: Walter Rafelsberger Date: Tue, 9 Apr 2024 10:12:59 +0200 Subject: [PATCH 4/8] tweaks --- .../components/transform_list/use_columns.tsx | 2 +- .../transform_health_rule_type/transform_health_service.ts | 6 +++++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/x-pack/plugins/transform/public/app/sections/transform_management/components/transform_list/use_columns.tsx b/x-pack/plugins/transform/public/app/sections/transform_management/components/transform_list/use_columns.tsx index 42dd77b6dd41e..5cd27d1c2fd16 100644 --- a/x-pack/plugins/transform/public/app/sections/transform_management/components/transform_list/use_columns.tsx +++ b/x-pack/plugins/transform/public/app/sections/transform_management/components/transform_list/use_columns.tsx @@ -355,7 +355,7 @@ export const useColumns = ( sortable: (item: TransformListRow) => item.stats?.health?.status, truncateText: true, render(item: TransformListRow) { - return item.stats && item.stats.health ? ( + return item.stats?.health ? ( diff --git a/x-pack/plugins/transform/server/lib/alerting/transform_health_rule_type/transform_health_service.ts b/x-pack/plugins/transform/server/lib/alerting/transform_health_rule_type/transform_health_service.ts index c0c3bba984c9a..48d411feeae78 100644 --- a/x-pack/plugins/transform/server/lib/alerting/transform_health_rule_type/transform_health_service.ts +++ b/x-pack/plugins/transform/server/lib/alerting/transform_health_rule_type/transform_health_service.ts @@ -240,7 +240,11 @@ export function transformHealthServiceProvider({ const transformsStats = await getTransformStats(transformIds); return transformsStats - .filter((t) => t.health?.status !== TRANSFORM_HEALTH_STATUS.green) + .filter( + (t) => + mapEsHealthStatus2TransformHealthStatus(t.health?.status) !== + TRANSFORM_HEALTH_STATUS.green + ) .map(baseTransformAlertResponseFormatter); }, /** From 55ec826019c7d4587ce5056c98df101afc0d4a47 Mon Sep 17 00:00:00 2001 From: Walter Rafelsberger Date: Tue, 9 Apr 2024 13:54:00 +0200 Subject: [PATCH 5/8] fix health status --- .../components/transform_list/expanded_row.tsx | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/x-pack/plugins/transform/public/app/sections/transform_management/components/transform_list/expanded_row.tsx b/x-pack/plugins/transform/public/app/sections/transform_management/components/transform_list/expanded_row.tsx index 49ce00c80cbf3..5abf0c891641c 100644 --- a/x-pack/plugins/transform/public/app/sections/transform_management/components/transform_list/expanded_row.tsx +++ b/x-pack/plugins/transform/public/app/sections/transform_management/components/transform_list/expanded_row.tsx @@ -25,6 +25,9 @@ import { stringHash } from '@kbn/ml-string-hash'; import { isDefined } from '@kbn/ml-is-defined'; import { FormattedMessage } from '@kbn/i18n-react'; + +import { mapEsHealthStatus2TransformHealthStatus } from '../../../../../../common/constants'; + import { useEnabledFeatures } from '../../../../serverless_context'; import { isTransformListRowWithStats } from '../../../../common/transform_list'; import type { TransformHealthAlertRule } from '../../../../../../common/types/alerting'; @@ -154,7 +157,11 @@ export const ExpandedRow: FC = ({ item, onAlertEdit, transformsStatsLoadi if (item.stats.health !== undefined) { stateItems.push({ title: 'health', - description: , + description: ( + + ), }); } From 31fa4cc8b1b1dfa413259d8383fd11486c701bff Mon Sep 17 00:00:00 2001 From: Walter Rafelsberger Date: Tue, 9 Apr 2024 15:03:39 +0200 Subject: [PATCH 6/8] fix types --- .../apis/transform/reauthorize_transforms.ts | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/x-pack/test/api_integration/apis/transform/reauthorize_transforms.ts b/x-pack/test/api_integration/apis/transform/reauthorize_transforms.ts index 78628a8933bc8..618af9ef4e3ef 100644 --- a/x-pack/test/api_integration/apis/transform/reauthorize_transforms.ts +++ b/x-pack/test/api_integration/apis/transform/reauthorize_transforms.ts @@ -72,13 +72,13 @@ export default ({ getService }: FtrProviderContext) => { TRANSFORM_STATE.STOPPED, `Expected transform state of ${transformId} to be '${TRANSFORM_STATE.STOPPED}' (got ${stats.state})` ); - expect(stats.health.status).to.eql( + expect(stats.health?.status).to.eql( 'red', - `Expected transform health status of ${transformId} to be 'red' (got ${stats.health.status})` + `Expected transform health status of ${transformId} to be 'red' (got ${stats.health?.status})` ); - expect(stats.health.issues![0].type).to.eql( + expect(stats.health?.issues![0].type).to.eql( 'privileges_check_failed', - `Expected transform health issue of ${transformId} to be 'privileges_check_failed' (got ${stats.health.status})` + `Expected transform health issue of ${transformId} to be 'privileges_check_failed' (got ${stats.health?.status})` ); } @@ -94,9 +94,9 @@ export default ({ getService }: FtrProviderContext) => { )})` ); const stats = await transform.api.getTransformStats(transformId); - expect(stats.health.status).to.eql( + expect(stats.health?.status).to.eql( 'green', - `Expected transform health status of ${transformId} to be 'green' (got ${stats.health.status})` + `Expected transform health status of ${transformId} to be 'green' (got ${stats.health?.status})` ); } From 0235718b80443e0cb933b6f10555288a7def16b4 Mon Sep 17 00:00:00 2001 From: Walter Rafelsberger Date: Tue, 9 Apr 2024 16:34:08 +0200 Subject: [PATCH 7/8] fix import --- .../apps/transform/actions/starting.ts | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/x-pack/test/functional/apps/transform/actions/starting.ts b/x-pack/test/functional/apps/transform/actions/starting.ts index 2ecd345ac0e1a..ea12af4f234c9 100644 --- a/x-pack/test/functional/apps/transform/actions/starting.ts +++ b/x-pack/test/functional/apps/transform/actions/starting.ts @@ -7,7 +7,7 @@ import { TRANSFORM_STATE, - TRANSFORM_HEALTH, + TRANSFORM_HEALTH_STATUS, TRANSFORM_HEALTH_LABEL, TRANSFORM_HEALTH_DESCRIPTION, } from '@kbn/transform-plugin/common/constants'; @@ -59,7 +59,7 @@ export default function ({ getService }: FtrProviderContext) { expected: { healthDescription: TRANSFORM_HEALTH_DESCRIPTION.green, healthLabel: TRANSFORM_HEALTH_LABEL.green, - healthStatus: TRANSFORM_HEALTH.green, + healthStatus: TRANSFORM_HEALTH_STATUS.green, }, }, { @@ -70,7 +70,7 @@ export default function ({ getService }: FtrProviderContext) { expected: { healthDescription: TRANSFORM_HEALTH_DESCRIPTION.green, healthLabel: TRANSFORM_HEALTH_LABEL.green, - healthStatus: TRANSFORM_HEALTH.green, + healthStatus: TRANSFORM_HEALTH_STATUS.green, }, }, { @@ -81,7 +81,7 @@ export default function ({ getService }: FtrProviderContext) { expected: { healthDescription: TRANSFORM_HEALTH_DESCRIPTION.yellow, healthLabel: TRANSFORM_HEALTH_LABEL.yellow, - healthStatus: TRANSFORM_HEALTH.yellow, + healthStatus: TRANSFORM_HEALTH_STATUS.yellow, }, }, { @@ -92,7 +92,7 @@ export default function ({ getService }: FtrProviderContext) { expected: { healthDescription: TRANSFORM_HEALTH_DESCRIPTION.green, healthLabel: TRANSFORM_HEALTH_LABEL.green, - healthStatus: TRANSFORM_HEALTH.green, + healthStatus: TRANSFORM_HEALTH_STATUS.green, }, }, { @@ -103,7 +103,7 @@ export default function ({ getService }: FtrProviderContext) { expected: { healthDescription: TRANSFORM_HEALTH_DESCRIPTION.green, healthLabel: TRANSFORM_HEALTH_LABEL.green, - healthStatus: TRANSFORM_HEALTH.green, + healthStatus: TRANSFORM_HEALTH_STATUS.green, }, }, ]; @@ -114,7 +114,7 @@ export default function ({ getService }: FtrProviderContext) { for (const testData of testDataList) { if ( - testData.expected.healthStatus === TRANSFORM_HEALTH.yellow && + testData.expected.healthStatus === TRANSFORM_HEALTH_STATUS.yellow && testData.type === 'pivot' ) { testData.originalConfig.pivot.aggregations['products.base_price.fail'] = { @@ -126,7 +126,7 @@ export default function ({ getService }: FtrProviderContext) { }; } await transform.api.createTransform(testData.originalConfig.id, testData.originalConfig, { - deferValidation: testData.expected.healthStatus === TRANSFORM_HEALTH.yellow, + deferValidation: testData.expected.healthStatus === TRANSFORM_HEALTH_STATUS.yellow, }); } await transform.testResources.setKibanaTimeZoneToUTC(); @@ -167,7 +167,7 @@ export default function ({ getService }: FtrProviderContext) { await transform.table.assertTransformExpandedRowHealth( testData.expected.healthDescription, - testData.expected.healthStatus !== TRANSFORM_HEALTH.green + testData.expected.healthStatus !== TRANSFORM_HEALTH_STATUS.green ); await transform.table.clearSearchString(testDataList.length); From 1c3d38fe6307a04f4a68cbacc9dc4df04b4d48ec Mon Sep 17 00:00:00 2001 From: Walter Rafelsberger Date: Wed, 10 Apr 2024 12:54:10 +0200 Subject: [PATCH 8/8] Apply suggestions from code review use constant instead of raw string for `unknown`. Co-authored-by: Dima Arnautov --- x-pack/plugins/transform/common/constants.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/x-pack/plugins/transform/common/constants.ts b/x-pack/plugins/transform/common/constants.ts index d2dc774072df3..761d9e4c79c72 100644 --- a/x-pack/plugins/transform/common/constants.ts +++ b/x-pack/plugins/transform/common/constants.ts @@ -118,7 +118,7 @@ export const mapEsHealthStatus2TransformHealthStatus = ( ): TransformHealthStatus => typeof healthStatus === 'string' && isTransformHealthStatus(healthStatus.toLowerCase()) ? (healthStatus.toLowerCase() as TransformHealthStatus) - : 'unknown'; + : TRANSFORM_HEALTH_STATUS.unknown; export const TRANSFORM_HEALTH_COLOR = { green: 'success',