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 (
- {health.rollup === 'unhealthy' && !!rollupUrl && (
-