diff --git a/conf/defaults.ini b/conf/defaults.ini index 52b9a4f2ed3..c825f2374d2 100644 --- a/conf/defaults.ini +++ b/conf/defaults.ini @@ -593,8 +593,10 @@ enabled = true #################################### Internal Grafana Metrics ############ # Metrics available at HTTP API Url /metrics [metrics] -enabled = true -interval_seconds = 10 +enabled = true +interval_seconds = 10 +# Disable total stats (stat_totals_*) metrics to be generated +disable_total_stats = false #If both are set, basic auth will be required for the metrics endpoint. basic_auth_username = diff --git a/conf/sample.ini b/conf/sample.ini index 31468bfa15b..b215a4fb02d 100644 --- a/conf/sample.ini +++ b/conf/sample.ini @@ -526,6 +526,8 @@ [metrics] # Disable / Enable internal metrics ;enabled = true +# Disable total stats (stat_totals_*) metrics to be generated +;disable_total_stats = false # Publish interval ;interval_seconds = 10 diff --git a/docs/sources/installation/configuration.md b/docs/sources/installation/configuration.md index 3c4eceaaab6..f4a2a61a468 100644 --- a/docs/sources/installation/configuration.md +++ b/docs/sources/installation/configuration.md @@ -548,6 +548,9 @@ If set configures the username to use for basic authentication on the metrics en ### basic_auth_password If set configures the password to use for basic authentication on the metrics endpoint. +### disable_total_stats +If set to `true`, then total stats generation (`stat_totals_*` metrics) is disabled. The default is `false`. + ### interval_seconds Flush/Write interval when sending metrics to external TSDB. Defaults to 10s. diff --git a/pkg/infra/usagestats/usage_stats.go b/pkg/infra/usagestats/usage_stats.go index 96bf7df096d..d6c165e766c 100644 --- a/pkg/infra/usagestats/usage_stats.go +++ b/pkg/infra/usagestats/usage_stats.go @@ -155,6 +155,10 @@ func (uss *UsageStatsService) sendUsageStats(oauthProviders map[string]bool) { } func (uss *UsageStatsService) updateTotalStats() { + if !uss.Cfg.MetricsEndpointEnabled || uss.Cfg.MetricsEndpointDisableTotalStats { + return + } + statsQuery := models.GetSystemStatsQuery{} if err := uss.Bus.Dispatch(&statsQuery); err != nil { metricsLogger.Error("Failed to get system stats", "error", err) diff --git a/pkg/infra/usagestats/usage_stats_test.go b/pkg/infra/usagestats/usage_stats_test.go index 07f2df22192..45876fa304e 100644 --- a/pkg/infra/usagestats/usage_stats_test.go +++ b/pkg/infra/usagestats/usage_stats_test.go @@ -264,6 +264,49 @@ func TestMetrics(t *testing.T) { ts.Close() }) }) + + Convey("Test update total stats", t, func() { + uss := &UsageStatsService{ + Bus: bus.New(), + Cfg: setting.NewCfg(), + } + uss.Cfg.MetricsEndpointEnabled = true + uss.Cfg.MetricsEndpointDisableTotalStats = false + getSystemStatsWasCalled := false + uss.Bus.AddHandler(func(query *models.GetSystemStatsQuery) error { + query.Result = &models.SystemStats{} + getSystemStatsWasCalled = true + return nil + }) + + Convey("should not update stats when metrics is disabled and total stats is disabled", func() { + uss.Cfg.MetricsEndpointEnabled = false + uss.Cfg.MetricsEndpointDisableTotalStats = true + uss.updateTotalStats() + So(getSystemStatsWasCalled, ShouldBeFalse) + }) + + Convey("should not update stats when metrics is disabled and total stats enabled", func() { + uss.Cfg.MetricsEndpointEnabled = false + uss.Cfg.MetricsEndpointDisableTotalStats = false + uss.updateTotalStats() + So(getSystemStatsWasCalled, ShouldBeFalse) + }) + + Convey("should not update stats when metrics is enabled and total stats disabled", func() { + uss.Cfg.MetricsEndpointEnabled = true + uss.Cfg.MetricsEndpointDisableTotalStats = true + uss.updateTotalStats() + So(getSystemStatsWasCalled, ShouldBeFalse) + }) + + Convey("should update stats when metrics is enabled and total stats enabled", func() { + uss.Cfg.MetricsEndpointEnabled = true + uss.Cfg.MetricsEndpointDisableTotalStats = false + uss.updateTotalStats() + So(getSystemStatsWasCalled, ShouldBeTrue) + }) + }) } func waitTimeout(wg *sync.WaitGroup, timeout time.Duration) bool { diff --git a/pkg/setting/setting.go b/pkg/setting/setting.go index a0dd6745086..a9f74a1ad70 100644 --- a/pkg/setting/setting.go +++ b/pkg/setting/setting.go @@ -243,6 +243,7 @@ type Cfg struct { MetricsEndpointEnabled bool MetricsEndpointBasicAuthUsername string MetricsEndpointBasicAuthPassword string + MetricsEndpointDisableTotalStats bool PluginsEnableAlpha bool PluginsAppsSkipVerifyTLS bool DisableSanitizeHtml bool @@ -907,6 +908,7 @@ func (cfg *Cfg) Load(args *CommandLineArgs) error { if err != nil { return err } + cfg.MetricsEndpointDisableTotalStats = iniFile.Section("metrics").Key("disable_total_stats").MustBool(false) analytics := iniFile.Section("analytics") ReportingEnabled = analytics.Key("reporting_enabled").MustBool(true)