From 989a0a1f773a01bd12c523a742c6f9577dfcf0fb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cau=C3=AA=20Marcondes?= <55978943+cauemarcondes@users.noreply.github.com> Date: Thu, 21 Nov 2024 16:52:20 +0000 Subject: [PATCH] [Infra] Error for entities API, shown when navigating to infrastructure entity details (#201136) closes https://github.com/elastic/kibana/issues/201124 Screenshot 2024-11-21 at 12 05 18 --------- Co-authored-by: Carlos Crespo (cherry picked from commit b202b6ba2d0cf921e67a95f9d369b35684e45a04) --- .../entities/get_data_stream_types.test.ts | 8 ++++ .../routes/entities/get_data_stream_types.ts | 4 ++ .../routes/entities/get_latest_entity.ts | 37 +++++++++++-------- .../infra/server/routes/entities/index.ts | 8 +++- 4 files changed, 40 insertions(+), 17 deletions(-) diff --git a/x-pack/plugins/observability_solution/infra/server/routes/entities/get_data_stream_types.test.ts b/x-pack/plugins/observability_solution/infra/server/routes/entities/get_data_stream_types.test.ts index e6bf32332a51f..75048ac22a6a8 100644 --- a/x-pack/plugins/observability_solution/infra/server/routes/entities/get_data_stream_types.test.ts +++ b/x-pack/plugins/observability_solution/infra/server/routes/entities/get_data_stream_types.test.ts @@ -10,6 +10,7 @@ import { type InfraMetricsClient } from '../../lib/helpers/get_infra_metrics_cli import { getDataStreamTypes } from './get_data_stream_types'; import { getHasMetricsData } from './get_has_metrics_data'; import { getLatestEntity } from './get_latest_entity'; +import { loggingSystemMock } from '@kbn/core/server/mocks'; jest.mock('./get_has_metrics_data', () => ({ getHasMetricsData: jest.fn(), @@ -25,6 +26,7 @@ describe('getDataStreamTypes', () => { let infraMetricsClient: jest.Mocked; let obsEsClient: jest.Mocked; let entityManagerClient: jest.Mocked; + const logger = loggingSystemMock.createLogger(); beforeEach(() => { infraMetricsClient = {} as jest.Mocked; @@ -43,6 +45,7 @@ describe('getDataStreamTypes', () => { infraMetricsClient, obsEsClient, entityManagerClient, + logger, }; const result = await getDataStreamTypes(params); @@ -65,6 +68,7 @@ describe('getDataStreamTypes', () => { infraMetricsClient, obsEsClient, entityManagerClient, + logger, }; const result = await getDataStreamTypes(params); @@ -84,6 +88,7 @@ describe('getDataStreamTypes', () => { infraMetricsClient, obsEsClient, entityManagerClient, + logger, }; const result = await getDataStreamTypes(params); @@ -95,6 +100,7 @@ describe('getDataStreamTypes', () => { entityId: 'entity123', entityType: 'host', entityManagerClient, + logger, }); }); @@ -109,6 +115,7 @@ describe('getDataStreamTypes', () => { infraMetricsClient, obsEsClient, entityManagerClient, + logger, }; const result = await getDataStreamTypes(params); @@ -128,6 +135,7 @@ describe('getDataStreamTypes', () => { infraMetricsClient, obsEsClient, entityManagerClient, + logger, }; const result = await getDataStreamTypes(params); diff --git a/x-pack/plugins/observability_solution/infra/server/routes/entities/get_data_stream_types.ts b/x-pack/plugins/observability_solution/infra/server/routes/entities/get_data_stream_types.ts index 2d587a6e7d9a9..4a949de4d0ed7 100644 --- a/x-pack/plugins/observability_solution/infra/server/routes/entities/get_data_stream_types.ts +++ b/x-pack/plugins/observability_solution/infra/server/routes/entities/get_data_stream_types.ts @@ -10,6 +10,7 @@ import { findInventoryFields } from '@kbn/metrics-data-access-plugin/common'; import { EntityDataStreamType } from '@kbn/observability-shared-plugin/common'; import type { ObservabilityElasticsearchClient } from '@kbn/observability-utils-server/es/client/create_observability_es_client'; import { castArray } from 'lodash'; +import { Logger } from '@kbn/logging'; import { type InfraMetricsClient } from '../../lib/helpers/get_infra_metrics_client'; import { getHasMetricsData } from './get_has_metrics_data'; import { getLatestEntity } from './get_latest_entity'; @@ -21,6 +22,7 @@ interface Params { infraMetricsClient: InfraMetricsClient; obsEsClient: ObservabilityElasticsearchClient; entityManagerClient: EntityClient; + logger: Logger; } export async function getDataStreamTypes({ @@ -30,6 +32,7 @@ export async function getDataStreamTypes({ entityType, infraMetricsClient, obsEsClient, + logger, }: Params) { const hasMetricsData = await getHasMetricsData({ infraMetricsClient, @@ -48,6 +51,7 @@ export async function getDataStreamTypes({ entityId, entityType, entityManagerClient, + logger, }); if (latestEntity) { diff --git a/x-pack/plugins/observability_solution/infra/server/routes/entities/get_latest_entity.ts b/x-pack/plugins/observability_solution/infra/server/routes/entities/get_latest_entity.ts index 0756bc3d52c8f..c109f53be1f11 100644 --- a/x-pack/plugins/observability_solution/infra/server/routes/entities/get_latest_entity.ts +++ b/x-pack/plugins/observability_solution/infra/server/routes/entities/get_latest_entity.ts @@ -9,6 +9,7 @@ import { ENTITY_LATEST, entitiesAliasPattern } from '@kbn/entities-schema'; import { type EntityClient } from '@kbn/entityManager-plugin/server/lib/entity_client'; import { ENTITY_TYPE, SOURCE_DATA_STREAM_TYPE } from '@kbn/observability-shared-plugin/common'; import type { ObservabilityElasticsearchClient } from '@kbn/observability-utils-server/es/client/create_observability_es_client'; +import type { Logger } from '@kbn/logging'; const ENTITIES_LATEST_ALIAS = entitiesAliasPattern({ type: '*', @@ -24,32 +25,38 @@ export async function getLatestEntity({ entityId, entityType, entityManagerClient, + logger, }: { inventoryEsClient: ObservabilityElasticsearchClient; entityType: 'host' | 'container'; entityId: string; entityManagerClient: EntityClient; + logger: Logger; }): Promise { - const { definitions } = await entityManagerClient.getEntityDefinitions({ - builtIn: true, - type: entityType, - }); + try { + const { definitions } = await entityManagerClient.getEntityDefinitions({ + builtIn: true, + type: entityType, + }); - const hostOrContainerIdentityField = definitions[0]?.identityFields?.[0]?.field; - if (hostOrContainerIdentityField === undefined) { - return undefined; - } + const hostOrContainerIdentityField = definitions[0]?.identityFields?.[0]?.field; + if (hostOrContainerIdentityField === undefined) { + return undefined; + } - const response = await inventoryEsClient.esql<{ - source_data_stream?: { type?: string | string[] }; - }>('get_latest_entities', { - query: `FROM ${ENTITIES_LATEST_ALIAS} + const response = await inventoryEsClient.esql<{ + source_data_stream?: { type?: string | string[] }; + }>('get_latest_entities', { + query: `FROM ${ENTITIES_LATEST_ALIAS} | WHERE ${ENTITY_TYPE} == ? | WHERE ${hostOrContainerIdentityField} == ? | KEEP ${SOURCE_DATA_STREAM_TYPE} `, - params: [entityType, entityId], - }); + params: [entityType, entityId], + }); - return { sourceDataStreamType: response[0].source_data_stream?.type }; + return { sourceDataStreamType: response[0].source_data_stream?.type }; + } catch (e) { + logger.error(e); + } } diff --git a/x-pack/plugins/observability_solution/infra/server/routes/entities/index.ts b/x-pack/plugins/observability_solution/infra/server/routes/entities/index.ts index 30be4fc9da498..46f2cecf45254 100644 --- a/x-pack/plugins/observability_solution/infra/server/routes/entities/index.ts +++ b/x-pack/plugins/observability_solution/infra/server/routes/entities/index.ts @@ -36,8 +36,11 @@ export const initEntitiesConfigurationRoutes = (libs: InfraBackendLibs) => { }, async (requestContext, request, response) => { const { entityId, entityType } = request.params; - const coreContext = await requestContext.core; - const infraContext = await requestContext.infra; + const [coreContext, infraContext] = await Promise.all([ + requestContext.core, + requestContext.infra, + ]); + const entityManagerClient = await infraContext.entityManager.getScopedClient({ request }); const infraMetricsClient = await getInfraMetricsClient({ request, @@ -63,6 +66,7 @@ export const initEntitiesConfigurationRoutes = (libs: InfraBackendLibs) => { entityType, infraMetricsClient, obsEsClient, + logger, }); return response.ok({