From d6887bf77f7849735acbfbdfcd209fdb2b416ed9 Mon Sep 17 00:00:00 2001 From: Ryan McKinley Date: Wed, 10 Apr 2019 23:02:22 -0700 Subject: [PATCH] Plugins: Optionally preload some plugins during frontend app boot (#15266) * auto load * update comments * gofmt * use preload from json * fix formatting * change general plugin loader to app * Refactoring: Plugin preloading #15266 --- pkg/api/frontendsettings.go | 17 +++++++++++++++++ pkg/plugins/models.go | 1 + public/app/app.ts | 6 ++++++ public/app/core/config.ts | 1 + .../features/plugins/partials/plugin_edit.html | 1 + public/app/features/plugins/plugin_loader.ts | 2 +- 6 files changed, 27 insertions(+), 1 deletion(-) diff --git a/pkg/api/frontendsettings.go b/pkg/api/frontendsettings.go index cd61c2f3ebc..e19c5732467 100644 --- a/pkg/api/frontendsettings.go +++ b/pkg/api/frontendsettings.go @@ -46,6 +46,14 @@ func (hs *HTTPServer) getFrontendSettingsMap(c *m.ReqContext) (map[string]interf return nil, err } + pluginsToPreload := []string{} + + for _, app := range enabledPlugins.Apps { + if app.Preload { + pluginsToPreload = append(pluginsToPreload, app.Module) + } + } + for _, ds := range orgDataSources { url := ds.Url @@ -66,6 +74,10 @@ func (hs *HTTPServer) getFrontendSettingsMap(c *m.ReqContext) (map[string]interf continue } + if meta.Preload { + pluginsToPreload = append(pluginsToPreload, meta.Module) + } + dsMap["meta"] = meta if ds.IsDefault { @@ -137,6 +149,10 @@ func (hs *HTTPServer) getFrontendSettingsMap(c *m.ReqContext) (map[string]interf continue } + if panel.Preload { + pluginsToPreload = append(pluginsToPreload, panel.Module) + } + panels[panel.Id] = map[string]interface{}{ "module": panel.Module, "baseUrl": panel.BaseUrl, @@ -169,6 +185,7 @@ func (hs *HTTPServer) getFrontendSettingsMap(c *m.ReqContext) (map[string]interf "viewersCanEdit": setting.ViewersCanEdit, "editorsCanAdmin": hs.Cfg.EditorsCanAdmin, "disableSanitizeHtml": hs.Cfg.DisableSanitizeHtml, + "pluginsToPreload": pluginsToPreload, "buildInfo": map[string]interface{}{ "version": setting.BuildVersion, "commit": setting.BuildCommit, diff --git a/pkg/plugins/models.go b/pkg/plugins/models.go index 5ac436205c1..feeae936680 100644 --- a/pkg/plugins/models.go +++ b/pkg/plugins/models.go @@ -46,6 +46,7 @@ type PluginBase struct { Module string `json:"module"` BaseUrl string `json:"baseUrl"` HideFromList bool `json:"hideFromList,omitempty"` + Preload bool `json:"preload"` State PluginState `json:"state,omitempty"` IncludedInAppId string `json:"-"` diff --git a/public/app/app.ts b/public/app/app.ts index a54c9270e2c..7e898e52339 100644 --- a/public/app/app.ts +++ b/public/app/app.ts @@ -21,6 +21,7 @@ import config from 'app/core/config'; import _ from 'lodash'; import moment from 'moment'; import { addClassIfNoOverlayScrollbar } from 'app/core/utils/scrollbar'; +import { importPluginModule } from 'app/features/plugins/plugin_loader'; // add move to lodash for backward compatabiltiy _.move = (array: [], fromIndex: number, toIndex: number) => { @@ -145,6 +146,11 @@ export class GrafanaApp { this.preBootModules = null; }); + + // Preload selected app plugins + for (const modulePath of config.pluginsToPreload) { + importPluginModule(modulePath); + } } } diff --git a/public/app/core/config.ts b/public/app/core/config.ts index 26c7fa17698..58aaedffa7c 100644 --- a/public/app/core/config.ts +++ b/public/app/core/config.ts @@ -40,6 +40,7 @@ export class Settings { editorsCanAdmin: boolean; disableSanitizeHtml: boolean; theme: GrafanaTheme; + pluginsToPreload: string[]; constructor(options: Settings) { this.theme = options.bootData.user.lightTheme ? getTheme(GrafanaThemeType.Light) : getTheme(GrafanaThemeType.Dark); diff --git a/public/app/features/plugins/partials/plugin_edit.html b/public/app/features/plugins/partials/plugin_edit.html index d84196c47b0..56e0769757e 100644 --- a/public/app/features/plugins/partials/plugin_edit.html +++ b/public/app/features/plugins/partials/plugin_edit.html @@ -17,6 +17,7 @@ + diff --git a/public/app/features/plugins/plugin_loader.ts b/public/app/features/plugins/plugin_loader.ts index dd7667f5ae0..dfd61e80c6d 100644 --- a/public/app/features/plugins/plugin_loader.ts +++ b/public/app/features/plugins/plugin_loader.ts @@ -141,7 +141,7 @@ for (const flotDep of flotDeps) { exposeToPlugin(flotDep, { fakeDep: 1 }); } -function importPluginModule(path: string): Promise { +export function importPluginModule(path: string): Promise { const builtIn = builtInPlugins[path]; if (builtIn) { return Promise.resolve(builtIn);