diff --git a/docs/development/core/server/kibana-plugin-core-server.mergesavedobjectmigrationmaps.md b/docs/development/core/server/kibana-plugin-core-server.mergesavedobjectmigrationmaps.md
new file mode 100644
index 0000000000000..68cd580b57882
--- /dev/null
+++ b/docs/development/core/server/kibana-plugin-core-server.mergesavedobjectmigrationmaps.md
@@ -0,0 +1,21 @@
+
+
+[Home](./index.md) > [kibana-plugin-core-server](./kibana-plugin-core-server.md) > [mergeSavedObjectMigrationMaps](./kibana-plugin-core-server.mergesavedobjectmigrationmaps.md)
+
+## mergeSavedObjectMigrationMaps variable
+
+Merges two saved object migration maps.
+
+If there is a migration for a given version on only one of the maps, that migration function will be used:
+
+mergeSavedObjectMigrationMaps({ '1.2.3': f }, { '4.5.6': g }) -> { '1.2.3': f, '4.5.6': g }
+
+If there is a migration for a given version on both maps, the migrations will be composed:
+
+mergeSavedObjectMigrationMaps({ '1.2.3': f }, { '1.2.3': g }) -> { '1.2.3': (doc, context) => f(g(doc, context), context) }
+
+Signature:
+
+```typescript
+mergeSavedObjectMigrationMaps: (map1: SavedObjectMigrationMap, map2: SavedObjectMigrationMap) => SavedObjectMigrationMap
+```
diff --git a/src/core/server/core_usage_data/core_usage_data_service.mock.ts b/src/core/server/core_usage_data/core_usage_data_service.mock.ts
index 941ac5afacb40..d4ba6176cc78b 100644
--- a/src/core/server/core_usage_data/core_usage_data_service.mock.ts
+++ b/src/core/server/core_usage_data/core_usage_data_service.mock.ts
@@ -138,6 +138,7 @@ const createStartContractMock = () => {
alias: 'test_index',
primaryStoreSizeBytes: 1,
storeSizeBytes: 1,
+ savedObjectsDocsCount: 1,
},
],
legacyUrlAliases: {
diff --git a/src/core/server/core_usage_data/core_usage_data_service.test.ts b/src/core/server/core_usage_data/core_usage_data_service.test.ts
index 89d83cfdee2b8..bdaa8ae58a807 100644
--- a/src/core/server/core_usage_data/core_usage_data_service.test.ts
+++ b/src/core/server/core_usage_data/core_usage_data_service.test.ts
@@ -177,6 +177,11 @@ describe('CoreUsageDataService', () => {
},
],
} as any);
+ elasticsearch.client.asInternalUser.count.mockResolvedValueOnce({
+ body: {
+ count: '15',
+ },
+ } as any);
elasticsearch.client.asInternalUser.cat.indices.mockResolvedValueOnce({
body: [
{
@@ -188,6 +193,11 @@ describe('CoreUsageDataService', () => {
},
],
} as any);
+ elasticsearch.client.asInternalUser.count.mockResolvedValueOnce({
+ body: {
+ count: '10',
+ },
+ } as any);
elasticsearch.client.asInternalUser.search.mockResolvedValueOnce({
body: {
hits: { total: { value: 6 } },
@@ -343,6 +353,7 @@ describe('CoreUsageDataService', () => {
"docsCount": 10,
"docsDeleted": 10,
"primaryStoreSizeBytes": 2000,
+ "savedObjectsDocsCount": "15",
"storeSizeBytes": 1000,
},
Object {
@@ -350,6 +361,7 @@ describe('CoreUsageDataService', () => {
"docsCount": 20,
"docsDeleted": 20,
"primaryStoreSizeBytes": 4000,
+ "savedObjectsDocsCount": "10",
"storeSizeBytes": 2000,
},
],
diff --git a/src/core/server/core_usage_data/core_usage_data_service.ts b/src/core/server/core_usage_data/core_usage_data_service.ts
index 73f63d4d634df..609e7af3946fe 100644
--- a/src/core/server/core_usage_data/core_usage_data_service.ts
+++ b/src/core/server/core_usage_data/core_usage_data_service.ts
@@ -133,11 +133,11 @@ export class CoreUsageDataService implements CoreService())
.values()
- ).map((index) => {
+ ).map(async (index) => {
// The _cat/indices API returns the _index_ and doesn't return a way
// to map back from the index to the alias. So we have to make an API
- // call for every alias
- return elasticsearch.client.asInternalUser.cat
+ // call for every alias. The document count is the lucene document count.
+ const catIndicesResults = await elasticsearch.client.asInternalUser.cat
.indices({
index,
format: 'JSON',
@@ -145,6 +145,7 @@ export class CoreUsageDataService implements CoreService {
const stats = body[0];
+
return {
alias: kibanaOrTaskManagerIndex(index, this.kibanaConfig!.index),
docsCount: stats['docs.count'] ? parseInt(stats['docs.count'], 10) : 0,
@@ -155,6 +156,27 @@ export class CoreUsageDataService implements CoreService/_count API to get the number of saved objects
+ // to monitor if the cluster will hit the scalling limit of saved object migrations
+ const savedObjectsCounts = await elasticsearch.client.asInternalUser
+ .count({
+ index,
+ })
+ .then(({ body }) => {
+ return {
+ savedObjectsDocsCount: body.count ? body.count : 0,
+ };
+ });
+ this.logger.debug(
+ `Lucene documents count ${catIndicesResults.docsCount} from index ${catIndicesResults.alias}`
+ );
+ this.logger.debug(
+ `Saved objects documents count ${savedObjectsCounts.savedObjectsDocsCount} from index ${catIndicesResults.alias}`
+ );
+ return {
+ ...catIndicesResults,
+ ...savedObjectsCounts,
+ };
})
);
}
diff --git a/src/core/server/core_usage_data/types.ts b/src/core/server/core_usage_data/types.ts
index 7d0e9fd362d29..17eade436551d 100644
--- a/src/core/server/core_usage_data/types.ts
+++ b/src/core/server/core_usage_data/types.ts
@@ -177,6 +177,7 @@ export interface CoreServicesUsageData {
docsDeleted: number;
storeSizeBytes: number;
primaryStoreSizeBytes: number;
+ savedObjectsDocsCount: number;
}[];
legacyUrlAliases: {
activeCount: number;
diff --git a/src/core/server/server.api.md b/src/core/server/server.api.md
index 00a1cbc44061d..75ec18a04f54e 100644
--- a/src/core/server/server.api.md
+++ b/src/core/server/server.api.md
@@ -416,6 +416,7 @@ export interface CoreServicesUsageData {
docsDeleted: number;
storeSizeBytes: number;
primaryStoreSizeBytes: number;
+ savedObjectsDocsCount: number;
}[];
legacyUrlAliases: {
activeCount: number;
diff --git a/src/plugins/kibana_usage_collection/server/collectors/core/core_usage_collector.ts b/src/plugins/kibana_usage_collection/server/collectors/core/core_usage_collector.ts
index b1cf0ecd2213e..a208832baf719 100644
--- a/src/plugins/kibana_usage_collection/server/collectors/core/core_usage_collector.ts
+++ b/src/plugins/kibana_usage_collection/server/collectors/core/core_usage_collector.ts
@@ -355,14 +355,14 @@ export function getCoreUsageCollector(
type: 'long',
_meta: {
description:
- 'The number of documents in the index, including hidden nested documents.',
+ 'The number of lucene documents in the index, including hidden nested documents.',
},
},
docsDeleted: {
type: 'long',
_meta: {
description:
- 'The number of deleted documents in the index, including hidden nested documents.',
+ 'The number of deleted lucene documents in the index, including hidden nested documents.',
},
},
alias: {
@@ -382,6 +382,12 @@ export function getCoreUsageCollector(
description: 'The size in bytes of the index, for primaries and replicas.',
},
},
+ savedObjectsDocsCount: {
+ type: 'long',
+ _meta: {
+ description: 'The number of saved objects documents in the index.',
+ },
+ },
},
},
legacyUrlAliases: {
diff --git a/src/plugins/telemetry/schema/oss_plugins.json b/src/plugins/telemetry/schema/oss_plugins.json
index d78adb7e22958..b1d11acb0b225 100644
--- a/src/plugins/telemetry/schema/oss_plugins.json
+++ b/src/plugins/telemetry/schema/oss_plugins.json
@@ -6248,13 +6248,13 @@
"docsCount": {
"type": "long",
"_meta": {
- "description": "The number of documents in the index, including hidden nested documents."
+ "description": "The number of lucene documents in the index, including hidden nested documents."
}
},
"docsDeleted": {
"type": "long",
"_meta": {
- "description": "The number of deleted documents in the index, including hidden nested documents."
+ "description": "The number of deleted lucene documents in the index, including hidden nested documents."
}
},
"alias": {
@@ -6274,6 +6274,12 @@
"_meta": {
"description": "The size in bytes of the index, for primaries and replicas."
}
+ },
+ "savedObjectsDocsCount": {
+ "type": "long",
+ "_meta": {
+ "description": "The number of saved objects documents in the index."
+ }
}
}
}