From d46d04a5e5188d8f03073875750ef4ffe5fa9666 Mon Sep 17 00:00:00 2001 From: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> Date: Sat, 9 Nov 2024 01:04:22 +1100 Subject: [PATCH] [8.x] Implement new o11y nav hierarchy for serverless (#193510) (#199467) # Backport This will backport the following commits from `main` to `8.x`: - [Implement new o11y nav hierarchy for serverless (#193510)](https://github.com/elastic/kibana/pull/193510) ### Questions ? Please refer to the [Backport tool documentation](https://github.com/sqren/backport) Co-authored-by: Panagiota Mitsopoulou --- .../public/navigation_tree.ts | 323 ++++++++++++------ .../translations/translations/fr-FR.json | 4 - .../translations/translations/ja-JP.json | 4 - .../translations/translations/zh-CN.json | 4 - .../services/ml/observability_navigation.ts | 6 +- .../observability/infra/navigation.ts | 4 +- .../test_suites/observability/navigation.ts | 19 +- 7 files changed, 224 insertions(+), 140 deletions(-) diff --git a/x-pack/plugins/serverless_observability/public/navigation_tree.ts b/x-pack/plugins/serverless_observability/public/navigation_tree.ts index 5df900ee46812..7501a75abe876 100644 --- a/x-pack/plugins/serverless_observability/public/navigation_tree.ts +++ b/x-pack/plugins/serverless_observability/public/navigation_tree.ts @@ -70,147 +70,258 @@ export const navigationTree: NavigationTreeDefinition = { link: 'slo', }, { - id: 'aiops', - title: 'AIOps', - link: 'ml:anomalyDetection', - renderAs: 'accordion', - spaceBefore: null, + link: 'observabilityAIAssistant', + title: i18n.translate('xpack.serverlessObservability.nav.aiAssistant', { + defaultMessage: 'AI Assistant', + }), + }, + { link: 'inventory', spaceBefore: 'm' }, + { + id: 'apm', + title: i18n.translate('xpack.serverlessObservability.nav.applications', { + defaultMessage: 'Applications', + }), + renderAs: 'panelOpener', children: [ { - title: i18n.translate('xpack.serverlessObservability.nav.ml.jobs', { - defaultMessage: 'Anomaly detection', - }), - link: 'ml:anomalyDetection', - id: 'ml:anomalyDetection', - renderAs: 'item', children: [ { - link: 'ml:singleMetricViewer', - }, - { - link: 'ml:anomalyExplorer', + link: 'apm:services', + title: i18n.translate('xpack.serverlessObservability.nav.apm.services', { + defaultMessage: 'Service inventory', + }), }, + { link: 'apm:traces' }, + { link: 'apm:dependencies' }, + { link: 'apm:settings' }, { - link: 'ml:settings', + id: 'synthetics', + title: i18n.translate('xpack.serverlessObservability.nav.synthetics', { + defaultMessage: 'Synthetics', + }), + children: [ + { + title: i18n.translate( + 'xpack.serverlessObservability.nav.synthetics.overviewItem', + { + defaultMessage: 'Overview', + } + ), + id: 'synthetics-overview', + link: 'synthetics:overview', + breadcrumbStatus: 'hidden', + }, + { + link: 'synthetics:certificates', + title: i18n.translate( + 'xpack.serverlessObservability.nav.synthetics.certificatesItem', + { + defaultMessage: 'TLS certificates', + } + ), + id: 'synthetics-certificates', + breadcrumbStatus: 'hidden', + }, + ], }, ], }, - { - title: i18n.translate('xpack.serverlessObservability.ml.logRateAnalysis', { - defaultMessage: 'Log rate analysis', - }), - link: 'ml:logRateAnalysis', - getIsActive: ({ pathNameSerialized, prepend }) => { - return pathNameSerialized.includes(prepend('/app/ml/aiops/log_rate_analysis')); - }, - }, - { - title: i18n.translate('xpack.serverlessObservability.ml.changePointDetection', { - defaultMessage: 'Change point detection', - }), - link: 'ml:changePointDetections', - getIsActive: ({ pathNameSerialized, prepend }) => { - return pathNameSerialized.includes(prepend('/app/ml/aiops/change_point_detection')); - }, - }, - { - title: i18n.translate('xpack.serverlessObservability.nav.ml.job.notifications', { - defaultMessage: 'Job notifications', - }), - link: 'ml:notifications', - }, ], }, - { link: 'inventory', spaceBefore: 'm' }, { - id: 'apm', - title: i18n.translate('xpack.serverlessObservability.nav.applications', { - defaultMessage: 'Applications', + id: 'metrics', + title: i18n.translate('xpack.serverlessObservability.nav.infrastructure', { + defaultMessage: 'Infrastructure', }), - link: 'apm:services', - renderAs: 'accordion', + renderAs: 'panelOpener', children: [ { - link: 'apm:services', - getIsActive: ({ pathNameSerialized }) => { - const regex = /app\/apm\/.*service.*/; - return regex.test(pathNameSerialized); - }, - }, - { - link: 'apm:traces', - getIsActive: ({ pathNameSerialized, prepend }) => { - return pathNameSerialized.startsWith(prepend('/app/apm/traces')); - }, - }, - { - link: 'apm:dependencies', - getIsActive: ({ pathNameSerialized, prepend }) => { - return pathNameSerialized.startsWith(prepend('/app/apm/dependencies')); - }, - }, - { - link: 'apm:settings', - sideNavStatus: 'hidden', // only to be considered in the breadcrumbs + children: [ + { + link: 'metrics:inventory', + title: i18n.translate( + 'xpack.serverlessObservability.nav.infrastructureInventory', + { + defaultMessage: 'Infrastructure inventory', + } + ), + }, + { link: 'metrics:hosts' }, + { link: 'metrics:settings' }, + { link: 'metrics:assetDetails' }, + ], }, ], }, { - id: 'metrics', - title: i18n.translate('xpack.serverlessObservability.nav.infrastructure', { - defaultMessage: 'Infrastructure', + id: 'machine_learning-landing', + renderAs: 'panelOpener', + title: i18n.translate('xpack.serverlessObservability.nav.machineLearning', { + defaultMessage: 'Machine learning', }), - link: 'metrics:inventory', - renderAs: 'accordion', children: [ { - link: 'metrics:inventory', - getIsActive: ({ pathNameSerialized, prepend }) => { - return pathNameSerialized.startsWith(prepend('/app/metrics/inventory')); - }, + children: [ + { + link: 'ml:overview', + }, + { + link: 'ml:notifications', + }, + { + link: 'ml:memoryUsage', + title: i18n.translate( + 'xpack.serverlessObservability.nav.machineLearning.memoryUsage', + { + defaultMessage: 'Memory usage', + } + ), + }, + ], }, { - link: 'metrics:hosts', - getIsActive: ({ pathNameSerialized, prepend }) => { - return pathNameSerialized.startsWith(prepend('/app/metrics/hosts')); - }, + id: 'category-anomaly_detection', + title: i18n.translate('xpack.serverlessObservability.nav.ml.anomaly_detection', { + defaultMessage: 'Anomaly detection', + }), + breadcrumbStatus: 'hidden', + children: [ + { + link: 'ml:anomalyDetection', + title: i18n.translate( + 'xpack.serverlessObservability.nav.ml.anomaly_detection.jobs', + { + defaultMessage: 'Jobs', + } + ), + }, + { + link: 'ml:anomalyExplorer', + }, + { + link: 'ml:singleMetricViewer', + }, + { + link: 'ml:settings', + }, + { + link: 'ml:suppliedConfigurations', + }, + ], }, { - link: 'metrics:settings', - sideNavStatus: 'hidden', // only to be considered in the breadcrumbs + id: 'category-data_frame analytics', + title: i18n.translate('xpack.serverlessObservability.nav.ml.data_frame_analytics', { + defaultMessage: 'Data frame analytics', + }), + breadcrumbStatus: 'hidden', + children: [ + { + link: 'ml:dataFrameAnalytics', + title: i18n.translate( + 'xpack.serverlessObservability.nav.ml.data_frame_analytics.jobs', + { + defaultMessage: 'Jobs', + } + ), + }, + { + link: 'ml:resultExplorer', + }, + { + link: 'ml:analyticsMap', + }, + ], }, { - link: 'metrics:assetDetails', - sideNavStatus: 'hidden', // only to be considered in the breadcrumbs + id: 'category-model_management', + title: i18n.translate('xpack.serverlessObservability.nav.ml.model_management', { + defaultMessage: 'Model management', + }), + breadcrumbStatus: 'hidden', + children: [ + { + link: 'ml:nodesOverview', + title: i18n.translate( + 'xpack.serverlessObservability.nav.ml.model_management.trainedModels', + { + defaultMessage: 'Trained models', + } + ), + }, + ], }, - ], - }, - { - id: 'synthetics', - title: i18n.translate('xpack.serverlessObservability.nav.synthetics', { - defaultMessage: 'Synthetics', - }), - renderAs: 'accordion', - breadcrumbStatus: 'hidden', - children: [ { - title: i18n.translate('xpack.serverlessObservability.nav.synthetics.overviewItem', { - defaultMessage: 'Overview', + id: 'category-data_visualizer', + title: i18n.translate('xpack.serverlessObservability.nav.ml.data_visualizer', { + defaultMessage: 'Data visualizer', }), - id: 'synthetics-overview', - link: 'synthetics:overview', breadcrumbStatus: 'hidden', + children: [ + { + link: 'ml:fileUpload', + title: i18n.translate( + 'xpack.serverlessObservability.nav.ml.data_visualizer.file_data_visualizer', + { + defaultMessage: 'File data visualizer', + } + ), + }, + { + link: 'ml:indexDataVisualizer', + title: i18n.translate( + 'xpack.serverlessObservability.nav.ml.data_visualizer.data_view_data_visualizer', + { + defaultMessage: 'Data view data visualizer', + } + ), + }, + { + link: 'ml:dataDrift', + title: i18n.translate( + 'xpack.serverlessObservability.nav.ml.data_visualizer.data_drift', + { + defaultMessage: 'Data drift', + } + ), + }, + ], }, { - link: 'synthetics:certificates', - title: i18n.translate( - 'xpack.serverlessObservability.nav.synthetics.certificatesItem', - { - defaultMessage: 'TLS Certificates', - } - ), - id: 'synthetics-certificates', + id: 'category-aiops_labs', + title: i18n.translate('xpack.serverlessObservability.nav.ml.aiops_labs', { + defaultMessage: 'Aiops labs', + }), breadcrumbStatus: 'hidden', + children: [ + { + link: 'ml:logRateAnalysis', + title: i18n.translate( + 'xpack.serverlessObservability.nav.ml.aiops_labs.log_rate_analysis', + { + defaultMessage: 'Log rate analysis', + } + ), + }, + { + link: 'ml:logPatternAnalysis', + title: i18n.translate( + 'xpack.serverlessObservability.nav.ml.aiops_labs.log_pattern_analysis', + { + defaultMessage: 'Log pattern analysis', + } + ), + }, + { + link: 'ml:changePointDetections', + title: i18n.translate( + 'xpack.serverlessObservability.nav.ml.aiops_labs.change_point_detection', + { + defaultMessage: 'Change point detection', + } + ), + }, + ], }, ], }, diff --git a/x-pack/plugins/translations/translations/fr-FR.json b/x-pack/plugins/translations/translations/fr-FR.json index c354d34d152d5..b1d84b5d71c43 100644 --- a/x-pack/plugins/translations/translations/fr-FR.json +++ b/x-pack/plugins/translations/translations/fr-FR.json @@ -43141,16 +43141,12 @@ "xpack.serverless.nav.manageOrgMembersTitle": "Gérer les membres de l'organisation", "xpack.serverlessObservability.aiAssistantManagementDescription": "Gérez la base de connaissances et contrôlez le comportement de l'assistant, y compris le langage de réponse.", "xpack.serverlessObservability.aiAssistantManagementTitle": "Paramètres de l'Assistant d'IA pour Observability", - "xpack.serverlessObservability.ml.changePointDetection": "Modifier la détection du point", - "xpack.serverlessObservability.ml.logRateAnalysis": "Analyse du taux de log", "xpack.serverlessObservability.nav.applications": "Applications", "xpack.serverlessObservability.nav.dashboards": "Tableaux de bord", "xpack.serverlessObservability.nav.devTools": "Outils de développeur", "xpack.serverlessObservability.nav.discover": "Discover", "xpack.serverlessObservability.nav.getStarted": "Ajouter des données", "xpack.serverlessObservability.nav.infrastructure": "Infrastructure", - "xpack.serverlessObservability.nav.ml.job.notifications": "Notifications de tâches", - "xpack.serverlessObservability.nav.ml.jobs": "Détection des anomalies", "xpack.serverlessObservability.nav.mngt": "Gestion", "xpack.serverlessObservability.nav.projectSettings": "Paramètres de projet", "xpack.serverlessObservability.nav.slo": "SLO", diff --git a/x-pack/plugins/translations/translations/ja-JP.json b/x-pack/plugins/translations/translations/ja-JP.json index b3420c2b37ffc..d609024fb4c43 100644 --- a/x-pack/plugins/translations/translations/ja-JP.json +++ b/x-pack/plugins/translations/translations/ja-JP.json @@ -43106,16 +43106,12 @@ "xpack.serverless.nav.manageOrgMembersTitle": "組織メンバーを管理", "xpack.serverlessObservability.aiAssistantManagementDescription": "対応言語をはじめ、ナレッジベースを管理し、アシスタント動作を制御します。", "xpack.serverlessObservability.aiAssistantManagementTitle": "AI Assistant for Observability設定", - "xpack.serverlessObservability.ml.changePointDetection": "変化点検出", - "xpack.serverlessObservability.ml.logRateAnalysis": "ログレート分析", "xpack.serverlessObservability.nav.applications": "アプリケーション", "xpack.serverlessObservability.nav.dashboards": "ダッシュボード", "xpack.serverlessObservability.nav.devTools": "開発者ツール", "xpack.serverlessObservability.nav.discover": "Discover", "xpack.serverlessObservability.nav.getStarted": "データの追加", "xpack.serverlessObservability.nav.infrastructure": "インフラストラクチャー", - "xpack.serverlessObservability.nav.ml.job.notifications": "ジョブ通知", - "xpack.serverlessObservability.nav.ml.jobs": "異常検知", "xpack.serverlessObservability.nav.mngt": "管理", "xpack.serverlessObservability.nav.projectSettings": "プロジェクト設定", "xpack.serverlessObservability.nav.slo": "SLO", diff --git a/x-pack/plugins/translations/translations/zh-CN.json b/x-pack/plugins/translations/translations/zh-CN.json index b395ad9759642..dabba71c65ccd 100644 --- a/x-pack/plugins/translations/translations/zh-CN.json +++ b/x-pack/plugins/translations/translations/zh-CN.json @@ -43177,16 +43177,12 @@ "xpack.serverless.nav.manageOrgMembersTitle": "管理组织成员", "xpack.serverlessObservability.aiAssistantManagementDescription": "管理知识库并控制助手行为,包括响应语言。", "xpack.serverlessObservability.aiAssistantManagementTitle": "适用于 Observability 的 AI 助手设置", - "xpack.serverlessObservability.ml.changePointDetection": "更改点检测", - "xpack.serverlessObservability.ml.logRateAnalysis": "日志速率分析", "xpack.serverlessObservability.nav.applications": "应用程序", "xpack.serverlessObservability.nav.dashboards": "仪表板", "xpack.serverlessObservability.nav.devTools": "开发者工具", "xpack.serverlessObservability.nav.discover": "Discover", "xpack.serverlessObservability.nav.getStarted": "添加数据", "xpack.serverlessObservability.nav.infrastructure": "基础设施", - "xpack.serverlessObservability.nav.ml.job.notifications": "作业通知", - "xpack.serverlessObservability.nav.ml.jobs": "异常检测", "xpack.serverlessObservability.nav.mngt": "管理", "xpack.serverlessObservability.nav.projectSettings": "项目设置", "xpack.serverlessObservability.nav.slo": "SLO", diff --git a/x-pack/test_serverless/functional/services/ml/observability_navigation.ts b/x-pack/test_serverless/functional/services/ml/observability_navigation.ts index 91c149dab37ac..83f6cd4ea94d2 100644 --- a/x-pack/test_serverless/functional/services/ml/observability_navigation.ts +++ b/x-pack/test_serverless/functional/services/ml/observability_navigation.ts @@ -15,11 +15,11 @@ export function MachineLearningNavigationProviderObservability({ const svlCommonNavigation = getPageObject('svlCommonNavigation'); async function navigateToArea(id: string) { - await svlCommonNavigation.sidenav.openSection('observability_project_nav.aiops'); - await testSubjects.existOrFail(`~nav-item-observability_project_nav.aiops.ml:${id}`, { + await svlCommonNavigation.sidenav.openPanel('machine_learning-landing'); + await testSubjects.existOrFail(`~panelNavItem-id-ml:${id}`, { timeout: 60 * 1000, }); - await testSubjects.click(`~nav-item-observability_project_nav.aiops.ml:${id}`); + await testSubjects.click(`~panelNavItem-id-ml:${id}`); } return { diff --git a/x-pack/test_serverless/functional/test_suites/observability/infra/navigation.ts b/x-pack/test_serverless/functional/test_suites/observability/infra/navigation.ts index 64f764b289ab4..253053904b44b 100644 --- a/x-pack/test_serverless/functional/test_suites/observability/infra/navigation.ts +++ b/x-pack/test_serverless/functional/test_suites/observability/infra/navigation.ts @@ -21,7 +21,7 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { }; const openInfraSection = async () => { - await pageObjects.svlCommonNavigation.sidenav.openSection('observability_project_nav.metrics'); + await pageObjects.svlCommonNavigation.sidenav.openPanel('metrics', { button: 'link' }); }; describe('Infra Side Navigation', () => { @@ -38,7 +38,7 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { it("shows the 'Hosts' nav item", async () => { await pageObjects.svlCommonNavigation.sidenav.expectLinkExists({ - deepLinkId: 'metrics:hosts', + panelNavLinkId: 'metrics:hosts', }); }); }); diff --git a/x-pack/test_serverless/functional/test_suites/observability/navigation.ts b/x-pack/test_serverless/functional/test_suites/observability/navigation.ts index bcd9c031714f7..0f8df9e7bc780 100644 --- a/x-pack/test_serverless/functional/test_suites/observability/navigation.ts +++ b/x-pack/test_serverless/functional/test_suites/observability/navigation.ts @@ -46,23 +46,8 @@ export default function ({ getPageObject, getService }: FtrProviderContext) { expect(await browser.getCurrentUrl()).contain('/app/observability-logs-explorer'); // check the aiops subsection - await svlCommonNavigation.sidenav.openSection('observability_project_nav.aiops'); // open ai ops subsection - await svlCommonNavigation.sidenav.clickLink({ navId: 'ml:anomalyDetection' }); - await svlCommonNavigation.sidenav.expectLinkActive({ navId: 'ml:anomalyDetection' }); - await svlCommonNavigation.breadcrumbs.expectBreadcrumbExists({ text: 'AIOps' }); - await svlCommonNavigation.breadcrumbs.expectBreadcrumbExists({ - deepLinkId: 'ml:anomalyDetection', - }); - await svlCommonNavigation.breadcrumbs.expectBreadcrumbExists({ - text: 'Jobs', - }); - await testSubjects.click('mlCreateNewJobButton'); - await svlCommonNavigation.breadcrumbs.expectBreadcrumbTexts([ - 'AIOps', - 'Anomaly Detection', - 'Create job', - ]); - + await svlCommonNavigation.sidenav.clickLink({ navId: 'observabilityAIAssistant' }); // click on AI Assistant link + await svlCommonNavigation.breadcrumbs.expectBreadcrumbExists({ text: 'AI Assistant' }); // navigate to a different section await svlCommonNavigation.sidenav.openSection('project_settings_project_nav'); await svlCommonNavigation.sidenav.clickLink({ deepLinkId: 'management' });