diff --git a/pkg/api/dashboard_test.go b/pkg/api/dashboard_test.go index abb6f43b702..2d22f62e3e8 100644 --- a/pkg/api/dashboard_test.go +++ b/pkg/api/dashboard_test.go @@ -113,6 +113,8 @@ func (usm *usageStatsMock) ShouldBeReported(_ string) bool { return true } +func (usm *usageStatsMock) RegisterSendReportCallback(_ usagestats.SendReportCallbackFunc) {} + func newTestLive(t *testing.T) *live.GrafanaLive { cfg := &setting.Cfg{AppURL: "http://localhost:3000/"} gLive, err := live.ProvideService(nil, cfg, routing.NewRouteRegister(), nil, nil, nil, nil, sqlstore.InitTestDB(t), &usageStatsMock{t: t}) diff --git a/pkg/infra/usagestats/service.go b/pkg/infra/usagestats/service.go index d908cd2995e..73fb59219a2 100644 --- a/pkg/infra/usagestats/service.go +++ b/pkg/infra/usagestats/service.go @@ -17,8 +17,11 @@ type Report struct { type MetricsFunc func() (map[string]interface{}, error) +type SendReportCallbackFunc func() + type Service interface { GetUsageReport(context.Context) (Report, error) RegisterMetricsFunc(MetricsFunc) + RegisterSendReportCallback(SendReportCallbackFunc) ShouldBeReported(string) bool } diff --git a/pkg/infra/usagestats/service/service.go b/pkg/infra/usagestats/service/service.go index bce9fea95be..823b3ddba8b 100644 --- a/pkg/infra/usagestats/service/service.go +++ b/pkg/infra/usagestats/service/service.go @@ -29,6 +29,7 @@ type UsageStats struct { externalMetrics []usagestats.MetricsFunc concurrentUserStatsCache memoConcurrentUserStats startTime time.Time + sendReportCallbacks []usagestats.SendReportCallbackFunc } func ProvideService(cfg *setting.Cfg, bus bus.Bus, sqlStore *sqlstore.SQLStore, pluginManager plugins.Manager, @@ -91,6 +92,10 @@ func (uss *UsageStats) Run(ctx context.Context) error { nextSendInterval = sendInterval sendReportTicker.Reset(nextSendInterval) } + + for _, callback := range uss.sendReportCallbacks { + callback() + } case <-updateStatsTicker.C: uss.updateTotalStats() case <-ctx.Done(): @@ -138,3 +143,7 @@ FROM (select count(1) as tokens from user_auth_token group by user_id) uat;` uss.concurrentUserStatsCache.memoized = time.Now() return uss.concurrentUserStatsCache.stats, nil } + +func (uss *UsageStats) RegisterSendReportCallback(c usagestats.SendReportCallbackFunc) { + uss.sendReportCallbacks = append(uss.sendReportCallbacks, c) +} diff --git a/pkg/services/accesscontrol/ossaccesscontrol/ossaccesscontrol_test.go b/pkg/services/accesscontrol/ossaccesscontrol/ossaccesscontrol_test.go index 90d34547252..8eea5ce0619 100644 --- a/pkg/services/accesscontrol/ossaccesscontrol/ossaccesscontrol_test.go +++ b/pkg/services/accesscontrol/ossaccesscontrol/ossaccesscontrol_test.go @@ -71,6 +71,8 @@ func (usm *usageStatsMock) ShouldBeReported(_ string) bool { return true } +func (usm *usageStatsMock) RegisterSendReportCallback(_ usagestats.SendReportCallbackFunc) {} + type evaluatingPermissionsTestCase struct { desc string user userTestCase diff --git a/pkg/services/alerting/engine_test.go b/pkg/services/alerting/engine_test.go index 3d57a75a46e..592282bfba7 100644 --- a/pkg/services/alerting/engine_test.go +++ b/pkg/services/alerting/engine_test.go @@ -67,6 +67,8 @@ func (usm *usageStatsMock) ShouldBeReported(_ string) bool { return true } +func (usm *usageStatsMock) RegisterSendReportCallback(_ usagestats.SendReportCallbackFunc) {} + func TestEngineProcessJob(t *testing.T) { Convey("Alerting engine job processing", t, func() { bus := bus.New() diff --git a/pkg/services/live/live.go b/pkg/services/live/live.go index 33dda1da53b..fa9563f8279 100644 --- a/pkg/services/live/live.go +++ b/pkg/services/live/live.go @@ -1031,7 +1031,13 @@ func (g *GrafanaLive) sampleLiveStats() { } } +func (g *GrafanaLive) resetLiveStats() { + g.usageStats = usageStats{} +} + func (g *GrafanaLive) registerUsageMetrics() { + g.usageStatsService.RegisterSendReportCallback(g.resetLiveStats) + g.usageStatsService.RegisterMetricsFunc(func() (map[string]interface{}, error) { liveUsersAvg := 0 liveClientsAvg := 0 @@ -1051,8 +1057,6 @@ func (g *GrafanaLive) registerUsageMetrics() { "stats.live_clients_avg.count": liveClientsAvg, } - g.usageStats = usageStats{} - return metrics, nil }) }