diff --git a/x-pack/platform/packages/shared/kbn-slo-schema/src/rest_specs/routes/get_slo_health.ts b/x-pack/platform/packages/shared/kbn-slo-schema/src/rest_specs/routes/get_slo_health.ts index 94f04dd1c1331..b889a88d1499b 100644 --- a/x-pack/platform/packages/shared/kbn-slo-schema/src/rest_specs/routes/get_slo_health.ts +++ b/x-pack/platform/packages/shared/kbn-slo-schema/src/rest_specs/routes/get_slo_health.ts @@ -11,6 +11,7 @@ import { allOrAnyString } from '../../schema/common'; const fetchSLOHealthResponseSchema = t.array( t.type({ sloId: sloIdSchema, + sloInstanceId: allOrAnyString, sloRevision: t.number, sloName: t.string, state: stateSchema, diff --git a/x-pack/solutions/observability/plugins/slo/common/constants.ts b/x-pack/solutions/observability/plugins/slo/common/constants.ts index dadd3fbf02336..3998fc2161db3 100644 --- a/x-pack/solutions/observability/plugins/slo/common/constants.ts +++ b/x-pack/solutions/observability/plugins/slo/common/constants.ts @@ -81,6 +81,9 @@ export const getSLOTransformId = (sloId: string, sloRevision: number) => export const getSLOSummaryTransformId = (sloId: string, sloRevision: number) => `slo-summary-${sloId}-${sloRevision}`; +export const getWildcardTransformId = (sloId: string, sloRevision: number) => + `slo-*${sloId}-${sloRevision}`; + export const getSLOPipelineId = (sloId: string, sloRevision: number) => `.slo-observability.sli.pipeline-${sloId}-${sloRevision}`; diff --git a/x-pack/solutions/observability/plugins/slo/public/lib/slo_health_helpers.ts b/x-pack/solutions/observability/plugins/slo/public/lib/slo_health_helpers.ts deleted file mode 100644 index 7a798eeb77d76..0000000000000 --- a/x-pack/solutions/observability/plugins/slo/public/lib/slo_health_helpers.ts +++ /dev/null @@ -1,24 +0,0 @@ -/* - * 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 { i18n } from '@kbn/i18n'; - -export function getSloHealthStateText(hasUnhealthy: boolean, hasMissing: boolean) { - if (hasUnhealthy && hasMissing) { - return i18n.translate('xpack.slo.sloHealth.unhealthyOrMissingState', { - defaultMessage: 'an unhealthy or missing', - }); - } else if (hasUnhealthy) { - return i18n.translate('xpack.slo.sloHealth.unhealthyState', { - defaultMessage: 'an unhealthy', - }); - } else { - return i18n.translate('xpack.slo.sloHealth.missingState', { - defaultMessage: 'a missing', - }); - } -} diff --git a/x-pack/solutions/observability/plugins/slo/public/pages/slo_details/components/slo_health_callout.test.tsx b/x-pack/solutions/observability/plugins/slo/public/pages/slo_details/components/slo_health_callout.test.tsx index 1bedfdfd69968..90603a1b37576 100644 --- a/x-pack/solutions/observability/plugins/slo/public/pages/slo_details/components/slo_health_callout.test.tsx +++ b/x-pack/solutions/observability/plugins/slo/public/pages/slo_details/components/slo_health_callout.test.tsx @@ -110,6 +110,7 @@ describe('SloHealthCallout', () => { data: [ { sloId: 'test-slo-id', + sloInstanceId: 'irrelevant', sloRevision: 1, sloName: 'Test SLO', health: { @@ -133,6 +134,7 @@ describe('SloHealthCallout', () => { data: [ { sloId: 'test-slo-id', + sloInstanceId: 'irrelevant', sloRevision: 1, sloName: 'Test SLO', health: { @@ -159,6 +161,7 @@ describe('SloHealthCallout', () => { data: [ { sloId: 'test-slo-id', + sloInstanceId: 'irrelevant', sloRevision: 1, sloName: 'Test SLO', health: { @@ -185,6 +188,7 @@ describe('SloHealthCallout', () => { data: [ { sloId: 'test-slo-id', + sloInstanceId: 'irrelevant', sloRevision: 1, sloName: 'Test SLO', health: { @@ -211,6 +215,7 @@ describe('SloHealthCallout', () => { data: [ { sloId: 'test-slo-id', + sloInstanceId: 'irrelevant', sloRevision: 1, sloName: 'Test SLO', health: { @@ -237,6 +242,7 @@ describe('SloHealthCallout', () => { data: [ { sloId: 'test-slo-id', + sloInstanceId: 'irrelevant', sloRevision: 1, sloName: 'Test SLO', health: { @@ -252,9 +258,7 @@ describe('SloHealthCallout', () => { renderComponent(); expect(screen.getByText('This SLO has issues with its transforms')).toBeInTheDocument(); - expect( - screen.getByText(/The following transforms are in an unhealthy or missing state/) - ).toBeInTheDocument(); + expect(screen.getByText(/The following transforms need attention/)).toBeInTheDocument(); // Should show both transforms expect(screen.getByText(/slo-test-slo-id-1 \(unhealthy\)/)).toBeInTheDocument(); @@ -272,6 +276,7 @@ describe('SloHealthCallout', () => { data: [ { sloId: 'test-slo-id', + sloInstanceId: 'irrelevant', sloRevision: 1, sloName: 'Test SLO', health: { @@ -287,9 +292,7 @@ describe('SloHealthCallout', () => { renderComponent(); expect(screen.getByText('This SLO has issues with its transforms')).toBeInTheDocument(); - expect( - screen.getByText(/The following transforms are in an unhealthy or missing state/) - ).toBeInTheDocument(); + expect(screen.getByText(/The following transforms need attention/)).toBeInTheDocument(); // Should show both transforms expect(screen.getByText(/slo-test-slo-id-1 \(missing\)/)).toBeInTheDocument(); @@ -307,6 +310,7 @@ describe('SloHealthCallout', () => { data: [ { sloId: 'test-slo-id', + sloInstanceId: 'irrelevant', sloRevision: 1, sloName: 'Test SLO', health: { @@ -322,9 +326,7 @@ describe('SloHealthCallout', () => { renderComponent(); expect(screen.getByText('This SLO has issues with its transforms')).toBeInTheDocument(); - expect( - screen.getByText(/The following transforms are in an unhealthy state/) - ).toBeInTheDocument(); + expect(screen.getByText(/The following transforms need attention/)).toBeInTheDocument(); // Should show both transforms as unhealthy expect(screen.getByText(/slo-test-slo-id-1 \(unhealthy\)/)).toBeInTheDocument(); @@ -342,6 +344,7 @@ describe('SloHealthCallout', () => { data: [ { sloId: 'test-slo-id', + sloInstanceId: 'irrelevant', sloRevision: 1, sloName: 'Test SLO', health: { @@ -357,7 +360,7 @@ describe('SloHealthCallout', () => { renderComponent(); expect(screen.getByText('This SLO has issues with its transforms')).toBeInTheDocument(); - expect(screen.getByText(/The following transforms are in a missing state/)).toBeInTheDocument(); + expect(screen.getByText(/The following transforms need attention/)).toBeInTheDocument(); // Should show both transforms as missing expect(screen.getByText(/slo-test-slo-id-1 \(missing\)/)).toBeInTheDocument(); @@ -375,6 +378,7 @@ describe('SloHealthCallout', () => { data: [ { sloId: 'test-slo-id', + sloInstanceId: 'irrelevant', sloRevision: 1, sloName: 'Test SLO', health: { @@ -405,6 +409,7 @@ describe('SloHealthCallout', () => { data: [ { sloId: 'test-slo-id', + sloInstanceId: 'irrelevant', sloRevision: 1, sloName: 'Test SLO', health: { diff --git a/x-pack/solutions/observability/plugins/slo/public/pages/slo_details/components/slo_health_callout.tsx b/x-pack/solutions/observability/plugins/slo/public/pages/slo_details/components/slo_health_callout.tsx index f9f5dbc39f65a..2943865e6df08 100644 --- a/x-pack/solutions/observability/plugins/slo/public/pages/slo_details/components/slo_health_callout.tsx +++ b/x-pack/solutions/observability/plugins/slo/public/pages/slo_details/components/slo_health_callout.tsx @@ -6,19 +6,19 @@ */ import { EuiCallOut, EuiFlexGroup, EuiFlexItem } from '@elastic/eui'; -import React, { useMemo } from 'react'; +import { MANAGEMENT_APP_LOCATOR } from '@kbn/deeplinks-management/constants'; import { i18n } from '@kbn/i18n'; import { FormattedMessage } from '@kbn/i18n-react'; -import { MANAGEMENT_APP_LOCATOR } from '@kbn/deeplinks-management/constants'; import kbnRison from '@kbn/rison'; import type { SLOWithSummaryResponse } from '@kbn/slo-schema'; -import { useKibana } from '../../../hooks/use_kibana'; -import { useFetchSloHealth } from '../../../hooks/use_fetch_slo_health'; +import { values } from 'lodash'; +import React from 'react'; +import { getSLOSummaryTransformId, getSLOTransformId } from '../../../../common/constants'; import { useActionModal } from '../../../context/action_modal'; -import { getSloHealthStateText } from '../../../lib/slo_health_helpers'; -import { getSLOTransformId, getSLOSummaryTransformId } from '../../../../common/constants'; -import { ContentWithResetCta } from './health_callout/content_with_reset_cta'; +import { useFetchSloHealth } from '../../../hooks/use_fetch_slo_health'; +import { useKibana } from '../../../hooks/use_kibana'; import { ContentWithInspectCta } from './health_callout/content_with_inspect_cta'; +import { ContentWithResetCta } from './health_callout/content_with_reset_cta'; export function SloHealthCallout({ slo }: { slo: SLOWithSummaryResponse }) { const { isLoading, isError, data } = useFetchSloHealth({ list: [slo] }); @@ -52,19 +52,6 @@ export function SloHealthCallout({ slo }: { slo: SLOWithSummaryResponse }) { ); }; - const rollupTransformId = useMemo( - () => getSLOTransformId(slo.id, slo.revision), - [slo.id, slo.revision] - ); - - const summaryTransformId = useMemo( - () => getSLOSummaryTransformId(slo.id, slo.revision), - [slo.id, slo.revision] - ); - - const rollupUrl = getUrl(rollupTransformId); - const summaryUrl = getUrl(summaryTransformId); - if (isLoading || isError || data === undefined || data?.length !== 1) { return null; } @@ -74,24 +61,24 @@ export function SloHealthCallout({ slo }: { slo: SLOWithSummaryResponse }) { return null; } - const unhealthyRollup = health.rollup === 'unhealthy'; - const unhealthySummary = health.summary === 'unhealthy'; - const missingRollup = health.rollup === 'missing'; - const missingSummary = health.summary === 'missing'; + const rollupTransformId = getSLOTransformId(slo.id, slo.revision); + const summaryTransformId = getSLOSummaryTransformId(slo.id, slo.revision); - const unhealthyRollupContent = `${rollupTransformId} (unhealthy)`; - const unhealthySummaryContent = `${summaryTransformId} (unhealthy)`; - const missingRollupContent = `${rollupTransformId} (missing)`; - const missingSummaryContent = `${summaryTransformId} (missing)`; + const rollupUrl = getUrl(rollupTransformId); + const summaryUrl = getUrl(summaryTransformId); - const count = [unhealthyRollup, unhealthySummary, missingRollup, missingSummary].filter( - Boolean - ).length; + const rollup = { + unhealthy: health.rollup === 'unhealthy', + missing: health.rollup === 'missing', + }; + const summary = { + unhealthy: health.summary === 'unhealthy', + missing: health.summary === 'missing', + }; - const stateText = getSloHealthStateText( - unhealthyRollup || unhealthySummary, - missingRollup || missingSummary - ); + const rollupHasIssue = values(rollup).some(Boolean); + const summaryHasIssue = values(summary).some(Boolean); + const count = [rollupHasIssue, summaryHasIssue].filter(Boolean).length; return (