diff --git a/pkg/plugins/config/config.go b/pkg/plugins/config/config.go index 86be2011585..3c5d8908adc 100644 --- a/pkg/plugins/config/config.go +++ b/pkg/plugins/config/config.go @@ -54,39 +54,55 @@ type Cfg struct { HideAngularDeprecation []string ConcurrentQueryCount int + + UserFacingDefaultError string + + DataProxyRowLimit int64 + + SQLDatasourceMaxOpenConnsDefault int + SQLDatasourceMaxIdleConnsDefault int + SQLDatasourceMaxConnLifetimeDefault int } func NewCfg(devMode bool, pluginsPath string, pluginSettings setting.PluginSettings, pluginsAllowUnsigned []string, awsAllowedAuthProviders []string, awsAssumeRoleEnabled bool, awsExternalId string, awsSessionDuration string, awsListMetricsPageLimit string, AWSForwardSettingsPlugins []string, azure *azsettings.AzureSettings, secureSocksDSProxy setting.SecureSocksDSProxySettings, grafanaVersion string, logDatasourceRequests bool, pluginsCDNURLTemplate string, appURL string, appSubURL string, tracing Tracing, features featuremgmt.FeatureToggles, angularSupportEnabled bool, - grafanaComURL string, disablePlugins []string, hideAngularDeprecation []string, forwardHostEnvVars []string, concurrentQueryCount int, azureAuthEnabled bool) *Cfg { + grafanaComURL string, disablePlugins []string, hideAngularDeprecation []string, forwardHostEnvVars []string, concurrentQueryCount int, azureAuthEnabled bool, + userFacingDefaultError string, dataProxyRowLimit int64, + sqlDatasourceMaxOpenConnsDefault int, sqlDatasourceMaxIdleConnsDefault int, sqlDatasourceMaxConnLifetimeDefault int, +) *Cfg { return &Cfg{ - log: log.New("plugin.cfg"), - PluginsPath: pluginsPath, - BuildVersion: grafanaVersion, - DevMode: devMode, - PluginSettings: pluginSettings, - PluginsAllowUnsigned: pluginsAllowUnsigned, - DisablePlugins: disablePlugins, - AWSAllowedAuthProviders: awsAllowedAuthProviders, - AWSAssumeRoleEnabled: awsAssumeRoleEnabled, - AWSExternalId: awsExternalId, - AWSSessionDuration: awsSessionDuration, - AWSListMetricsPageLimit: awsListMetricsPageLimit, - AWSForwardSettingsPlugins: AWSForwardSettingsPlugins, - Azure: azure, - ProxySettings: secureSocksDSProxy, - LogDatasourceRequests: logDatasourceRequests, - PluginsCDNURLTemplate: pluginsCDNURLTemplate, - Tracing: tracing, - GrafanaComURL: grafanaComURL, - GrafanaAppURL: appURL, - GrafanaAppSubURL: appSubURL, - Features: features, - AngularSupportEnabled: angularSupportEnabled, - HideAngularDeprecation: hideAngularDeprecation, - ForwardHostEnvVars: forwardHostEnvVars, - ConcurrentQueryCount: concurrentQueryCount, - AzureAuthEnabled: azureAuthEnabled, + log: log.New("plugin.cfg"), + PluginsPath: pluginsPath, + BuildVersion: grafanaVersion, + DevMode: devMode, + PluginSettings: pluginSettings, + PluginsAllowUnsigned: pluginsAllowUnsigned, + DisablePlugins: disablePlugins, + AWSAllowedAuthProviders: awsAllowedAuthProviders, + AWSAssumeRoleEnabled: awsAssumeRoleEnabled, + AWSExternalId: awsExternalId, + AWSSessionDuration: awsSessionDuration, + AWSListMetricsPageLimit: awsListMetricsPageLimit, + AWSForwardSettingsPlugins: AWSForwardSettingsPlugins, + Azure: azure, + ProxySettings: secureSocksDSProxy, + LogDatasourceRequests: logDatasourceRequests, + PluginsCDNURLTemplate: pluginsCDNURLTemplate, + Tracing: tracing, + GrafanaComURL: grafanaComURL, + GrafanaAppURL: appURL, + GrafanaAppSubURL: appSubURL, + Features: features, + AngularSupportEnabled: angularSupportEnabled, + HideAngularDeprecation: hideAngularDeprecation, + ForwardHostEnvVars: forwardHostEnvVars, + ConcurrentQueryCount: concurrentQueryCount, + AzureAuthEnabled: azureAuthEnabled, + UserFacingDefaultError: userFacingDefaultError, + DataProxyRowLimit: dataProxyRowLimit, + SQLDatasourceMaxOpenConnsDefault: sqlDatasourceMaxOpenConnsDefault, + SQLDatasourceMaxIdleConnsDefault: sqlDatasourceMaxIdleConnsDefault, + SQLDatasourceMaxConnLifetimeDefault: sqlDatasourceMaxConnLifetimeDefault, } } diff --git a/pkg/plugins/envvars/envvars.go b/pkg/plugins/envvars/envvars.go index 62c769290f8..9913b1a9b70 100644 --- a/pkg/plugins/envvars/envvars.go +++ b/pkg/plugins/envvars/envvars.go @@ -100,6 +100,8 @@ func (s *Service) Get(ctx context.Context, p *plugins.Plugin) []string { } // GetConfigMap returns a map of configuration that should be passed in a plugin request. +// +//nolint:gocyclo func (s *Service) GetConfigMap(ctx context.Context, pluginID string, _ *auth.ExternalService) map[string]string { m := make(map[string]string) @@ -110,6 +112,18 @@ func (s *Service) GetConfigMap(ctx context.Context, pluginID string, _ *auth.Ext m[backend.ConcurrentQueryCount] = strconv.Itoa(s.cfg.ConcurrentQueryCount) } + if s.cfg.UserFacingDefaultError != "" { + m[backend.UserFacingDefaultError] = s.cfg.UserFacingDefaultError + } + + if s.cfg.DataProxyRowLimit != 0 { + m[backend.SQLRowLimit] = strconv.FormatInt(s.cfg.DataProxyRowLimit, 10) + } + + m[backend.SQLMaxOpenConnsDefault] = strconv.Itoa(s.cfg.SQLDatasourceMaxOpenConnsDefault) + m[backend.SQLMaxIdleConnsDefault] = strconv.Itoa(s.cfg.SQLDatasourceMaxIdleConnsDefault) + m[backend.SQLMaxConnLifetimeSecondsDefault] = strconv.Itoa(s.cfg.SQLDatasourceMaxConnLifetimeDefault) + // TODO add support via plugin SDK // if externalService != nil { // m[oauthtokenretriever.AppURL] = s.cfg.GrafanaAppURL diff --git a/pkg/plugins/envvars/envvars_test.go b/pkg/plugins/envvars/envvars_test.go index 2fb0b52aca0..ed775d0ff7b 100644 --- a/pkg/plugins/envvars/envvars_test.go +++ b/pkg/plugins/envvars/envvars_test.go @@ -671,6 +671,18 @@ func TestInitalizer_azureEnvVars(t *testing.T) { }) } +func TestService_GetConfigMap_Defaults(t *testing.T) { + s := &Service{ + cfg: &config.Cfg{}, + } + + require.Equal(t, map[string]string{ + "GF_SQL_MAX_OPEN_CONNS_DEFAULT": "0", + "GF_SQL_MAX_IDLE_CONNS_DEFAULT": "0", + "GF_SQL_MAX_CONN_LIFETIME_SECONDS_DEFAULT": "0", + }, s.GetConfigMap(context.Background(), "", nil)) +} + func TestService_GetConfigMap(t *testing.T) { tcs := []struct { name string @@ -806,6 +818,42 @@ func TestService_GetConfigMap_appURL(t *testing.T) { }) } +func TestService_GetConfigMap_SQL(t *testing.T) { + t.Run("Uses the configured values", func(t *testing.T) { + s := &Service{ + cfg: &config.Cfg{ + DataProxyRowLimit: 23, + SQLDatasourceMaxOpenConnsDefault: 24, + SQLDatasourceMaxIdleConnsDefault: 25, + SQLDatasourceMaxConnLifetimeDefault: 26, + }, + } + + require.Subset(t, s.GetConfigMap(context.Background(), "", nil), map[string]string{ + "GF_SQL_ROW_LIMIT": "23", + "GF_SQL_MAX_OPEN_CONNS_DEFAULT": "24", + "GF_SQL_MAX_IDLE_CONNS_DEFAULT": "25", + "GF_SQL_MAX_CONN_LIFETIME_SECONDS_DEFAULT": "26", + }) + }) + + t.Run("Uses the configured max-default-values, even when they are zero", func(t *testing.T) { + s := &Service{ + cfg: &config.Cfg{ + SQLDatasourceMaxOpenConnsDefault: 0, + SQLDatasourceMaxIdleConnsDefault: 0, + SQLDatasourceMaxConnLifetimeDefault: 0, + }, + } + + require.Equal(t, map[string]string{ + "GF_SQL_MAX_OPEN_CONNS_DEFAULT": "0", + "GF_SQL_MAX_IDLE_CONNS_DEFAULT": "0", + "GF_SQL_MAX_CONN_LIFETIME_SECONDS_DEFAULT": "0", + }, s.GetConfigMap(context.Background(), "", nil)) + }) +} + func TestService_GetConfigMap_concurrentQueryCount(t *testing.T) { t.Run("Uses the configured concurrent query count", func(t *testing.T) { s := &Service{ diff --git a/pkg/services/pluginsintegration/config/config.go b/pkg/services/pluginsintegration/config/config.go index cc5cb7e5ea3..7c269dd31cf 100644 --- a/pkg/services/pluginsintegration/config/config.go +++ b/pkg/services/pluginsintegration/config/config.go @@ -63,6 +63,11 @@ func ProvideConfig(settingProvider setting.Provider, grafanaCfg *setting.Cfg, fe grafanaCfg.ForwardHostEnvVars, grafanaCfg.ConcurrentQueryCount, grafanaCfg.AzureAuthEnabled, + grafanaCfg.UserFacingDefaultError, + grafanaCfg.DataProxyRowLimit, + grafanaCfg.SqlDatasourceMaxOpenConnsDefault, + grafanaCfg.SqlDatasourceMaxIdleConnsDefault, + grafanaCfg.SqlDatasourceMaxConnLifetimeDefault, ), nil }