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
---------
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({