Skip to content

Commit bd65949

Browse files
authored
Log error when encountering corrupt saved object during migration (#65829) (#66014)
* Log error when encountering corrupt saved object during migration * Fix documentation * Fix types
1 parent c248832 commit bd65949

File tree

12 files changed

+56
-18
lines changed

12 files changed

+56
-18
lines changed
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
<!-- Do not edit this file. It is automatically generated by API Documenter. -->
2+
3+
[Home](./index.md) &gt; [kibana-plugin-core-server](./kibana-plugin-core-server.md) &gt; [SavedObjectsMigrationLogger](./kibana-plugin-core-server.savedobjectsmigrationlogger.md) &gt; [error](./kibana-plugin-core-server.savedobjectsmigrationlogger.error.md)
4+
5+
## SavedObjectsMigrationLogger.error property
6+
7+
<b>Signature:</b>
8+
9+
```typescript
10+
error: (msg: string, meta: LogMeta) => void;
11+
```

docs/development/core/server/kibana-plugin-core-server.savedobjectsmigrationlogger.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ export interface SavedObjectsMigrationLogger
1616
| Property | Type | Description |
1717
| --- | --- | --- |
1818
| [debug](./kibana-plugin-core-server.savedobjectsmigrationlogger.debug.md) | <code>(msg: string) =&gt; void</code> | |
19+
| [error](./kibana-plugin-core-server.savedobjectsmigrationlogger.error.md) | <code>(msg: string, meta: LogMeta) =&gt; void</code> | |
1920
| [info](./kibana-plugin-core-server.savedobjectsmigrationlogger.info.md) | <code>(msg: string) =&gt; void</code> | |
2021
| [warn](./kibana-plugin-core-server.savedobjectsmigrationlogger.warn.md) | <code>(msg: string) =&gt; void</code> | |
2122
| [warning](./kibana-plugin-core-server.savedobjectsmigrationlogger.warning.md) | <code>(msg: string) =&gt; void</code> | |
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
<!-- Do not edit this file. It is automatically generated by API Documenter. -->
2+
3+
[Home](./index.md) &gt; [kibana-plugin-plugins-data-server](./kibana-plugin-plugins-data-server.md) &gt; [IIndexPattern](./kibana-plugin-plugins-data-server.iindexpattern.md) &gt; [getTimeField](./kibana-plugin-plugins-data-server.iindexpattern.gettimefield.md)
4+
5+
## IIndexPattern.getTimeField() method
6+
7+
<b>Signature:</b>
8+
9+
```typescript
10+
getTimeField?(): IFieldType | undefined;
11+
```
12+
<b>Returns:</b>
13+
14+
`IFieldType | undefined`
15+

src/core/server/saved_objects/migrations/core/index_migrator.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -195,7 +195,7 @@ async function migrateSourceToDest(context: Context) {
195195
await Index.write(
196196
callCluster,
197197
dest.indexName,
198-
migrateRawDocs(serializer, documentMigrator.migrate, docs)
198+
migrateRawDocs(serializer, documentMigrator.migrate, docs, log)
199199
);
200200
}
201201
}

src/core/server/saved_objects/migrations/core/migrate_raw_docs.test.ts

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import _ from 'lodash';
2121
import { SavedObjectTypeRegistry } from '../../saved_objects_type_registry';
2222
import { SavedObjectsSerializer } from '../../serialization';
2323
import { migrateRawDocs } from './migrate_raw_docs';
24+
import { createSavedObjectsMigrationLoggerMock } from '../../migrations/mocks';
2425

2526
describe('migrateRawDocs', () => {
2627
test('converts raw docs to saved objects', async () => {
@@ -31,7 +32,8 @@ describe('migrateRawDocs', () => {
3132
[
3233
{ _id: 'a:b', _source: { type: 'a', a: { name: 'AAA' } } },
3334
{ _id: 'c:d', _source: { type: 'c', c: { name: 'DDD' } } },
34-
]
35+
],
36+
createSavedObjectsMigrationLoggerMock()
3537
);
3638

3739
expect(result).toEqual([
@@ -48,7 +50,8 @@ describe('migrateRawDocs', () => {
4850
expect(transform).toHaveBeenCalled();
4951
});
5052

51-
test('passes invalid docs through untouched', async () => {
53+
test('passes invalid docs through untouched and logs error', async () => {
54+
const logger = createSavedObjectsMigrationLoggerMock();
5255
const transform = jest.fn<any, any>((doc: any) =>
5356
_.set(_.cloneDeep(doc), 'attributes.name', 'TADA')
5457
);
@@ -58,7 +61,8 @@ describe('migrateRawDocs', () => {
5861
[
5962
{ _id: 'foo:b', _source: { type: 'a', a: { name: 'AAA' } } },
6063
{ _id: 'c:d', _source: { type: 'c', c: { name: 'DDD' } } },
61-
]
64+
],
65+
logger
6266
);
6367

6468
expect(result).toEqual([
@@ -82,5 +86,7 @@ describe('migrateRawDocs', () => {
8286
},
8387
],
8488
]);
89+
90+
expect(logger.error).toBeCalledTimes(1);
8591
});
8692
});

src/core/server/saved_objects/migrations/core/migrate_raw_docs.ts

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323

2424
import { SavedObjectsRawDoc, SavedObjectsSerializer } from '../../serialization';
2525
import { TransformFn } from './document_migrator';
26+
import { SavedObjectsMigrationLogger } from '.';
2627

2728
/**
2829
* Applies the specified migration function to every saved object document in the list
@@ -35,7 +36,8 @@ import { TransformFn } from './document_migrator';
3536
export function migrateRawDocs(
3637
serializer: SavedObjectsSerializer,
3738
migrateDoc: TransformFn,
38-
rawDocs: SavedObjectsRawDoc[]
39+
rawDocs: SavedObjectsRawDoc[],
40+
log: SavedObjectsMigrationLogger
3941
): SavedObjectsRawDoc[] {
4042
return rawDocs.map(raw => {
4143
if (serializer.isRawSavedObject(raw)) {
@@ -47,6 +49,10 @@ export function migrateRawDocs(
4749
});
4850
}
4951

52+
log.error(
53+
`Error: Unable to migrate the corrupt Saved Object document ${raw._id}. To prevent Kibana from performing a migration on every restart, please delete or fix this document by ensuring that the namespace and type in the document's id matches the values in the namespace and type fields.`,
54+
{ rawDocument: raw }
55+
);
5056
return raw;
5157
});
5258
}

src/core/server/saved_objects/migrations/core/migration_coordinator.test.ts

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -19,14 +19,10 @@
1919

2020
import _ from 'lodash';
2121
import { coordinateMigration } from './migration_coordinator';
22+
import { createSavedObjectsMigrationLoggerMock } from '../mocks';
2223

2324
describe('coordinateMigration', () => {
24-
const log = {
25-
debug: jest.fn(),
26-
warning: jest.fn(),
27-
warn: jest.fn(),
28-
info: jest.fn(),
29-
};
25+
const log = createSavedObjectsMigrationLoggerMock();
3026

3127
test('waits for isMigrated, if there is an index conflict', async () => {
3228
const pollInterval = 1;

src/core/server/saved_objects/migrations/core/migration_logger.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
* under the License.
1818
*/
1919

20-
import { Logger } from 'src/core/server/logging';
20+
import { Logger, LogMeta } from '../../../logging';
2121

2222
/*
2323
* This file provides a helper class for ensuring that all logging
@@ -35,6 +35,7 @@ export interface SavedObjectsMigrationLogger {
3535
*/
3636
warning: (msg: string) => void;
3737
warn: (msg: string) => void;
38+
error: (msg: string, meta: LogMeta) => void;
3839
}
3940

4041
export class MigrationLogger implements SavedObjectsMigrationLogger {
@@ -48,4 +49,5 @@ export class MigrationLogger implements SavedObjectsMigrationLogger {
4849
public debug = (msg: string) => this.logger.debug(msg);
4950
public warning = (msg: string) => this.logger.warn(msg);
5051
public warn = (msg: string) => this.logger.warn(msg);
52+
public error = (msg: string, meta: LogMeta) => this.logger.error(msg, meta);
5153
}

src/core/server/saved_objects/migrations/kibana/kibana_migrator.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,9 @@
2222
* (the shape of the mappings and documents in the index).
2323
*/
2424

25-
import { Logger } from 'src/core/server/logging';
2625
import { KibanaConfigType } from 'src/core/server/kibana_config';
2726
import { BehaviorSubject } from 'rxjs';
27+
import { Logger } from '../../../logging';
2828
import { IndexMapping, SavedObjectsTypeMappingDefinitions } from '../../mappings';
2929
import { SavedObjectUnsanitizedDoc, SavedObjectsSerializer } from '../../serialization';
3030
import { docValidator, PropertyValidators } from '../../validation';

src/core/server/saved_objects/migrations/mocks.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,20 +20,21 @@
2020
import { SavedObjectMigrationContext } from './types';
2121
import { SavedObjectsMigrationLogger } from './core';
2222

23-
const createLoggerMock = (): jest.Mocked<SavedObjectsMigrationLogger> => {
23+
export const createSavedObjectsMigrationLoggerMock = (): jest.Mocked<SavedObjectsMigrationLogger> => {
2424
const mock = {
2525
debug: jest.fn(),
2626
info: jest.fn(),
2727
warning: jest.fn(),
2828
warn: jest.fn(),
29+
error: jest.fn(),
2930
};
3031

3132
return mock;
3233
};
3334

3435
const createContextMock = (): jest.Mocked<SavedObjectMigrationContext> => {
3536
const mock = {
36-
log: createLoggerMock(),
37+
log: createSavedObjectsMigrationLoggerMock(),
3738
};
3839
return mock;
3940
};

0 commit comments

Comments
 (0)