Skip to content

Commit 70bdaf3

Browse files
authored
[Fleet] Improve performance of data stream API (#97058) (#97075)
* Improve performance of data stream API * Remove extra logger, replace filter with reduce * Remove unused import # Conflicts: # x-pack/plugins/fleet/server/routes/data_streams/handlers.ts # x-pack/plugins/fleet/server/services/epm/packages/get.ts
1 parent 0e76c5b commit 70bdaf3

File tree

2 files changed

+53
-40
lines changed

2 files changed

+53
-40
lines changed

x-pack/plugins/fleet/server/routes/data_streams/handlers.ts

Lines changed: 52 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,12 @@
55
* 2.0.
66
*/
77

8-
import { RequestHandler, SavedObjectsClientContract } from 'src/core/server';
8+
import { RequestHandler, SavedObjectsBulkGetObject } from 'src/core/server';
99
import { keyBy, keys, merge } from 'lodash';
1010
import { DataStream } from '../../types';
11-
import { GetDataStreamsResponse, KibanaAssetType, KibanaSavedObjectType } from '../../../common';
12-
import { getPackageSavedObjects, getKibanaSavedObject } from '../../services/epm/packages/get';
11+
import { GetDataStreamsResponse, KibanaSavedObjectType } from '../../../common';
12+
import { getPackageSavedObjects } from '../../services/epm/packages/get';
13+
1314
import { defaultIngestErrorHandler } from '../../errors';
1415

1516
const DATA_STREAM_INDEX_PATTERN = 'logs-*-*,metrics-*-*,traces-*-*';
@@ -80,6 +81,40 @@ export const getListHandler: RequestHandler = async (context, request, response)
8081
const packageSavedObjectsByName = keyBy(packageSavedObjects.saved_objects, 'id');
8182
const packageMetadata: any = {};
8283

84+
// Get dashboard information for all packages
85+
const dashboardIdsByPackageName = packageSavedObjects.saved_objects.reduce<
86+
Record<string, string[]>
87+
>((allDashboards, pkgSavedObject) => {
88+
const dashboards: string[] = [];
89+
(pkgSavedObject.attributes?.installed_kibana || []).forEach((o) => {
90+
if (o.type === KibanaSavedObjectType.dashboard) {
91+
dashboards.push(o.id);
92+
}
93+
});
94+
allDashboards[pkgSavedObject.id] = dashboards;
95+
return allDashboards;
96+
}, {});
97+
const allDashboardSavedObjects = await context.core.savedObjects.client.bulkGet<{
98+
title?: string;
99+
}>(
100+
Object.values(dashboardIdsByPackageName).reduce<SavedObjectsBulkGetObject[]>(
101+
(allDashboards, dashboardIds) => {
102+
return allDashboards.concat(
103+
dashboardIds.map((id) => ({
104+
id,
105+
type: KibanaSavedObjectType.dashboard,
106+
fields: ['title'],
107+
}))
108+
);
109+
},
110+
[]
111+
)
112+
);
113+
const allDashboardSavedObjectsById = keyBy(
114+
allDashboardSavedObjects.saved_objects,
115+
(dashboardSavedObject) => dashboardSavedObject.id
116+
);
117+
83118
// Query additional information for each data stream
84119
const dataStreamPromises = dataStreamNames.map(async (dataStreamName) => {
85120
const dataStream = dataStreams[dataStreamName];
@@ -157,19 +192,23 @@ export const getListHandler: RequestHandler = async (context, request, response)
157192
// - and we didn't pick the metadata in an earlier iteration of this map()
158193
if (!packageMetadata[pkgName]) {
159194
// then pick the dashboards from the package saved object
160-
const dashboards =
161-
pkgSavedObject.attributes?.installed_kibana?.filter(
162-
(o) => o.type === KibanaSavedObjectType.dashboard
163-
) || [];
164-
// and then pick the human-readable titles from the dashboard saved objects
165-
const enhancedDashboards = await getEnhancedDashboards(
166-
context.core.savedObjects.client,
167-
dashboards
168-
);
195+
const packageDashboardIds = dashboardIdsByPackageName[pkgName] || [];
196+
const packageDashboards = packageDashboardIds.reduce<
197+
Array<{ id: string; title: string }>
198+
>((dashboards, dashboardId) => {
199+
const dashboard = allDashboardSavedObjectsById[dashboardId];
200+
if (dashboard) {
201+
dashboards.push({
202+
id: dashboard.id,
203+
title: dashboard.attributes.title || dashboard.id,
204+
});
205+
}
206+
return dashboards;
207+
}, []);
169208

170209
packageMetadata[pkgName] = {
171210
version: pkgSavedObject.attributes?.version || '',
172-
dashboards: enhancedDashboards,
211+
dashboards: packageDashboards,
173212
};
174213
}
175214

@@ -194,21 +233,3 @@ export const getListHandler: RequestHandler = async (context, request, response)
194233
return defaultIngestErrorHandler({ error, response });
195234
}
196235
};
197-
198-
const getEnhancedDashboards = async (
199-
savedObjectsClient: SavedObjectsClientContract,
200-
dashboards: any[]
201-
) => {
202-
const dashboardsPromises = dashboards.map(async (db) => {
203-
const dbSavedObject: any = await getKibanaSavedObject(
204-
savedObjectsClient,
205-
KibanaAssetType.dashboard,
206-
db.id
207-
);
208-
return {
209-
id: db.id,
210-
title: dbSavedObject.attributes?.title || db.id,
211-
};
212-
});
213-
return await Promise.all(dashboardsPromises);
214-
};

x-pack/plugins/fleet/server/services/epm/packages/get.ts

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ import {
1515
} from '../../../../common';
1616
import { PACKAGES_SAVED_OBJECT_TYPE } from '../../../constants';
1717
import { ArchivePackage, RegistryPackage, EpmPackageAdditions } from '../../../../common/types';
18-
import { Installation, PackageInfo, KibanaAssetType } from '../../../types';
18+
import { Installation, PackageInfo } from '../../../types';
1919
import { IngestManagerError } from '../../../errors';
2020
import { appContextService } from '../../';
2121
import * as Registry from '../registry';
@@ -254,11 +254,3 @@ function sortByName(a: { name: string }, b: { name: string }) {
254254
return 0;
255255
}
256256
}
257-
258-
export async function getKibanaSavedObject(
259-
savedObjectsClient: SavedObjectsClientContract,
260-
type: KibanaAssetType,
261-
id: string
262-
) {
263-
return savedObjectsClient.get(type, id);
264-
}

0 commit comments

Comments
 (0)