[8.16] [APM/Infra] Display entity detail views for logs-only signals when EEM is enabled (#196387) (#196838)

# Backport

This will backport the following commits from `main` to `8.16`:
- [[APM/Infra] Display entity detail views for logs-only signals when
EEM is enabled (#196387)](https://github.com/elastic/kibana/pull/196387)

<!--- Backport version: 9.4.3 -->

### Questions ?
Please refer to the [Backport tool
documentation](https://github.com/sqren/backport)

<!--BACKPORT [{"author":{"name":"Irene
Blanco","email":"irene.blanco@elastic.co"},"sourceCommit":{"committedDate":"2024-10-18T10:21:48Z","message":"[APM/Infra]
Display entity detail views for logs-only signals when EEM is enabled
(#196387)\n\n## Summary\r\n\r\nCloses
https://github.com/elastic/kibana/issues/196084.\r\n\r\nWe want to show
Service, Host and Container views instead of onboarging\r\nwhen EEM is
enabled, entityCentricExperience advanced setting is enabled\r\nand the
entity has logs.\r\n\r\n>[!NOTE]\r\nThe visibility of the noDataConfig
is evaluated at a generic template\r\nlevel for all 3 entity
types.\r\nTo manage visibility based on entity-specific information
(checking for\r\nlogs), we had to add checks within these templates.
While this isn’t an\r\nideal solution, it’s temporary, as we expect
upcoming generic entity\r\nviews will eventually allow us to remove this
logic.\r\n\r\n## Implementation details\r\n\r\nThere's no need to check
if EEM is enabled, as the used `dataStreams`\r\ninformation won’t return
any results if EEM is disabled. This makes the\r\nextra check
unnecessary.\r\n\r\n|Entity|Before|After|\r\n|-|-|-|\r\n\r\n|Service|![logs_only_service_before](32cab468-f3d0-49f9-8835-deb016189a14)|\r\n\r\n---------\r\n\r\nCo-authored-by:
kibanamachine
<42973632+kibanamachine@users.noreply.github.com>\r\nCo-authored-by:
Cauê Marcondes
<55978943+cauemarcondes@users.noreply.github.com>","sha":"586330bd0b557640faa3e019201592f67d180aa4","branchLabelMapping":{"^v9.0.0$":"main","^v8.17.0$":"8.x","^v(\\d+).(\\d+).\\d+$":"$1.$2"}},"sourcePullRequest":{"labels":["release_note:skip","v9.0.0","backport:prev-minor","ci:project-deploy-observability","Team:obs-ux-infra_services","v8.16.0"],"title":"[APM/Infra]
Display entity detail views for logs-only signals when EEM is
enabled","number":196387,"url":"https://github.com/elastic/kibana/pull/196387","mergeCommit":{"message":"[APM/Infra]
Display entity detail views for logs-only signals when EEM is enabled
(#196387)\n\n## Summary\r\n\r\nCloses
https://github.com/elastic/kibana/issues/196084.\r\n\r\nWe want to show
Service, Host and Container views instead of onboarging\r\nwhen EEM is
enabled, entityCentricExperience advanced setting is enabled\r\nand the
entity has logs.\r\n\r\n>[!NOTE]\r\nThe visibility of the noDataConfig
is evaluated at a generic template\r\nlevel for all 3 entity
types.\r\nTo manage visibility based on entity-specific information
(checking for\r\nlogs), we had to add checks within these templates.
While this isn’t an\r\nideal solution, it’s temporary, as we expect
upcoming generic entity\r\nviews will eventually allow us to remove this
logic.\r\n\r\n## Implementation details\r\n\r\nThere's no need to check
if EEM is enabled, as the used `dataStreams`\r\ninformation won’t return
any results if EEM is disabled. This makes the\r\nextra check
unnecessary.\r\n\r\n|Entity|Before|After|\r\n|-|-|-|\r\n\r\n|Service|![logs_only_service_before](32cab468-f3d0-49f9-8835-deb016189a14)|\r\n\r\n---------\r\n\r\nCo-authored-by:
kibanamachine
<42973632+kibanamachine@users.noreply.github.com>\r\nCo-authored-by:
Cauê Marcondes
<55978943+cauemarcondes@users.noreply.github.com>","sha":"586330bd0b557640faa3e019201592f67d180aa4"}},"sourceBranch":"main","suggestedTargetBranches":["8.16"],"targetPullRequestStates":[{"branch":"main","label":"v9.0.0","branchLabelMappingKey":"^v9.0.0$","isSourceBranch":true,"state":"MERGED","url":"https://github.com/elastic/kibana/pull/196387","number":196387,"mergeCommit":{"message":"[APM/Infra]
Display entity detail views for logs-only signals when EEM is enabled
(#196387)\n\n## Summary\r\n\r\nCloses
https://github.com/elastic/kibana/issues/196084.\r\n\r\nWe want to show
Service, Host and Container views instead of onboarging\r\nwhen EEM is
enabled, entityCentricExperience advanced setting is enabled\r\nand the
entity has logs.\r\n\r\n>[!NOTE]\r\nThe visibility of the noDataConfig
is evaluated at a generic template\r\nlevel for all 3 entity
types.\r\nTo manage visibility based on entity-specific information
(checking for\r\nlogs), we had to add checks within these templates.
While this isn’t an\r\nideal solution, it’s temporary, as we expect
upcoming generic entity\r\nviews will eventually allow us to remove this
logic.\r\n\r\n## Implementation details\r\n\r\nThere's no need to check
if EEM is enabled, as the used `dataStreams`\r\ninformation won’t return
any results if EEM is disabled. This makes the\r\nextra check
unnecessary.\r\n\r\n|Entity|Before|After|\r\n|-|-|-|\r\n\r\n|Service|![logs_only_service_before](32cab468-f3d0-49f9-8835-deb016189a14)|\r\n\r\n---------\r\n\r\nCo-authored-by:
kibanamachine
<42973632+kibanamachine@users.noreply.github.com>\r\nCo-authored-by:
Cauê Marcondes
<55978943+cauemarcondes@users.noreply.github.com>","sha":"586330bd0b557640faa3e019201592f67d180aa4"}},{"branch":"8.16","label":"v8.16.0","branchLabelMappingKey":"^v(\\d+).(\\d+).\\d+$","isSourceBranch":false,"state":"NOT_CREATED"}]}]
BACKPORT-->

Co-authored-by: Irene Blanco <irene.blanco@elastic.co>
This commit is contained in:
Kibana Machine 2024-10-18 23:04:50 +11:00 committed by GitHub
parent 21a3625dd5
commit c117f96744
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
10 changed files with 71 additions and 26 deletions

View file

@ -7,12 +7,13 @@
import { EuiFlexGroup, EuiPageHeaderProps } from '@elastic/eui';
import { useKibana } from '@kbn/kibana-react-plugin/public';
import { entityCentricExperience } from '@kbn/observability-plugin/common';
import { ObservabilityPageTemplateProps } from '@kbn/observability-shared-plugin/public';
import type { KibanaPageTemplateProps } from '@kbn/shared-ux-page-kibana-template';
import React, { useContext } from 'react';
import { useLocation } from 'react-router-dom';
import { FeatureFeedbackButton } from '@kbn/observability-shared-plugin/public';
import { useApmServiceContext } from '../../../../context/apm_service/use_apm_service_context';
import { isLogsSignal } from '../../../../utils/get_signal_type';
import { useLocalStorage } from '../../../../hooks/use_local_storage';
import { useDefaultAiAssistantStarterPromptsForAPM } from '../../../../hooks/use_default_ai_assistant_starter_prompts_for_apm';
import { KibanaEnvironmentContext } from '../../../../context/kibana_environment_context/kibana_environment_context';
@ -71,12 +72,8 @@ export function ApmMainTemplate({
const { http, docLinks, observabilityShared, application } = services;
const { kibanaVersion, isCloudEnv, isServerlessEnv } = kibanaEnvironment;
const basePath = http?.basePath.get();
const { config, core } = useApmPluginContext();
const isEntityCentricExperienceSettingEnabled = core.uiSettings.get<boolean>(
entityCentricExperience,
true
);
const { config } = useApmPluginContext();
const { serviceEntitySummary } = useApmServiceContext();
const { isEntityCentricExperienceEnabled } = useEntityCentricExperienceSetting();
const ObservabilityPageTemplate = observabilityShared.navigation.PageTemplate;
@ -97,9 +94,14 @@ export function ApmMainTemplate({
[application?.capabilities.savedObjectsManagement.edit]
);
const shouldBypassNoDataScreen = bypassNoDataScreenPaths.some((path) =>
location.pathname.includes(path)
);
const hasLogsData = serviceEntitySummary?.dataStreamTypes
? serviceEntitySummary?.dataStreamTypes?.length > 0 &&
isLogsSignal(serviceEntitySummary.dataStreamTypes)
: false;
const shouldBypassNoDataScreen =
bypassNoDataScreenPaths.some((path) => location.pathname.includes(path)) ||
(isEntityCentricExperienceEnabled && hasLogsData);
const { data: fleetApmPoliciesData, status: fleetApmPoliciesStatus } = useFetcher(
(callApmApi) => {
@ -158,7 +160,7 @@ export function ApmMainTemplate({
const showEntitiesInventoryCallout =
!dismissedEntitiesInventoryCallout &&
isEntityCentricExperienceSettingEnabled &&
isEntityCentricExperienceEnabled &&
selectedNavButton !== undefined;
return (

View file

@ -8,6 +8,8 @@
import React, { useEffect } from 'react';
import type { InventoryItemType } from '@kbn/metrics-data-access-plugin/common';
import { EuiLoadingSpinner } from '@elastic/eui';
import { useEntityCentricExperienceSetting } from '../../../hooks/use_entity_centric_experience_setting';
import { isPending } from '../../../hooks/use_fetcher';
import { SYSTEM_INTEGRATION } from '../../../../common/constants';
import { useMetricsBreadcrumbs } from '../../../hooks/use_metrics_breadcrumbs';
import { useParentBreadcrumbResolver } from '../../../hooks/use_parent_breadcrumb_resolver';
@ -24,7 +26,7 @@ import { InfraPageTemplate } from '../../shared/templates/infra_page_template';
import { OnboardingFlow } from '../../shared/templates/no_data_config';
import { PageTitleWithPopover } from '../header/page_title_with_popover';
import { useEntitySummary } from '../hooks/use_entity_summary';
import { isMetricsSignal } from '../utils/get_data_stream_types';
import { isLogsSignal, isMetricsSignal } from '../utils/get_data_stream_types';
const DATA_AVAILABILITY_PER_TYPE: Partial<Record<InventoryItemType, string[]>> = {
host: [SYSTEM_INTEGRATION],
@ -36,10 +38,11 @@ export const Page = ({ tabs = [], links = [] }: ContentTemplateProps) => {
const { rightSideItems, tabEntries, breadcrumbs: headerBreadcrumbs } = usePageHeader(tabs, links);
const { asset } = useAssetDetailsRenderPropsContext();
const trackOnlyOnce = React.useRef(false);
const { dataStreams } = useEntitySummary({
const { dataStreams, status: entitySummaryStatus } = useEntitySummary({
entityType: asset.type,
entityId: asset.id,
});
const { isEntityCentricExperienceEnabled } = useEntityCentricExperienceSetting();
const { activeTabId } = useTabSwitcherContext();
const {
services: { telemetry },
@ -85,10 +88,18 @@ export const Page = ({ tabs = [], links = [] }: ContentTemplateProps) => {
}, [activeTabId, asset.type, metadata, metadataLoading, telemetry]);
const showPageTitleWithPopover = asset.type === 'host' && !isMetricsSignal(dataStreams);
const shouldBypassOnboarding =
isEntityCentricExperienceEnabled && (isLogsSignal(dataStreams) || isMetricsSignal(dataStreams));
return (
<InfraPageTemplate
onboardingFlow={asset.type === 'host' ? OnboardingFlow.Hosts : OnboardingFlow.Infra}
onboardingFlow={
isPending(entitySummaryStatus) || shouldBypassOnboarding
? undefined
: asset.type === 'host'
? OnboardingFlow.Hosts
: OnboardingFlow.Infra
}
dataAvailabilityModules={DATA_AVAILABILITY_PER_TYPE[asset.type] || undefined}
pageHeader={{
pageTitle: loading ? (

View file

@ -10,3 +10,7 @@ import { EntityDataStreamType } from '@kbn/observability-shared-plugin/common';
export function isMetricsSignal(dataStreamTypes: EntityDataStreamType[] = []) {
return dataStreamTypes?.includes(EntityDataStreamType.METRICS);
}
export function isLogsSignal(dataStreamTypes: EntityDataStreamType[] = []) {
return dataStreamTypes?.includes(EntityDataStreamType.LOGS);
}

View file

@ -20,7 +20,7 @@ import { OnboardingFlow, getNoDataConfig } from './no_data_config';
export const InfraPageTemplate = ({
'data-test-subj': _dataTestSubj,
dataAvailabilityModules,
onboardingFlow = OnboardingFlow.Infra,
onboardingFlow,
...pageTemplateProps
}: Omit<LazyObservabilityPageTemplateProps, 'noDataConfig'> & {
dataAvailabilityModules?: string[];
@ -41,14 +41,18 @@ export const InfraPageTemplate = ({
const { error: dataViewLoadError, refetch: loadDataView } = useMetricsDataViewContext();
const { remoteClustersExist } = source?.status ?? {};
const { data, status } = useFetcher(async (callApi) => {
return await callApi<GetHasDataResponse>('/api/metrics/source/hasData', {
method: 'GET',
query: {
modules: dataAvailabilityModules,
},
});
});
const { data, status } = useFetcher(
async (callApi) => {
if (!onboardingFlow) return;
return await callApi<GetHasDataResponse>('/api/metrics/source/hasData', {
method: 'GET',
query: {
modules: dataAvailabilityModules,
},
});
},
[onboardingFlow, dataAvailabilityModules]
);
const hasData = !!data?.hasData;
const noDataConfig = getNoDataConfig({

View file

@ -108,11 +108,11 @@ export const getNoDataConfig = ({
}: {
hasData: boolean;
loading: boolean;
onboardingFlow: OnboardingFlow;
onboardingFlow?: OnboardingFlow;
locators: LocatorClient;
docsLink?: string;
}): NoDataConfig | undefined => {
if (hasData || loading) {
if (!onboardingFlow || hasData || loading) {
return;
}

View file

@ -0,0 +1,17 @@
/*
* 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 { entityCentricExperience } from '@kbn/observability-plugin/common';
import { useKibanaContextForPlugin } from './use_kibana';
export function useEntityCentricExperienceSetting() {
const { uiSettings } = useKibanaContextForPlugin().services;
const isEntityCentricExperienceEnabled = uiSettings.get<boolean>(entityCentricExperience, true);
return { isEntityCentricExperienceEnabled };
}

View file

@ -10,6 +10,7 @@ import React from 'react';
import { useTrackPageview } from '@kbn/observability-shared-plugin/public';
import { APP_WRAPPER_CLASS } from '@kbn/core/public';
import { css } from '@emotion/react';
import { OnboardingFlow } from '../../../components/shared/templates/no_data_config';
import { InfraPageTemplate } from '../../../components/shared/templates/infra_page_template';
import { useMetricsBreadcrumbs } from '../../../hooks/use_metrics_breadcrumbs';
import { inventoryTitle } from '../../../translations';
@ -38,6 +39,7 @@ export const SnapshotPage = () => {
<WaffleFiltersProvider>
<div className={APP_WRAPPER_CLASS}>
<InfraPageTemplate
onboardingFlow={OnboardingFlow.Infra}
pageHeader={{
pageTitle: inventoryTitle,
rightSideItems: [<SavedViews />, <SurveySection />],

View file

@ -11,6 +11,7 @@ import moment from 'moment';
import { EuiFlexGroup, EuiFlexItem } from '@elastic/eui';
import { InventoryMetric, InventoryItemType } from '@kbn/metrics-data-access-plugin/common';
import { decodeOrThrow } from '@kbn/io-ts-utils';
import { OnboardingFlow } from '../../../../components/shared/templates/no_data_config';
import { InfraPageTemplate } from '../../../../components/shared/templates/infra_page_template';
import { NodeDetailsMetricDataResponseRT } from '../../../../../common/http_api/node_details_api';
import { isPending, useFetcher } from '../../../../hooks/use_fetcher';
@ -91,6 +92,7 @@ export const NodeDetailsPage = (props: Props) => {
return (
<InfraPageTemplate
onboardingFlow={OnboardingFlow.Infra}
pageHeader={{
pageTitle: props.name,
rightSideItems: [

View file

@ -10,6 +10,7 @@ import React, { useState } from 'react';
import { useRouteMatch } from 'react-router-dom';
import { findInventoryModel } from '@kbn/metrics-data-access-plugin/common';
import type { InventoryItemType } from '@kbn/metrics-data-access-plugin/common';
import { OnboardingFlow } from '../../../components/shared/templates/no_data_config';
import { InfraPageTemplate } from '../../../components/shared/templates/infra_page_template';
import { useMetricsBreadcrumbs } from '../../../hooks/use_metrics_breadcrumbs';
import { useParentBreadcrumbResolver } from '../../../hooks/use_parent_breadcrumb_resolver';
@ -79,7 +80,7 @@ export const MetricDetailPage = () => {
if (metadataLoading && !filteredRequiredMetrics.length) {
return (
<InfraPageTemplate>
<InfraPageTemplate onboardingFlow={OnboardingFlow.Infra}>
<InfraLoadingPanel
height="100vh"
width="100%"

View file

@ -8,6 +8,7 @@
import { i18n } from '@kbn/i18n';
import React, { useEffect, useState } from 'react';
import { useTrackPageview, FeatureFeedbackButton } from '@kbn/observability-shared-plugin/public';
import { OnboardingFlow } from '../../../components/shared/templates/no_data_config';
import { InfraPageTemplate } from '../../../components/shared/templates/infra_page_template';
import { WithMetricsExplorerOptionsUrlState } from '../../../containers/metrics_explorer/with_metrics_explorer_options_url_state';
import { useKibanaEnvironmentContext } from '../../../hooks/use_kibana';
@ -94,6 +95,7 @@ const MetricsExplorerContent = () => {
return (
<InfraPageTemplate
onboardingFlow={OnboardingFlow.Infra}
pageHeader={{
pageTitle: metricsExplorerTitle,
rightSideItems: [