From 5023131088ee42cc66ed197ce14c2f45bd88603b Mon Sep 17 00:00:00 2001 From: Chris Davies Date: Tue, 15 Oct 2019 23:02:18 -0400 Subject: [PATCH] [Lens] Add date histogram interval to column name (#48271) --- .../expression.tsx | 11 +- .../visualization.tsx | 7 - .../public/indexpattern_plugin/auto_date.ts | 86 ++++++++ .../indexpattern_plugin/indexpattern.test.ts | 2 +- .../indexpattern_suggestions.test.tsx | 4 +- .../definitions/date_histogram.test.tsx | 4 +- .../operations/definitions/date_histogram.tsx | 17 +- .../public/indexpattern_plugin/plugin.tsx | 2 + .../rename_columns.test.ts | 186 +++++++++++------- .../indexpattern_plugin/rename_columns.ts | 46 ++++- .../indexpattern_plugin/to_expression.ts | 14 +- .../__snapshots__/xy_expression.test.tsx.snap | 14 +- .../xy_visualization_plugin/xy_expression.tsx | 4 +- .../es_archives/lens/basic/data.json.gz | Bin 2957 -> 3004 bytes .../es_archives/lens/basic/mappings.json | 153 +++++++++++++- .../es_archives/lens/reporting/data.json.gz | Bin 4464 -> 4542 bytes .../es_archives/lens/reporting/mappings.json | 144 +++++++++++++- 17 files changed, 563 insertions(+), 131 deletions(-) create mode 100644 x-pack/legacy/plugins/lens/public/indexpattern_plugin/auto_date.ts diff --git a/x-pack/legacy/plugins/lens/public/datatable_visualization_plugin/expression.tsx b/x-pack/legacy/plugins/lens/public/datatable_visualization_plugin/expression.tsx index d7d445b3f8df5..23b49ecc168cc 100644 --- a/x-pack/legacy/plugins/lens/public/datatable_visualization_plugin/expression.tsx +++ b/x-pack/legacy/plugins/lens/public/datatable_visualization_plugin/expression.tsx @@ -17,7 +17,6 @@ import { VisualizationContainer } from '../visualization_container'; export interface DatatableColumns { columnIds: string[]; - labels: string[]; } interface Args { @@ -95,11 +94,6 @@ export const datatableColumns: ExpressionFunction< multi: true, help: '', }, - labels: { - types: ['string'], - multi: true, - help: '', - }, }, fn: function fn(_context: unknown, args: DatatableColumns) { return { @@ -138,10 +132,11 @@ function DatatableComponent(props: DatatableProps & { formatFactory: FormatFacto className="lnsDataTable" data-test-subj="lnsDataTable" columns={props.args.columns.columnIds - .map((field, index) => { + .map(field => { + const col = firstTable.columns.find(c => c.id === field); return { field, - name: props.args.columns.labels[index], + name: (col && col.name) || '', }; }) .filter(({ field }) => !!field)} diff --git a/x-pack/legacy/plugins/lens/public/datatable_visualization_plugin/visualization.tsx b/x-pack/legacy/plugins/lens/public/datatable_visualization_plugin/visualization.tsx index 18a6d112e14d6..ff809e9e4827c 100644 --- a/x-pack/legacy/plugins/lens/public/datatable_visualization_plugin/visualization.tsx +++ b/x-pack/legacy/plugins/lens/public/datatable_visualization_plugin/visualization.tsx @@ -212,13 +212,6 @@ export const datatableVisualization: Visualization< function: 'lens_datatable_columns', arguments: { columnIds: operations.map(o => o.columnId), - labels: operations.map( - o => - o.operation.label || - i18n.translate('xpack.lens.datatable.na', { - defaultMessage: 'N/A', - }) - ), }, }, ], diff --git a/x-pack/legacy/plugins/lens/public/indexpattern_plugin/auto_date.ts b/x-pack/legacy/plugins/lens/public/indexpattern_plugin/auto_date.ts new file mode 100644 index 0000000000000..359c6d7c35c3a --- /dev/null +++ b/x-pack/legacy/plugins/lens/public/indexpattern_plugin/auto_date.ts @@ -0,0 +1,86 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { TimeBuckets } from 'ui/time_buckets'; +import dateMath from '@elastic/datemath'; +import { + ExpressionFunction, + KibanaContext, +} from '../../../../../../src/plugins/expressions/common'; + +interface LensAutoDateProps { + aggConfigs: string; +} + +export function getAutoInterval(ctx?: KibanaContext | null) { + if (!ctx || !ctx.timeRange) { + return; + } + + const { timeRange } = ctx; + const buckets = new TimeBuckets(); + buckets.setInterval('auto'); + buckets.setBounds({ + min: dateMath.parse(timeRange.from), + max: dateMath.parse(timeRange.to, { roundUp: true }), + }); + + return buckets.getInterval(); +} + +/** + * Convert all 'auto' date histograms into a concrete value (e.g. 2h). + * This allows us to support 'auto' on all date fields, and opens the + * door to future customizations (e.g. adjusting the level of detail, etc). + */ +export const autoDate: ExpressionFunction< + 'lens_auto_date', + KibanaContext | null, + LensAutoDateProps, + string +> = { + name: 'lens_auto_date', + aliases: [], + help: '', + context: { + types: ['kibana_context', 'null'], + }, + args: { + aggConfigs: { + types: ['string'], + default: '""', + help: '', + }, + }, + fn(ctx: KibanaContext, args: LensAutoDateProps) { + const interval = getAutoInterval(ctx); + + if (!interval) { + return args.aggConfigs; + } + + const configs = JSON.parse(args.aggConfigs) as Array<{ + type: string; + params: { interval: string }; + }>; + + const updatedConfigs = configs.map(c => { + if (c.type !== 'date_histogram' || !c.params || c.params.interval !== 'auto') { + return c; + } + + return { + ...c, + params: { + ...c.params, + interval: interval.expression, + }, + }; + }); + + return JSON.stringify(updatedConfigs); + }, +}; diff --git a/x-pack/legacy/plugins/lens/public/indexpattern_plugin/indexpattern.test.ts b/x-pack/legacy/plugins/lens/public/indexpattern_plugin/indexpattern.test.ts index 70a0372c028d6..845cfa29d5724 100644 --- a/x-pack/legacy/plugins/lens/public/indexpattern_plugin/indexpattern.test.ts +++ b/x-pack/legacy/plugins/lens/public/indexpattern_plugin/indexpattern.test.ts @@ -272,7 +272,7 @@ describe('IndexPattern Data Source', () => { metricsAtAllLevels=false partialRows=false includeFormatHints=true - aggConfigs='[{\\"id\\":\\"col1\\",\\"enabled\\":true,\\"type\\":\\"count\\",\\"schema\\":\\"metric\\",\\"params\\":{}},{\\"id\\":\\"col2\\",\\"enabled\\":true,\\"type\\":\\"date_histogram\\",\\"schema\\":\\"segment\\",\\"params\\":{\\"field\\":\\"timestamp\\",\\"useNormalizedEsInterval\\":true,\\"interval\\":\\"1d\\",\\"drop_partials\\":false,\\"min_doc_count\\":0,\\"extended_bounds\\":{}}}]' | lens_rename_columns idMap='{\\"col-0-col1\\":\\"col1\\",\\"col-1-col2\\":\\"col2\\"}'" + aggConfigs={lens_auto_date aggConfigs='[{\\"id\\":\\"col1\\",\\"enabled\\":true,\\"type\\":\\"count\\",\\"schema\\":\\"metric\\",\\"params\\":{}},{\\"id\\":\\"col2\\",\\"enabled\\":true,\\"type\\":\\"date_histogram\\",\\"schema\\":\\"segment\\",\\"params\\":{\\"field\\":\\"timestamp\\",\\"useNormalizedEsInterval\\":true,\\"interval\\":\\"1d\\",\\"drop_partials\\":false,\\"min_doc_count\\":0,\\"extended_bounds\\":{}}}]'} | lens_rename_columns idMap='{\\"col-0-col1\\":{\\"label\\":\\"Count of Documents\\",\\"dataType\\":\\"number\\",\\"isBucketed\\":false,\\"operationType\\":\\"count\\",\\"id\\":\\"col1\\"},\\"col-1-col2\\":{\\"label\\":\\"Date\\",\\"dataType\\":\\"date\\",\\"isBucketed\\":true,\\"operationType\\":\\"date_histogram\\",\\"sourceField\\":\\"timestamp\\",\\"params\\":{\\"interval\\":\\"1d\\"},\\"id\\":\\"col2\\"}}'" `); }); }); diff --git a/x-pack/legacy/plugins/lens/public/indexpattern_plugin/indexpattern_suggestions.test.tsx b/x-pack/legacy/plugins/lens/public/indexpattern_plugin/indexpattern_suggestions.test.tsx index 08993c15f5c60..ff6911bd25f84 100644 --- a/x-pack/legacy/plugins/lens/public/indexpattern_plugin/indexpattern_suggestions.test.tsx +++ b/x-pack/legacy/plugins/lens/public/indexpattern_plugin/indexpattern_suggestions.test.tsx @@ -1056,7 +1056,7 @@ describe('IndexPattern Data Source suggestions', () => { { columnId: 'id1', operation: { - label: 'Date histogram of timestamp', + label: 'timestamp', dataType: 'date', isBucketed: true, scale: 'interval', @@ -1132,7 +1132,7 @@ describe('IndexPattern Data Source suggestions', () => { { columnId: 'id1', operation: { - label: 'Date histogram of timestamp', + label: 'timestamp', dataType: 'date', isBucketed: true, scale: 'interval', diff --git a/x-pack/legacy/plugins/lens/public/indexpattern_plugin/operations/definitions/date_histogram.test.tsx b/x-pack/legacy/plugins/lens/public/indexpattern_plugin/operations/definitions/date_histogram.test.tsx index e9ea50c9273ee..f984597a8eb4b 100644 --- a/x-pack/legacy/plugins/lens/public/indexpattern_plugin/operations/definitions/date_histogram.test.tsx +++ b/x-pack/legacy/plugins/lens/public/indexpattern_plugin/operations/definitions/date_histogram.test.tsx @@ -136,7 +136,7 @@ describe('date_histogram', () => { expect(column.params.interval).toEqual('auto'); }); - it('should create column object with manual interval for non-primary time fields', () => { + it('should create column object with auto interval for non-primary time fields', () => { const column = dateHistogramOperation.buildColumn({ columns: {}, suggestedPriority: 0, @@ -150,7 +150,7 @@ describe('date_histogram', () => { searchable: true, }, }); - expect(column.params.interval).toEqual('d'); + expect(column.params.interval).toEqual('auto'); }); it('should create column object with restrictions', () => { diff --git a/x-pack/legacy/plugins/lens/public/indexpattern_plugin/operations/definitions/date_histogram.tsx b/x-pack/legacy/plugins/lens/public/indexpattern_plugin/operations/definitions/date_histogram.tsx index fb91ac593650c..89c4899bb8e56 100644 --- a/x-pack/legacy/plugins/lens/public/indexpattern_plugin/operations/definitions/date_histogram.tsx +++ b/x-pack/legacy/plugins/lens/public/indexpattern_plugin/operations/definitions/date_histogram.tsx @@ -29,13 +29,6 @@ const FixedEuiRange = (EuiRange as unknown) as React.ComponentType< } >; -function ofName(name: string) { - return i18n.translate('xpack.lens.indexPattern.dateHistogramOf', { - defaultMessage: 'Date histogram of {name}', - values: { name }, - }); -} - function supportsAutoInterval(fieldName: string, indexPattern: IndexPattern): boolean { return indexPattern.timeFieldName ? indexPattern.timeFieldName === fieldName : false; } @@ -67,7 +60,7 @@ export const dateHistogramOperation: OperationDefinition { return { ...oldColumn, - label: ofName(field.name), + label: field.name, sourceField: field.name, params: { ...oldColumn.params, @@ -172,8 +165,6 @@ export const dateHistogramOperation: OperationDefinition - {fieldAllowsAutoInterval && ( + {!intervalIsRestricted && ( renameColumns); + interpreter.functionsRegistry.register(() => autoDate); } stop() {} diff --git a/x-pack/legacy/plugins/lens/public/indexpattern_plugin/rename_columns.test.ts b/x-pack/legacy/plugins/lens/public/indexpattern_plugin/rename_columns.test.ts index 641b1ceb431fb..74de89d584d2b 100644 --- a/x-pack/legacy/plugins/lens/public/indexpattern_plugin/rename_columns.test.ts +++ b/x-pack/legacy/plugins/lens/public/indexpattern_plugin/rename_columns.test.ts @@ -16,43 +16,49 @@ describe('rename_columns', () => { }; const idMap = { - a: 'b', - b: 'c', + a: { + id: 'b', + label: 'Austrailia', + }, + b: { + id: 'c', + label: 'Boomerang', + }, }; expect(renameColumns.fn(input, { idMap: JSON.stringify(idMap) }, {})).toMatchInlineSnapshot(` -Object { - "columns": Array [ - Object { - "id": "b", - "name": "A", - }, - Object { - "id": "c", - "name": "B", - }, - ], - "rows": Array [ - Object { - "b": 1, - "c": 2, - }, - Object { - "b": 3, - "c": 4, - }, - Object { - "b": 5, - "c": 6, - }, - Object { - "b": 7, - "c": 8, - }, - ], - "type": "kibana_datatable", -} -`); + Object { + "columns": Array [ + Object { + "id": "b", + "name": "Austrailia", + }, + Object { + "id": "c", + "name": "Boomerang", + }, + ], + "rows": Array [ + Object { + "b": 1, + "c": 2, + }, + Object { + "b": 3, + "c": 4, + }, + Object { + "b": 5, + "c": 6, + }, + Object { + "b": 7, + "c": 8, + }, + ], + "type": "kibana_datatable", + } + `); }); it('should keep columns which are not mapped', () => { @@ -63,41 +69,87 @@ Object { }; const idMap = { - b: 'c', + b: { id: 'c', label: 'Catamaran' }, }; expect(renameColumns.fn(input, { idMap: JSON.stringify(idMap) }, {})).toMatchInlineSnapshot(` -Object { - "columns": Array [ - Object { - "id": "a", - "name": "A", - }, - Object { - "id": "c", - "name": "B", - }, - ], - "rows": Array [ - Object { - "a": 1, - "c": 2, - }, - Object { - "a": 3, - "c": 4, - }, - Object { - "a": 5, - "c": 6, - }, - Object { - "a": 7, - "c": 8, - }, - ], - "type": "kibana_datatable", -} -`); + Object { + "columns": Array [ + Object { + "id": "a", + "name": "A", + }, + Object { + "id": "c", + "name": "Catamaran", + }, + ], + "rows": Array [ + Object { + "a": 1, + "c": 2, + }, + Object { + "a": 3, + "c": 4, + }, + Object { + "a": 5, + "c": 6, + }, + Object { + "a": 7, + "c": 8, + }, + ], + "type": "kibana_datatable", + } + `); + }); + + it('should rename date histograms', () => { + const input: KibanaDatatable = { + type: 'kibana_datatable', + columns: [{ id: 'a', name: 'A' }, { id: 'b', name: 'banana per 30 seconds' }], + rows: [{ a: 1, b: 2 }, { a: 3, b: 4 }, { a: 5, b: 6 }, { a: 7, b: 8 }], + }; + + const idMap = { + b: { id: 'c', label: 'Apple', operationType: 'date_histogram', sourceField: 'banana' }, + }; + + expect(renameColumns.fn(input, { idMap: JSON.stringify(idMap) }, {})).toMatchInlineSnapshot(` + Object { + "columns": Array [ + Object { + "id": "a", + "name": "A", + }, + Object { + "id": "c", + "name": "Apple per 30 seconds", + }, + ], + "rows": Array [ + Object { + "a": 1, + "c": 2, + }, + Object { + "a": 3, + "c": 4, + }, + Object { + "a": 5, + "c": 6, + }, + Object { + "a": 7, + "c": 8, + }, + ], + "type": "kibana_datatable", + } + `); }); }); diff --git a/x-pack/legacy/plugins/lens/public/indexpattern_plugin/rename_columns.ts b/x-pack/legacy/plugins/lens/public/indexpattern_plugin/rename_columns.ts index 4a54bcad56163..87e51cb62ba1d 100644 --- a/x-pack/legacy/plugins/lens/public/indexpattern_plugin/rename_columns.ts +++ b/x-pack/legacy/plugins/lens/public/indexpattern_plugin/rename_columns.ts @@ -5,12 +5,19 @@ */ import { i18n } from '@kbn/i18n'; -import { ExpressionFunction, KibanaDatatable } from 'src/legacy/core_plugins/interpreter/public'; +import { + ExpressionFunction, + KibanaDatatable, + KibanaDatatableColumn, +} from 'src/legacy/core_plugins/interpreter/public'; +import { IndexPatternColumn } from './operations'; interface RemapArgs { idMap: string; } +export type OriginalColumn = { id: string } & IndexPatternColumn; + export const renameColumns: ExpressionFunction< 'lens_rename_columns', KibanaDatatable, @@ -35,18 +42,19 @@ export const renameColumns: ExpressionFunction< types: ['kibana_datatable'], }, fn(data: KibanaDatatable, { idMap: encodedIdMap }: RemapArgs) { - const idMap = JSON.parse(encodedIdMap) as Record; + const idMap = JSON.parse(encodedIdMap) as Record; + return { type: 'kibana_datatable', rows: data.rows.map(row => { const mappedRow: Record = {}; Object.entries(idMap).forEach(([fromId, toId]) => { - mappedRow[toId] = row[fromId]; + mappedRow[toId.id] = row[fromId]; }); Object.entries(row).forEach(([id, value]) => { if (id in idMap) { - mappedRow[idMap[id]] = value; + mappedRow[idMap[id].id] = value; } else { mappedRow[id] = value; } @@ -54,10 +62,32 @@ export const renameColumns: ExpressionFunction< return mappedRow; }), - columns: data.columns.map(column => ({ - ...column, - id: idMap[column.id] ? idMap[column.id] : column.id, - })), + columns: data.columns.map(column => { + const mappedItem = idMap[column.id]; + + if (!mappedItem) { + return column; + } + + return { + ...column, + id: mappedItem.id, + name: getColumnName(mappedItem, column), + }; + }), }; }, }; + +function getColumnName(originalColumn: OriginalColumn, newColumn: KibanaDatatableColumn) { + if (originalColumn && originalColumn.operationType === 'date_histogram') { + const fieldName = originalColumn.sourceField; + + // HACK: This is a hack, and introduces some fragility into + // column naming. Eventually, this should be calculated and + // built more systematically. + return newColumn.name.replace(fieldName, originalColumn.label); + } + + return originalColumn.label; +} diff --git a/x-pack/legacy/plugins/lens/public/indexpattern_plugin/to_expression.ts b/x-pack/legacy/plugins/lens/public/indexpattern_plugin/to_expression.ts index 8045ab89b63d4..f4fa9b3862733 100644 --- a/x-pack/legacy/plugins/lens/public/indexpattern_plugin/to_expression.ts +++ b/x-pack/legacy/plugins/lens/public/indexpattern_plugin/to_expression.ts @@ -8,10 +8,10 @@ import _ from 'lodash'; import { IndexPatternColumn } from './indexpattern'; import { operationDefinitionMap } from './operations'; import { IndexPattern, IndexPatternPrivateState } from './types'; +import { OriginalColumn } from './rename_columns'; function getExpressionForLayer( indexPattern: IndexPattern, - layerId: string, columns: Record, columnOrder: string[] ) { @@ -34,10 +34,13 @@ function getExpressionForLayer( (currentIdMap, [colId], index) => { return { ...currentIdMap, - [`col-${index}-${colId}`]: colId, + [`col-${index}-${colId}`]: { + ...columns[colId], + id: colId, + }, }; }, - {} as Record + {} as Record ); return `esaggs @@ -45,7 +48,9 @@ function getExpressionForLayer( metricsAtAllLevels=false partialRows=false includeFormatHints=true - aggConfigs='${JSON.stringify(aggs)}' | lens_rename_columns idMap='${JSON.stringify(idMap)}'`; + aggConfigs={lens_auto_date aggConfigs='${JSON.stringify( + aggs + )}'} | lens_rename_columns idMap='${JSON.stringify(idMap)}'`; } return null; @@ -55,7 +60,6 @@ export function toExpression(state: IndexPatternPrivateState, layerId: string) { if (state.layers[layerId]) { return getExpressionForLayer( state.indexPatterns[state.layers[layerId].indexPatternId], - layerId, state.layers[layerId].columns, state.layers[layerId].columnOrder ); diff --git a/x-pack/legacy/plugins/lens/public/xy_visualization_plugin/__snapshots__/xy_expression.test.tsx.snap b/x-pack/legacy/plugins/lens/public/xy_visualization_plugin/__snapshots__/xy_expression.test.tsx.snap index 8a79240159b2e..473ee16ffe0c3 100644 --- a/x-pack/legacy/plugins/lens/public/xy_visualization_plugin/__snapshots__/xy_expression.test.tsx.snap +++ b/x-pack/legacy/plugins/lens/public/xy_visualization_plugin/__snapshots__/xy_expression.test.tsx.snap @@ -135,7 +135,7 @@ exports[`xy_expression XYChart component it renders area 1`] = ` position="bottom" showGridLines={false} tickFormat={[Function]} - title="" + title="c" /> 1 || data.tables[layers[0].layerId].columns.length > 2; const shouldRotate = isHorizontalChart(layers); + const xTitle = (xAxisColumn && xAxisColumn.name) || args.xTitle; + return ( xAxisFormatter.convert(d)} diff --git a/x-pack/test/functional/es_archives/lens/basic/data.json.gz b/x-pack/test/functional/es_archives/lens/basic/data.json.gz index 992bf7c85e9fd7046b0fe3a3cf63b0297070baea..a5079d92e77f082ca2a30559e9a8c1bbcace01ff 100644 GIT binary patch delta 2849 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 delta 2823 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 CAf1T- diff --git a/x-pack/test/functional/es_archives/lens/reporting/mappings.json b/x-pack/test/functional/es_archives/lens/reporting/mappings.json index 14882ee507261..0321d57bc2df6 100644 --- a/x-pack/test/functional/es_archives/lens/reporting/mappings.json +++ b/x-pack/test/functional/es_archives/lens/reporting/mappings.json @@ -18,10 +18,12 @@ "graph-workspace": "cd7ba1330e6682e9cc00b78850874be1", "index-pattern": "66eccb05066c5a89924f48a9e9736499", "infrastructure-ui-source": "ddc0ecb18383f6b26101a2fadb2dab0c", + "inventory-view": "84b320fd67209906333ffce261128462", "kql-telemetry": "d12a98a6f19a2d273696597547e064ee", - "lens": "d69713426be87ba23283776aab149b9a", + "lens": "21c3ea0763beb1ecb0162529706b88c5", "map": "23d7aa4a720d4938ccde3983f87bd58d", "maps-telemetry": "a4229f8b16a6820c6d724b7e0c1f729d", + "metrics-explorer-view": "53c5365793677328df0ccb6138bf3cdd", "migrationVersion": "4a1746014a75ade3a714e1db5763276f", "ml-telemetry": "257fd1d4b4fdbb9cb4b8a3b27da201e9", "namespace": "2f4316de49999235636386fe51dc06c1", @@ -455,6 +457,77 @@ } } }, + "inventory-view": { + "properties": { + "autoBounds": { + "type": "boolean" + }, + "autoReload": { + "type": "boolean" + }, + "boundsOverride": { + "properties": { + "max": { + "type": "integer" + }, + "min": { + "type": "integer" + } + } + }, + "customOptions": { + "properties": { + "field": { + "type": "keyword" + }, + "text": { + "type": "keyword" + } + }, + "type": "nested" + }, + "filterQuery": { + "properties": { + "expression": { + "type": "keyword" + }, + "kind": { + "type": "keyword" + } + } + }, + "groupBy": { + "properties": { + "field": { + "type": "keyword" + }, + "label": { + "type": "keyword" + } + }, + "type": "nested" + }, + "metric": { + "properties": { + "type": { + "type": "keyword" + } + } + }, + "name": { + "type": "keyword" + }, + "nodeType": { + "type": "keyword" + }, + "time": { + "type": "integer" + }, + "view": { + "type": "keyword" + } + } + }, "kql-telemetry": { "properties": { "optInCount": { @@ -472,8 +545,7 @@ "type": "keyword" }, "state": { - "enabled": false, - "type": "object" + "type": "flattened" }, "title": { "type": "text" @@ -556,6 +628,72 @@ } } }, + "metrics-explorer-view": { + "properties": { + "chartOptions": { + "properties": { + "stack": { + "type": "boolean" + }, + "type": { + "type": "keyword" + }, + "yAxisMode": { + "type": "keyword" + } + } + }, + "currentTimerange": { + "properties": { + "from": { + "type": "keyword" + }, + "interval": { + "type": "keyword" + }, + "to": { + "type": "keyword" + } + } + }, + "name": { + "type": "keyword" + }, + "options": { + "properties": { + "aggregation": { + "type": "keyword" + }, + "filterQuery": { + "type": "keyword" + }, + "groupBy": { + "type": "keyword" + }, + "limit": { + "type": "integer" + }, + "metrics": { + "properties": { + "aggregation": { + "type": "keyword" + }, + "color": { + "type": "keyword" + }, + "field": { + "type": "keyword" + }, + "label": { + "type": "keyword" + } + }, + "type": "nested" + } + } + } + } + }, "migrationVersion": { "dynamic": "true", "properties": {