Skip to content

Commit 253495b

Browse files
TSVB doesn't communicate it's index-patterns to dashboard (#82964)
* TSVB doesn't communicate it's index-patterns to dashboard Closes: #81476 * useCustomSearchSource -> getUsedIndexPattern * fix CI Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com>
1 parent 228387c commit 253495b

6 files changed

Lines changed: 41 additions & 5 deletions

File tree

src/plugins/vis_type_timeseries/common/constants.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,3 +18,4 @@
1818
*/
1919

2020
export const MAX_BUCKETS_SETTING = 'metrics:max_buckets';
21+
export const INDEXES_SEPARATOR = ',';

src/plugins/vis_type_timeseries/public/metrics_type.ts

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,9 @@ import { EditorController } from './application';
2525
// @ts-ignore
2626
import { PANEL_TYPES } from '../common/panel_types';
2727
import { VisEditor } from './application/components/vis_editor_lazy';
28-
import { VIS_EVENT_TO_TRIGGER, VisGroups } from '../../visualizations/public';
28+
import { VIS_EVENT_TO_TRIGGER, VisGroups, VisParams } from '../../visualizations/public';
29+
import { getDataStart } from './services';
30+
import { INDEXES_SEPARATOR } from '../common/constants';
2931

3032
export const metricsVisDefinition = {
3133
name: 'metrics',
@@ -84,5 +86,21 @@ export const metricsVisDefinition = {
8486
return [VIS_EVENT_TO_TRIGGER.applyFilter];
8587
},
8688
inspectorAdapters: {},
89+
getUsedIndexPattern: async (params: VisParams) => {
90+
const { indexPatterns } = getDataStart();
91+
const indexes: string = params.index_pattern;
92+
93+
if (indexes) {
94+
const cachedIndexes = await indexPatterns.getIdsWithTitle();
95+
const ids = indexes
96+
.split(INDEXES_SEPARATOR)
97+
.map((title) => cachedIndexes.find((i) => i.title === title)?.id)
98+
.filter((id) => id);
99+
100+
return Promise.all(ids.map((id) => indexPatterns.get(id!)));
101+
}
102+
103+
return [];
104+
},
87105
responseHandler: 'none',
88106
};

src/plugins/visualizations/public/embeddable/create_vis_embeddable_from_object.ts

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ import {
4141
import { VisualizeEmbeddableFactoryDeps } from './visualize_embeddable_factory';
4242
import { VISUALIZE_ENABLE_LABS_SETTING } from '../../common/constants';
4343
import { SavedVisualizationsLoader } from '../saved_visualizations';
44+
import { IndexPattern } from '../../../data/public';
4445

4546
export const createVisEmbeddableFromObject = (deps: VisualizeEmbeddableFactoryDeps) => async (
4647
vis: Vis,
@@ -69,8 +70,14 @@ export const createVisEmbeddableFromObject = (deps: VisualizeEmbeddableFactoryDe
6970
return new DisabledLabEmbeddable(vis.title, input);
7071
}
7172

72-
const indexPattern = vis.data.indexPattern;
73-
const indexPatterns = indexPattern ? [indexPattern] : [];
73+
let indexPatterns: IndexPattern[] = [];
74+
75+
if (vis.type.getUsedIndexPattern) {
76+
indexPatterns = await vis.type.getUsedIndexPattern(vis.params);
77+
} else if (vis.data.indexPattern) {
78+
indexPatterns = [vis.data.indexPattern];
79+
}
80+
7481
const editable = getCapabilities().visualize.save as boolean;
7582

7683
return new VisualizeEmbeddable(

src/plugins/visualizations/public/vis.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -137,7 +137,6 @@ export class Vis<TVisParams = VisParams> {
137137
if (state.params || typeChanged) {
138138
this.params = this.getParams(state.params);
139139
}
140-
141140
if (state.data && state.data.searchSource) {
142141
this.data.searchSource = await getSearch().searchSource.create(state.data.searchSource!);
143142
this.data.indexPattern = this.data.searchSource.getField('index');

src/plugins/visualizations/public/vis_types/base_vis_type.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ interface CommonBaseVisTypeOptions<TVisParams>
4444
| 'editorConfig'
4545
| 'hidden'
4646
| 'stage'
47+
| 'getUsedIndexPattern'
4748
| 'useCustomNoDataScreen'
4849
| 'visConfig'
4950
| 'group'
@@ -96,6 +97,7 @@ export class BaseVisType<TVisParams = VisParams> implements VisType<TVisParams>
9697
public readonly responseHandler;
9798
public readonly hierarchicalData;
9899
public readonly setup;
100+
public readonly getUsedIndexPattern;
99101
public readonly useCustomNoDataScreen;
100102
public readonly inspectorAdapters;
101103
public readonly toExpressionAst;
@@ -126,6 +128,7 @@ export class BaseVisType<TVisParams = VisParams> implements VisType<TVisParams>
126128
this.responseHandler = opts.responseHandler ?? 'none';
127129
this.setup = opts.setup;
128130
this.hierarchicalData = opts.hierarchicalData ?? false;
131+
this.getUsedIndexPattern = opts.getUsedIndexPattern;
129132
this.useCustomNoDataScreen = opts.useCustomNoDataScreen ?? false;
130133
this.inspectorAdapters = opts.inspectorAdapters;
131134
this.toExpressionAst = opts.toExpressionAst;

src/plugins/visualizations/public/vis_types/types.ts

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,11 @@
2020
import { IconType } from '@elastic/eui';
2121
import React from 'react';
2222
import { Adapters } from 'src/plugins/inspector';
23+
import { IndexPattern } from 'src/plugins/data/public';
2324
import { VisEditorConstructor } from 'src/plugins/visualize/public';
2425
import { ISchemas } from 'src/plugins/vis_default_editor/public';
2526
import { TriggerContextMapping } from '../../../ui_actions/public';
26-
import { Vis, VisToExpressionAst, VisualizationControllerConstructor } from '../types';
27+
import { Vis, VisParams, VisToExpressionAst, VisualizationControllerConstructor } from '../types';
2728

2829
export interface VisTypeOptions {
2930
showTimePicker: boolean;
@@ -64,6 +65,13 @@ export interface VisType<TVisParams = unknown> {
6465
* If given, it will return the supported triggers for this vis.
6566
*/
6667
readonly getSupportedTriggers?: () => Array<keyof TriggerContextMapping>;
68+
69+
/**
70+
* Some visualizations are created without SearchSource and may change the used indexes during the visualization configuration.
71+
* Using this method we can rewrite the standard mechanism for getting used indexes
72+
*/
73+
readonly getUsedIndexPattern?: (visParams: VisParams) => IndexPattern[] | Promise<IndexPattern[]>;
74+
6775
readonly isAccessible?: boolean;
6876
readonly requestHandler?: string | unknown;
6977
readonly responseHandler?: string | unknown;

0 commit comments

Comments
 (0)