diff --git a/x-pack/plugins/lens/public/app_plugin/get_application_user_messages.test.tsx b/x-pack/plugins/lens/public/app_plugin/get_application_user_messages.test.tsx index 3691f507d6a4d..c49ef7f349f18 100644 --- a/x-pack/plugins/lens/public/app_plugin/get_application_user_messages.test.tsx +++ b/x-pack/plugins/lens/public/app_plugin/get_application_user_messages.test.tsx @@ -37,12 +37,12 @@ describe('application-level user messages', () => { Object { "displayLocations": Array [ Object { - "id": "visualization", + "id": "visualizationOnEmbeddable", }, ], "fixableInEditor": true, "longMessage": "Visualization type not found.", - "severity": "warning", + "severity": "error", "shortMessage": "", }, ] diff --git a/x-pack/plugins/lens/public/app_plugin/get_application_user_messages.tsx b/x-pack/plugins/lens/public/app_plugin/get_application_user_messages.tsx index f7b5d1eb8a135..f5190ec334157 100644 --- a/x-pack/plugins/lens/public/app_plugin/get_application_user_messages.tsx +++ b/x-pack/plugins/lens/public/app_plugin/get_application_user_messages.tsx @@ -33,9 +33,9 @@ export const getApplicationUserMessages = ({ core, }: { visualizationType: string | null | undefined; - visualization: VisualizationState; + visualization: VisualizationState | undefined; visualizationMap: VisualizationMap; - activeDatasource: Datasource | null; + activeDatasource: Datasource | null | undefined; activeDatasourceState: { state: unknown } | null; dataViews: DataViewsState; core: CoreStart; @@ -46,7 +46,7 @@ export const getApplicationUserMessages = ({ messages.push(getMissingVisTypeError()); } - if (visualization.activeId && !visualizationMap[visualization.activeId]) { + if (visualization?.activeId && !visualizationMap[visualization.activeId]) { messages.push(getUnknownVisualizationTypeError(visualization.activeId)); } @@ -69,8 +69,8 @@ export const getApplicationUserMessages = ({ function getMissingVisTypeError(): UserMessage { return { - severity: 'warning', - displayLocations: [{ id: 'visualization' }], + severity: 'error', + displayLocations: [{ id: 'visualizationOnEmbeddable' }], fixableInEditor: true, shortMessage: '', longMessage: i18n.translate('xpack.lens.editorFrame.expressionMissingVisualizationType', { diff --git a/x-pack/plugins/lens/public/editor_frame_service/editor_frame/state_helpers.ts b/x-pack/plugins/lens/public/editor_frame_service/editor_frame/state_helpers.ts index 4cda8d1c7c0bd..02410b6994c34 100644 --- a/x-pack/plugins/lens/public/editor_frame_service/editor_frame/state_helpers.ts +++ b/x-pack/plugins/lens/public/editor_frame_service/editor_frame/state_helpers.ts @@ -401,7 +401,7 @@ export async function persistedStateToExpression( } export function getMissingIndexPattern( - currentDatasource: Datasource | null, + currentDatasource: Datasource | null | undefined, currentDatasourceState: { state: unknown } | null, indexPatterns: IndexPatternMap ) { diff --git a/x-pack/plugins/lens/public/embeddable/embeddable.test.tsx b/x-pack/plugins/lens/public/embeddable/embeddable.test.tsx index db00db6a87f7f..92bfa95eb2aef 100644 --- a/x-pack/plugins/lens/public/embeddable/embeddable.test.tsx +++ b/x-pack/plugins/lens/public/embeddable/embeddable.test.tsx @@ -30,23 +30,36 @@ import { OnSaveProps } from '@kbn/saved-objects-plugin/public/save_modal'; import { act } from 'react-dom/test-utils'; import { inspectorPluginMock } from '@kbn/inspector-plugin/public/mocks'; import { Visualization } from '../types'; +import { createMockDatasource, createMockVisualization } from '../mocks'; jest.mock('@kbn/inspector-plugin/public', () => ({ isAvailable: false, open: false, })); +const defaultVisualizationId = 'lnsSomeVisType'; +const defaultDatasourceId = 'someDatasource'; + const savedVis: Document = { state: { - visualization: {}, - datasourceStates: {}, + visualization: { activeId: defaultVisualizationId }, + datasourceStates: { [defaultDatasourceId]: {} }, query: { query: '', language: 'lucene' }, filters: [], }, references: [], title: 'My title', - visualizationType: '', + visualizationType: defaultVisualizationId, +}; + +const defaultVisualizationMap = { + [defaultVisualizationId]: createMockVisualization(), +}; + +const defaultDatasourceMap = { + [defaultDatasourceId]: createMockDatasource(defaultDatasourceId), }; + const defaultSaveMethod = ( testAttributes: LensSavedObjectAttributes, savedObjectId?: string @@ -155,8 +168,8 @@ describe('embeddable', () => { inspector: inspectorPluginMock.createStartContract(), getTrigger, theme: themeServiceMock.createStartContract(), - visualizationMap: {}, - datasourceMap: {}, + visualizationMap: defaultVisualizationMap, + datasourceMap: defaultDatasourceMap, injectFilterReferences: jest.fn(mockInjectFilterReferences), documentToExpression: () => Promise.resolve({ @@ -208,8 +221,8 @@ describe('embeddable', () => { inspector: inspectorPluginMock.createStartContract(), getTrigger, theme: themeServiceMock.createStartContract(), - visualizationMap: {}, - datasourceMap: {}, + visualizationMap: defaultVisualizationMap, + datasourceMap: defaultDatasourceMap, injectFilterReferences: jest.fn(mockInjectFilterReferences), documentToExpression: () => Promise.resolve({ @@ -268,8 +281,8 @@ describe('embeddable', () => { navLinks: {}, }, getTrigger, - visualizationMap: {}, - datasourceMap: {}, + visualizationMap: defaultVisualizationMap, + datasourceMap: defaultDatasourceMap, injectFilterReferences: jest.fn(mockInjectFilterReferences), theme: themeServiceMock.createStartContract(), documentToExpression: () => @@ -322,8 +335,8 @@ describe('embeddable', () => { navLinks: {}, }, getTrigger, - visualizationMap: {}, - datasourceMap: {}, + visualizationMap: defaultVisualizationMap, + datasourceMap: defaultDatasourceMap, injectFilterReferences: jest.fn(mockInjectFilterReferences), theme: themeServiceMock.createStartContract(), documentToExpression: () => @@ -398,8 +411,8 @@ describe('embeddable', () => { navLinks: {}, }, getTrigger, - visualizationMap: {}, - datasourceMap: {}, + visualizationMap: defaultVisualizationMap, + datasourceMap: defaultDatasourceMap, injectFilterReferences: jest.fn(mockInjectFilterReferences), theme: themeServiceMock.createStartContract(), documentToExpression: () => @@ -452,8 +465,8 @@ describe('embeddable', () => { navLinks: {}, }, getTrigger, - visualizationMap: {}, - datasourceMap: {}, + visualizationMap: defaultVisualizationMap, + datasourceMap: defaultDatasourceMap, injectFilterReferences: jest.fn(mockInjectFilterReferences), theme: themeServiceMock.createStartContract(), documentToExpression: () => @@ -505,8 +518,8 @@ describe('embeddable', () => { navLinks: {}, }, getTrigger, - visualizationMap: {}, - datasourceMap: {}, + visualizationMap: defaultVisualizationMap, + datasourceMap: defaultDatasourceMap, injectFilterReferences: jest.fn(mockInjectFilterReferences), theme: themeServiceMock.createStartContract(), documentToExpression: () => @@ -554,8 +567,8 @@ describe('embeddable', () => { navLinks: {}, }, getTrigger, - visualizationMap: {}, - datasourceMap: {}, + visualizationMap: defaultVisualizationMap, + datasourceMap: defaultDatasourceMap, injectFilterReferences: jest.fn(mockInjectFilterReferences), theme: themeServiceMock.createStartContract(), documentToExpression: () => @@ -609,8 +622,8 @@ describe('embeddable', () => { navLinks: {}, }, getTrigger, - visualizationMap: {}, - datasourceMap: {}, + visualizationMap: defaultVisualizationMap, + datasourceMap: defaultDatasourceMap, injectFilterReferences: jest.fn(mockInjectFilterReferences), theme: themeServiceMock.createStartContract(), documentToExpression: () => @@ -668,8 +681,8 @@ describe('embeddable', () => { navLinks: {}, }, getTrigger, - visualizationMap: {}, - datasourceMap: {}, + visualizationMap: defaultVisualizationMap, + datasourceMap: defaultDatasourceMap, injectFilterReferences: jest.fn(mockInjectFilterReferences), theme: themeServiceMock.createStartContract(), documentToExpression: () => @@ -725,8 +738,8 @@ describe('embeddable', () => { navLinks: {}, }, getTrigger, - visualizationMap: {}, - datasourceMap: {}, + visualizationMap: defaultVisualizationMap, + datasourceMap: defaultDatasourceMap, injectFilterReferences: jest.fn(mockInjectFilterReferences), theme: themeServiceMock.createStartContract(), documentToExpression: () => @@ -789,8 +802,8 @@ describe('embeddable', () => { navLinks: {}, }, getTrigger, - visualizationMap: {}, - datasourceMap: {}, + visualizationMap: defaultVisualizationMap, + datasourceMap: defaultDatasourceMap, injectFilterReferences: jest.fn(mockInjectFilterReferences), theme: themeServiceMock.createStartContract(), documentToExpression: () => @@ -854,8 +867,8 @@ describe('embeddable', () => { navLinks: {}, }, getTrigger, - visualizationMap: {}, - datasourceMap: {}, + visualizationMap: defaultVisualizationMap, + datasourceMap: defaultDatasourceMap, injectFilterReferences: jest.fn(mockInjectFilterReferences), theme: themeServiceMock.createStartContract(), documentToExpression: () => @@ -922,8 +935,8 @@ describe('embeddable', () => { navLinks: {}, }, getTrigger, - visualizationMap: {}, - datasourceMap: {}, + visualizationMap: defaultVisualizationMap, + datasourceMap: defaultDatasourceMap, injectFilterReferences: jest.fn(mockInjectFilterReferences), theme: themeServiceMock.createStartContract(), documentToExpression: () => @@ -975,8 +988,8 @@ describe('embeddable', () => { navLinks: {}, }, getTrigger, - visualizationMap: {}, - datasourceMap: {}, + visualizationMap: defaultVisualizationMap, + datasourceMap: defaultDatasourceMap, injectFilterReferences: jest.fn(mockInjectFilterReferences), theme: themeServiceMock.createStartContract(), documentToExpression: () => @@ -1030,8 +1043,8 @@ describe('embeddable', () => { navLinks: {}, }, getTrigger, - visualizationMap: {}, - datasourceMap: {}, + visualizationMap: defaultVisualizationMap, + datasourceMap: defaultDatasourceMap, injectFilterReferences: jest.fn(mockInjectFilterReferences), theme: themeServiceMock.createStartContract(), documentToExpression: () => @@ -1082,8 +1095,8 @@ describe('embeddable', () => { navLinks: {}, }, getTrigger, - visualizationMap: {}, - datasourceMap: {}, + visualizationMap: defaultVisualizationMap, + datasourceMap: defaultDatasourceMap, injectFilterReferences: jest.fn(mockInjectFilterReferences), theme: themeServiceMock.createStartContract(), documentToExpression: () => @@ -1150,8 +1163,8 @@ describe('embeddable', () => { navLinks: {}, }, getTrigger, - visualizationMap: {}, - datasourceMap: {}, + visualizationMap: defaultVisualizationMap, + datasourceMap: defaultDatasourceMap, injectFilterReferences: jest.fn(mockInjectFilterReferences), theme: themeServiceMock.createStartContract(), documentToExpression: () => @@ -1236,8 +1249,8 @@ describe('embeddable', () => { navLinks: {}, }, getTrigger, - visualizationMap: {}, - datasourceMap: {}, + visualizationMap: defaultVisualizationMap, + datasourceMap: defaultDatasourceMap, injectFilterReferences: jest.fn(mockInjectFilterReferences), theme: themeServiceMock.createStartContract(), documentToExpression: () => @@ -1297,8 +1310,8 @@ describe('embeddable', () => { navLinks: {}, }, getTrigger, - visualizationMap: {}, - datasourceMap: {}, + visualizationMap: defaultVisualizationMap, + datasourceMap: defaultDatasourceMap, injectFilterReferences: jest.fn(mockInjectFilterReferences), theme: themeServiceMock.createStartContract(), documentToExpression: () => @@ -1355,8 +1368,8 @@ describe('embeddable', () => { navLinks: {}, }, getTrigger, - visualizationMap: {}, - datasourceMap: {}, + visualizationMap: defaultVisualizationMap, + datasourceMap: defaultDatasourceMap, injectFilterReferences: jest.fn(mockInjectFilterReferences), theme: themeServiceMock.createStartContract(), documentToExpression: () => @@ -1408,7 +1421,7 @@ describe('embeddable', () => { const visDocument: Document = { state: { visualization: {}, - datasourceStates: {}, + datasourceStates: { [defaultDatasourceId]: {} }, query: { query: '', language: 'lucene' }, filters: [], }, @@ -1443,7 +1456,7 @@ describe('embeddable', () => { initialize: () => {}, } as unknown as Visualization, }, - datasourceMap: {}, + datasourceMap: defaultDatasourceMap, documentToExpression: documentToExpressionMock, }, { id: '123' } as unknown as LensEmbeddableInput @@ -1475,23 +1488,11 @@ describe('embeddable', () => { it('should override noPadding in the display options if noPadding is set in the embeddable input', async () => { expressionRenderer = jest.fn((_) => null); - const visDocument: Document = { - state: { - visualization: {}, - datasourceStates: {}, - query: { query: '', language: 'lucene' }, - filters: [], - }, - references: [], - title: 'My title', - visualizationType: 'testVis', - }; - const createEmbeddable = (displayOptions?: { noPadding: boolean }, noPadding?: boolean) => { return new Embeddable( { timefilter: dataPluginMock.createSetupContract().query.timefilter.timefilter, - attributeService: attributeServiceMockFromSavedVis(visDocument), + attributeService: attributeServiceMockFromSavedVis(savedVis), data: dataMock, expressionRenderer, coreStart: {} as CoreStart, @@ -1507,12 +1508,12 @@ describe('embeddable', () => { getTrigger, theme: themeServiceMock.createStartContract(), visualizationMap: { - [visDocument.visualizationType as string]: { + [savedVis.visualizationType as string]: { getDisplayOptions: displayOptions ? () => displayOptions : undefined, initialize: () => {}, } as unknown as Visualization, }, - datasourceMap: {}, + datasourceMap: defaultDatasourceMap, injectFilterReferences: jest.fn(mockInjectFilterReferences), documentToExpression: () => Promise.resolve({ diff --git a/x-pack/plugins/lens/public/embeddable/embeddable.tsx b/x-pack/plugins/lens/public/embeddable/embeddable.tsx index 1a22222155677..e89e8c61e3185 100644 --- a/x-pack/plugins/lens/public/embeddable/embeddable.tsx +++ b/x-pack/plugins/lens/public/embeddable/embeddable.tsx @@ -513,25 +513,23 @@ export class Embeddable private loadUserMessages() { const userMessages: UserMessage[] = []; - if (this.activeVisualizationState && this.activeDatasource) { - userMessages.push( - ...getApplicationUserMessages({ - visualizationType: this.savedVis?.visualizationType, - visualization: { - state: this.activeVisualizationState, - activeId: this.activeVisualizationId, - }, - visualizationMap: this.deps.visualizationMap, - activeDatasource: this.activeDatasource, - activeDatasourceState: { state: this.activeDatasourceState }, - dataViews: { - indexPatterns: this.indexPatterns, - indexPatternRefs: this.indexPatternRefs, // TODO - are these actually used? - }, - core: this.deps.coreStart, - }) - ); - } + userMessages.push( + ...getApplicationUserMessages({ + visualizationType: this.savedVis?.visualizationType, + visualization: { + state: this.activeVisualizationState, + activeId: this.activeVisualizationId, + }, + visualizationMap: this.deps.visualizationMap, + activeDatasource: this.activeDatasource, + activeDatasourceState: { state: this.activeDatasourceState }, + dataViews: { + indexPatterns: this.indexPatterns, + indexPatternRefs: this.indexPatternRefs, // TODO - are these actually used? + }, + core: this.deps.coreStart, + }) + ); const mergedSearchContext = this.getMergedSearchContext(); @@ -634,14 +632,18 @@ export class Embeddable savedObjectId: (input as LensByReferenceInput)?.savedObjectId, }; - const { ast, indexPatterns, indexPatternRefs } = await getExpressionFromDocument( - this.savedVis, - this.deps.documentToExpression - ); + try { + const { ast, indexPatterns, indexPatternRefs } = await getExpressionFromDocument( + this.savedVis, + this.deps.documentToExpression + ); - this.expression = ast; - this.indexPatterns = indexPatterns; - this.indexPatternRefs = indexPatternRefs; + this.expression = ast; + this.indexPatterns = indexPatterns; + this.indexPatternRefs = indexPatternRefs; + } catch { + // nothing, errors should be reported via getUserMessages + } if (metaInfo?.sharingSavedObjectProps?.outcome === 'conflict' && !!this.deps.spaces) { this.addUserMessages([ diff --git a/x-pack/test/functional/apps/lens/group3/error_handling.ts b/x-pack/test/functional/apps/lens/group3/error_handling.ts index 85f9cad73992c..997066343509c 100644 --- a/x-pack/test/functional/apps/lens/group3/error_handling.ts +++ b/x-pack/test/functional/apps/lens/group3/error_handling.ts @@ -129,5 +129,27 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { 'x-pack/test/functional/fixtures/kbn_archiver/lens/missing_fields' ); }); + + it('displays fundamental configuration issues on dashboard', async () => { + await kibanaServer.importExport.load( + 'x-pack/test/functional/fixtures/kbn_archiver/lens/fundamental_config_errors_on_dashboard' + ); + + await PageObjects.common.navigateToApp('dashboard'); + await PageObjects.dashboard.loadSavedDashboard('lens fundamental config errors dash'); + + const failureElements = await testSubjects.findAll('errorMessageMarkdown'); + const errorMessages = await Promise.all(failureElements.map((el) => el.getVisibleText())); + + expect(errorMessages).to.eql([ + 'Visualization type not found.', + 'The visualization type lnsUNKNOWN could not be resolved.', + 'Could not find datasource for the visualization', + ]); + + await kibanaServer.importExport.unload( + 'x-pack/test/functional/fixtures/kbn_archiver/lens/fundamental_config_errors_on_dashboard' + ); + }); }); } diff --git a/x-pack/test/functional/fixtures/kbn_archiver/lens/fundamental_config_errors_on_dashboard.json b/x-pack/test/functional/fixtures/kbn_archiver/lens/fundamental_config_errors_on_dashboard.json new file mode 100644 index 0000000000000..435c5f43eb1b9 --- /dev/null +++ b/x-pack/test/functional/fixtures/kbn_archiver/lens/fundamental_config_errors_on_dashboard.json @@ -0,0 +1,9 @@ +{"attributes":{"fieldFormatMap":"{\"hour_of_day\":{}}","name":"Kibana Sample Data Logs","runtimeFieldMap":"{\"hour_of_day\":{\"type\":\"long\",\"script\":{\"source\":\"emit(doc['timestamp'].value.getHour());\"}}}","timeFieldName":"timestamp","title":"kibana_sample_data_logs"},"coreMigrationVersion":"8.8.0","created_at":"2023-02-08T22:00:06.671Z","id":"90943e30-9a47-11e8-b64d-95841ca0b247","migrationVersion":{"index-pattern":"8.0.0"},"references":[],"type":"index-pattern","updated_at":"2023-02-08T22:00:06.671Z","version":"WzE1MywxXQ=="} + +{"attributes":{"state":{"adHocDataViews":{},"datasourceStates":{"formBased":{"layers":{"19b05f1b-1187-4c55-abe1-a0bfc45d35f7":{"columnOrder":["bf200ba8-e158-41b4-a701-1121910912e9","b39bfe4c-3699-4f11-a211-aa8cf6d19e1c"],"columns":{"b39bfe4c-3699-4f11-a211-aa8cf6d19e1c":{"dataType":"number","isBucketed":false,"label":"Median of bytes","operationType":"median","params":{"emptyAsNull":true},"scale":"ratio","sourceField":"bytes"},"bf200ba8-e158-41b4-a701-1121910912e9":{"dataType":"date","isBucketed":true,"label":"timestamp","operationType":"date_histogram","params":{"dropPartials":false,"includeEmptyRows":true,"interval":"auto"},"scale":"interval","sourceField":"timestamp"}},"incompleteColumns":{},"sampling":1}}},"textBased":{"layers":{}}},"filters":[],"internalReferences":[],"query":{"language":"kuery","query":""},"visualization":{"axisTitlesVisibilitySettings":{"x":true,"yLeft":true,"yRight":true},"fittingFunction":"None","gridlinesVisibilitySettings":{"x":true,"yLeft":true,"yRight":true},"labelsOrientation":{"x":0,"yLeft":0,"yRight":0},"layers":[{"accessors":["b39bfe4c-3699-4f11-a211-aa8cf6d19e1c"],"layerId":"19b05f1b-1187-4c55-abe1-a0bfc45d35f7","layerType":"data","position":"top","seriesType":"bar_stacked","showGridlines":false,"xAccessor":"bf200ba8-e158-41b4-a701-1121910912e9"}],"legend":{"isVisible":true,"position":"right"},"preferredSeriesType":"bar_stacked","tickLabelsVisibilitySettings":{"x":true,"yLeft":true,"yRight":true},"valueLabels":"hide"}},"title":"missing visualization type","visualizationType":null},"coreMigrationVersion":"8.8.0","created_at":"2023-02-08T22:00:21.379Z","id":"323d9ca0-a7f8-11ed-a593-e73d16536d96","migrationVersion":{"lens":"8.6.0"},"references":[{"id":"90943e30-9a47-11e8-b64d-95841ca0b247","name":"indexpattern-datasource-layer-19b05f1b-1187-4c55-abe1-a0bfc45d35f7","type":"index-pattern"}],"type":"lens","updated_at":"2023-02-08T22:00:21.379Z","version":"WzE2NywxXQ=="} + +{"attributes":{"state":{"adHocDataViews":{},"datasourceStates":{"formBased":{"layers":{"19b05f1b-1187-4c55-abe1-a0bfc45d35f7":{"columnOrder":["bf200ba8-e158-41b4-a701-1121910912e9","b39bfe4c-3699-4f11-a211-aa8cf6d19e1c"],"columns":{"b39bfe4c-3699-4f11-a211-aa8cf6d19e1c":{"dataType":"number","isBucketed":false,"label":"Median of bytes","operationType":"median","params":{"emptyAsNull":true},"scale":"ratio","sourceField":"bytes"},"bf200ba8-e158-41b4-a701-1121910912e9":{"dataType":"date","isBucketed":true,"label":"timestamp","operationType":"date_histogram","params":{"dropPartials":false,"includeEmptyRows":true,"interval":"auto"},"scale":"interval","sourceField":"timestamp"}},"incompleteColumns":{},"sampling":1}}},"textBased":{"layers":{}}},"filters":[],"internalReferences":[],"query":{"language":"kuery","query":""},"visualization":{"axisTitlesVisibilitySettings":{"x":true,"yLeft":true,"yRight":true},"fittingFunction":"None","gridlinesVisibilitySettings":{"x":true,"yLeft":true,"yRight":true},"labelsOrientation":{"x":0,"yLeft":0,"yRight":0},"layers":[{"accessors":["b39bfe4c-3699-4f11-a211-aa8cf6d19e1c"],"layerId":"19b05f1b-1187-4c55-abe1-a0bfc45d35f7","layerType":"data","position":"top","seriesType":"bar_stacked","showGridlines":false,"xAccessor":"bf200ba8-e158-41b4-a701-1121910912e9"}],"legend":{"isVisible":true,"position":"right"},"preferredSeriesType":"bar_stacked","tickLabelsVisibilitySettings":{"x":true,"yLeft":true,"yRight":true},"valueLabels":"hide"}},"title":"unknown visualization ID","visualizationType":"lnsUNKNOWN"},"coreMigrationVersion":"8.8.0","created_at":"2023-02-08T22:00:21.379Z","id":"40e08f60-a7f8-11ed-a593-e73d16536d96","migrationVersion":{"lens":"8.6.0"},"references":[{"id":"90943e30-9a47-11e8-b64d-95841ca0b247","name":"indexpattern-datasource-layer-19b05f1b-1187-4c55-abe1-a0bfc45d35f7","type":"index-pattern"}],"type":"lens","updated_at":"2023-02-08T22:00:21.379Z","version":"WzE2OCwxXQ=="} + +{"attributes":{"state":{"adHocDataViews":{},"datasourceStates":{"UNKNOWN":{"layers":{"19b05f1b-1187-4c55-abe1-a0bfc45d35f7":{"columnOrder":["bf200ba8-e158-41b4-a701-1121910912e9","b39bfe4c-3699-4f11-a211-aa8cf6d19e1c"],"columns":{"b39bfe4c-3699-4f11-a211-aa8cf6d19e1c":{"dataType":"number","isBucketed":false,"label":"Median of bytes","operationType":"median","params":{"emptyAsNull":true},"scale":"ratio","sourceField":"bytes"},"bf200ba8-e158-41b4-a701-1121910912e9":{"dataType":"date","isBucketed":true,"label":"timestamp","operationType":"date_histogram","params":{"dropPartials":false,"includeEmptyRows":true,"interval":"auto"},"scale":"interval","sourceField":"timestamp"}},"incompleteColumns":{},"sampling":1}}},"textBased":{"layers":{}}},"filters":[],"internalReferences":[],"query":{"language":"kuery","query":""},"visualization":{"axisTitlesVisibilitySettings":{"x":true,"yLeft":true,"yRight":true},"fittingFunction":"None","gridlinesVisibilitySettings":{"x":true,"yLeft":true,"yRight":true},"labelsOrientation":{"x":0,"yLeft":0,"yRight":0},"layers":[{"accessors":["b39bfe4c-3699-4f11-a211-aa8cf6d19e1c"],"layerId":"19b05f1b-1187-4c55-abe1-a0bfc45d35f7","layerType":"data","position":"top","seriesType":"bar_stacked","showGridlines":false,"xAccessor":"bf200ba8-e158-41b4-a701-1121910912e9"}],"legend":{"isVisible":true,"position":"right"},"preferredSeriesType":"bar_stacked","tickLabelsVisibilitySettings":{"x":true,"yLeft":true,"yRight":true},"valueLabels":"hide"}},"title":"unknown datasource ID","visualizationType":"lnsXY"},"coreMigrationVersion":"8.8.0","created_at":"2023-02-08T22:00:21.379Z","id":"49600170-a7f8-11ed-a593-e73d16536d96","migrationVersion":{"lens":"8.6.0"},"references":[{"id":"90943e30-9a47-11e8-b64d-95841ca0b247","name":"indexpattern-datasource-layer-19b05f1b-1187-4c55-abe1-a0bfc45d35f7","type":"index-pattern"}],"type":"lens","updated_at":"2023-02-08T22:00:21.379Z","version":"WzE2OSwxXQ=="} + +{"attributes":{"description":"","kibanaSavedObjectMeta":{"searchSourceJSON":"{\"query\":{\"query\":\"\",\"language\":\"kuery\"},\"filter\":[]}"},"optionsJSON":"{\"useMargins\":true,\"syncColors\":false,\"syncCursor\":true,\"syncTooltips\":false,\"hidePanelTitles\":false}","panelsJSON":"[{\"version\":\"8.8.0\",\"type\":\"lens\",\"gridData\":{\"x\":0,\"y\":0,\"w\":24,\"h\":15,\"i\":\"56667b2c-e6c4-49f7-9c07-e27e798d7fea\"},\"panelIndex\":\"56667b2c-e6c4-49f7-9c07-e27e798d7fea\",\"embeddableConfig\":{\"enhancements\":{}},\"panelRefName\":\"panel_56667b2c-e6c4-49f7-9c07-e27e798d7fea\"},{\"version\":\"8.8.0\",\"type\":\"lens\",\"gridData\":{\"x\":24,\"y\":0,\"w\":24,\"h\":15,\"i\":\"802298ec-2195-460c-a6ca-5b0a46271584\"},\"panelIndex\":\"802298ec-2195-460c-a6ca-5b0a46271584\",\"embeddableConfig\":{\"enhancements\":{}},\"panelRefName\":\"panel_802298ec-2195-460c-a6ca-5b0a46271584\"},{\"version\":\"8.8.0\",\"type\":\"lens\",\"gridData\":{\"x\":0,\"y\":15,\"w\":24,\"h\":15,\"i\":\"12060b3e-ec82-4c33-9f67-aa713e512211\"},\"panelIndex\":\"12060b3e-ec82-4c33-9f67-aa713e512211\",\"embeddableConfig\":{\"enhancements\":{}},\"panelRefName\":\"panel_12060b3e-ec82-4c33-9f67-aa713e512211\"}]","timeRestore":false,"title":"lens fundamental config errors dash","version":1},"coreMigrationVersion":"8.8.0","created_at":"2023-02-08T22:14:41.552Z","id":"674f1f40-a7f8-11ed-a593-e73d16536d96","migrationVersion":{"dashboard":"8.7.0"},"references":[{"id":"323d9ca0-a7f8-11ed-a593-e73d16536d96","name":"56667b2c-e6c4-49f7-9c07-e27e798d7fea:panel_56667b2c-e6c4-49f7-9c07-e27e798d7fea","type":"lens"},{"id":"40e08f60-a7f8-11ed-a593-e73d16536d96","name":"802298ec-2195-460c-a6ca-5b0a46271584:panel_802298ec-2195-460c-a6ca-5b0a46271584","type":"lens"},{"id":"49600170-a7f8-11ed-a593-e73d16536d96","name":"12060b3e-ec82-4c33-9f67-aa713e512211:panel_12060b3e-ec82-4c33-9f67-aa713e512211","type":"lens"}],"type":"dashboard","updated_at":"2023-02-08T22:14:41.552Z","version":"WzI0MCwxXQ=="} \ No newline at end of file