Graph Panel: Add feature toggle that will allow automatic migration to timeseries panel (#50631)

This commit is contained in:
Ryan McKinley 2022-06-10 17:12:56 -07:00 committed by GitHub
parent b6f97e8101
commit ae8dd73770
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 46 additions and 5 deletions

View File

@ -55,6 +55,7 @@ export interface FeatureToggles {
traceToMetrics?: boolean;
prometheusStreamingJSONParser?: boolean;
validateDashboardsOnSave?: boolean;
autoMigrateGraphPanels?: boolean;
prometheusWideSeries?: boolean;
canvasPanelNesting?: boolean;
cloudMonitoringExperimentalUI?: boolean;

View File

@ -221,6 +221,12 @@ var (
State: FeatureStateAlpha,
RequiresRestart: true,
},
{
Name: "autoMigrateGraphPanels",
Description: "Replace the angular graph panel with timeseries",
State: FeatureStateBeta,
FrontendOnly: true,
},
{
Name: "prometheusWideSeries",
Description: "Enable wide series responses in the Prometheus datasource",

View File

@ -163,6 +163,10 @@ const (
// Validate dashboard JSON POSTed to api/dashboards/db
FlagValidateDashboardsOnSave = "validateDashboardsOnSave"
// FlagAutoMigrateGraphPanels
// Replace the angular graph panel with timeseries
FlagAutoMigrateGraphPanels = "autoMigrateGraphPanels"
// FlagPrometheusWideSeries
// Enable wide series responses in the Prometheus datasource
FlagPrometheusWideSeries = "prometheusWideSeries"

View File

@ -163,6 +163,8 @@ export class PanelModel implements DataConfigSource, IPanelModel {
libraryPanel?: { uid: undefined; name: string } | PanelModelLibraryPanel;
autoMigrateFrom?: string;
// non persisted
isViewing = false;
isEditing = false;
@ -222,6 +224,12 @@ export class PanelModel implements DataConfigSource, IPanelModel {
(this as any)[property] = model[property];
}
// Special 'graph' migration logic
if (this.type === 'graph' && config?.featureToggles?.autoMigrateGraphPanels) {
this.autoMigrateFrom = this.type;
this.type = 'timeseries';
}
// defaults
defaultsDeep(this, cloneDeep(defaults));
@ -368,6 +376,18 @@ export class PanelModel implements DataConfigSource, IPanelModel {
this.plugin = plugin;
const version = getPluginVersion(plugin);
if (this.autoMigrateFrom) {
const wasAngular = this.autoMigrateFrom === 'graph';
this.callPanelTypeChangeHandler(
plugin,
this.autoMigrateFrom,
this.getOptionsToRemember(), // old options
wasAngular
);
delete this.autoMigrateFrom;
}
if (plugin.onPanelMigration) {
if (version !== this.pluginVersion) {
this.options = plugin.onPanelMigration(this);
@ -401,6 +421,19 @@ export class PanelModel implements DataConfigSource, IPanelModel {
};
}
// Let panel plugins inspect options from previous panel and keep any that it can use
private callPanelTypeChangeHandler(
newPlugin: PanelPlugin,
oldPluginId: string,
oldOptions: any,
wasAngular: boolean
) {
if (newPlugin.onPanelTypeChanged) {
const prevOptions = wasAngular ? { angular: oldOptions } : oldOptions.options;
Object.assign(this.options, newPlugin.onPanelTypeChanged(this, oldPluginId, prevOptions, this.fieldConfig));
}
}
changePlugin(newPlugin: PanelPlugin) {
const pluginId = newPlugin.meta.id;
const oldOptions: any = this.getOptionsToRemember();
@ -415,11 +448,8 @@ export class PanelModel implements DataConfigSource, IPanelModel {
this.clearPropertiesBeforePluginChange();
this.restorePanelOptions(pluginId);
// Let panel plugins inspect options from previous panel and keep any that it can use
if (newPlugin.onPanelTypeChanged) {
const prevOptions = wasAngular ? { angular: oldOptions } : oldOptions.options;
Object.assign(this.options, newPlugin.onPanelTypeChanged(this, oldPluginId, prevOptions, prevFieldConfig));
}
// Potentially modify current options
this.callPanelTypeChangeHandler(newPlugin, oldPluginId, oldOptions, wasAngular);
// switch
this.type = pluginId;