Chore: Move stats service into a standalone packge from sqlstore (#59574)

* move original stats service into a separate package

* add stats service to wire

* move GetAdminStats

* switch to using stats.Service

* add missing package

* fix api tests
This commit is contained in:
Serge Zaitsev
2022-11-30 18:11:07 +01:00
committed by GitHub
parent a343defe64
commit 9cdb6b07c7
14 changed files with 200 additions and 107 deletions
@@ -12,12 +12,14 @@ import (
"github.com/stretchr/testify/require"
"github.com/grafana/grafana/pkg/infra/db"
"github.com/grafana/grafana/pkg/services/stats/statsimpl"
"github.com/grafana/grafana/pkg/util"
)
func TestConcurrentUsersMetrics(t *testing.T) {
sqlStore, cfg := db.InitTestDBwithCfg(t)
s := createService(t, cfg, sqlStore)
statsService := statsimpl.ProvideService(sqlStore)
s := createService(t, cfg, sqlStore, statsService)
createConcurrentTokens(t, sqlStore)
@@ -34,7 +36,8 @@ func TestConcurrentUsersMetrics(t *testing.T) {
func TestConcurrentUsersStats(t *testing.T) {
sqlStore, cfg := db.InitTestDBwithCfg(t)
s := createService(t, cfg, sqlStore)
statsService := statsimpl.ProvideService(sqlStore)
s := createService(t, cfg, sqlStore, statsService)
createConcurrentTokens(t, sqlStore)
@@ -13,6 +13,7 @@ import (
"github.com/grafana/grafana/pkg/services/datasources"
"github.com/grafana/grafana/pkg/services/sqlstore/mockstore"
"github.com/grafana/grafana/pkg/services/stats/statstest"
"github.com/grafana/grafana/pkg/setting"
)
@@ -33,10 +34,12 @@ func TestDetectPrometheusVariant(t *testing.T) {
t.Cleanup(cortex.Close)
sqlStore := mockstore.NewSQLStoreMock()
statsService := statstest.NewFakeService()
s := createService(
t,
setting.NewCfg(),
sqlStore,
statsService,
withDatasources(mockDatasourceService{datasources: []*datasources.DataSource{
{
Id: 1,
+10 -6
View File
@@ -19,6 +19,7 @@ import (
"github.com/grafana/grafana/pkg/services/datasources"
"github.com/grafana/grafana/pkg/services/featuremgmt"
"github.com/grafana/grafana/pkg/services/sqlstore"
"github.com/grafana/grafana/pkg/services/stats"
"github.com/grafana/grafana/pkg/setting"
)
@@ -28,6 +29,7 @@ type Service struct {
plugins plugins.Store
social social.Service
usageStats usagestats.Service
statsService stats.Service
features *featuremgmt.FeatureManager
datasources datasources.DataSourceService
httpClientProvider httpclient.Provider
@@ -42,6 +44,7 @@ type Service struct {
func ProvideService(
us usagestats.Service,
statsService stats.Service,
cfg *setting.Cfg,
store sqlstore.Store,
social social.Service,
@@ -56,6 +59,7 @@ func ProvideService(
plugins: plugins,
social: social,
usageStats: us,
statsService: statsService,
features: features,
datasources: datasourceService,
httpClientProvider: httpClientProvider,
@@ -106,7 +110,7 @@ func (s *Service) collectSystemStats(ctx context.Context) (map[string]interface{
m := map[string]interface{}{}
statsQuery := models.GetSystemStatsQuery{}
if err := s.sqlstore.GetSystemStats(ctx, &statsQuery); err != nil {
if err := s.statsService.GetSystemStats(ctx, &statsQuery); err != nil {
s.log.Error("Failed to get system stats", "error", err)
return nil, err
}
@@ -219,7 +223,7 @@ func (s *Service) collectAlertNotifierStats(ctx context.Context) (map[string]int
m := map[string]interface{}{}
// get stats about alert notifier usage
anStats := models.GetAlertNotifierUsageStatsQuery{}
if err := s.sqlstore.GetAlertNotifiersUsageStats(ctx, &anStats); err != nil {
if err := s.statsService.GetAlertNotifiersUsageStats(ctx, &anStats); err != nil {
s.log.Error("Failed to get alert notification stats", "error", err)
return nil, err
}
@@ -233,7 +237,7 @@ func (s *Service) collectAlertNotifierStats(ctx context.Context) (map[string]int
func (s *Service) collectDatasourceStats(ctx context.Context) (map[string]interface{}, error) {
m := map[string]interface{}{}
dsStats := models.GetDataSourceStatsQuery{}
if err := s.sqlstore.GetDataSourceStats(ctx, &dsStats); err != nil {
if err := s.statsService.GetDataSourceStats(ctx, &dsStats); err != nil {
s.log.Error("Failed to get datasource stats", "error", err)
return nil, err
}
@@ -280,7 +284,7 @@ func (s *Service) collectDatasourceAccess(ctx context.Context) (map[string]inter
// fetch datasource access stats
dsAccessStats := models.GetDataSourceAccessStatsQuery{}
if err := s.sqlstore.GetDataSourceAccessStats(ctx, &dsAccessStats); err != nil {
if err := s.statsService.GetDataSourceAccessStats(ctx, &dsAccessStats); err != nil {
s.log.Error("Failed to get datasource access stats", "error", err)
return nil, err
}
@@ -316,7 +320,7 @@ func (s *Service) updateTotalStats(ctx context.Context) bool {
}
statsQuery := models.GetSystemStatsQuery{}
if err := s.sqlstore.GetSystemStats(ctx, &statsQuery); err != nil {
if err := s.statsService.GetSystemStats(ctx, &statsQuery); err != nil {
s.log.Error("Failed to get system stats", "error", err)
return false
}
@@ -351,7 +355,7 @@ func (s *Service) updateTotalStats(ctx context.Context) bool {
metrics.MStatTotalPublicDashboards.Set(float64(statsQuery.Result.PublicDashboards))
dsStats := models.GetDataSourceStatsQuery{}
if err := s.sqlstore.GetDataSourceStats(ctx, &dsStats); err != nil {
if err := s.statsService.GetDataSourceStats(ctx, &dsStats); err != nil {
s.log.Error("Failed to get datasource stats", "error", err)
return true
}
@@ -24,16 +24,19 @@ import (
"github.com/grafana/grafana/pkg/services/featuremgmt"
"github.com/grafana/grafana/pkg/services/sqlstore"
"github.com/grafana/grafana/pkg/services/sqlstore/mockstore"
"github.com/grafana/grafana/pkg/services/stats"
"github.com/grafana/grafana/pkg/services/stats/statstest"
"github.com/grafana/grafana/pkg/setting"
)
func TestTotalStatsUpdate(t *testing.T) {
sqlStore := mockstore.NewSQLStoreMock()
s := createService(t, setting.NewCfg(), sqlStore)
statsService := statstest.NewFakeService()
s := createService(t, setting.NewCfg(), sqlStore, statsService)
s.cfg.MetricsEndpointEnabled = true
s.cfg.MetricsEndpointDisableTotalStats = false
sqlStore.ExpectedSystemStats = &models.SystemStats{}
statsService.ExpectedSystemStats = &models.SystemStats{}
tests := []struct {
MetricsEndpointEnabled bool
@@ -94,8 +97,9 @@ func TestUsageStatsProviders(t *testing.T) {
provider2 := &dummyUsageStatProvider{stats: map[string]interface{}{"my_stat_x": "valx", "my_stat_z": "valz"}}
store := mockstore.NewSQLStoreMock()
mockSystemStats(store)
s := createService(t, setting.NewCfg(), store)
statsService := statstest.NewFakeService()
mockSystemStats(statsService)
s := createService(t, setting.NewCfg(), store, statsService)
s.RegisterProviders([]registry.ProvidesUsageStats{provider1, provider2})
m, err := s.collectAdditionalMetrics(context.Background())
@@ -109,8 +113,9 @@ func TestUsageStatsProviders(t *testing.T) {
func TestFeatureUsageStats(t *testing.T) {
store := mockstore.NewSQLStoreMock()
mockSystemStats(store)
s := createService(t, setting.NewCfg(), store)
statsService := statstest.NewFakeService()
mockSystemStats(statsService)
s := createService(t, setting.NewCfg(), store, statsService)
m, err := s.collectSystemStats(context.Background())
require.NoError(t, err, "Expected no error")
@@ -121,6 +126,7 @@ func TestFeatureUsageStats(t *testing.T) {
func TestCollectingUsageStats(t *testing.T) {
sqlStore := mockstore.NewSQLStoreMock()
statsService := statstest.NewFakeService()
expectedDataSources := []*datasources.DataSource{
{
JsonData: simplejson.NewFromAny(map[string]interface{}{
@@ -148,12 +154,12 @@ func TestCollectingUsageStats(t *testing.T) {
AuthProxyEnabled: true,
Packaging: "deb",
ReportingDistributor: "hosted-grafana",
}, sqlStore,
}, sqlStore, statsService,
withDatasources(mockDatasourceService{datasources: expectedDataSources}))
s.startTime = time.Now().Add(-1 * time.Minute)
mockSystemStats(sqlStore)
mockSystemStats(statsService)
createConcurrentTokens(t, sqlStore)
@@ -203,6 +209,7 @@ func TestCollectingUsageStats(t *testing.T) {
func TestElasticStats(t *testing.T) {
sqlStore := mockstore.NewSQLStoreMock()
statsService := statstest.NewFakeService()
expectedDataSources := []*datasources.DataSource{
{
@@ -231,7 +238,7 @@ func TestElasticStats(t *testing.T) {
AuthProxyEnabled: true,
Packaging: "deb",
ReportingDistributor: "hosted-grafana",
}, sqlStore,
}, sqlStore, statsService,
withDatasources(mockDatasourceService{datasources: expectedDataSources}))
metrics, err := s.collectElasticStats(context.Background())
@@ -242,11 +249,12 @@ func TestElasticStats(t *testing.T) {
}
func TestDatasourceStats(t *testing.T) {
sqlStore := mockstore.NewSQLStoreMock()
s := createService(t, &setting.Cfg{}, sqlStore)
statsService := statstest.NewFakeService()
s := createService(t, &setting.Cfg{}, sqlStore, statsService)
setupSomeDataSourcePlugins(t, s)
sqlStore.ExpectedDataSourceStats = []*models.DataSourceStats{
statsService.ExpectedDataSourceStats = []*models.DataSourceStats{
{
Type: datasources.DS_ES,
Count: 9,
@@ -283,7 +291,7 @@ func TestDatasourceStats(t *testing.T) {
},
}
sqlStore.ExpectedDataSourcesAccessStats = []*models.DataSourceAccessStats{
statsService.ExpectedDataSourcesAccessStats = []*models.DataSourceAccessStats{
{
Type: datasources.DS_ES,
Access: "direct",
@@ -349,9 +357,10 @@ func TestDatasourceStats(t *testing.T) {
func TestAlertNotifiersStats(t *testing.T) {
sqlStore := mockstore.NewSQLStoreMock()
s := createService(t, &setting.Cfg{}, sqlStore)
statsService := statstest.NewFakeService()
s := createService(t, &setting.Cfg{}, sqlStore, statsService)
sqlStore.ExpectedNotifierUsageStats = []*models.NotifierUsageStats{
statsService.ExpectedNotifierUsageStats = []*models.NotifierUsageStats{
{
Type: "slack",
Count: 1,
@@ -369,8 +378,8 @@ func TestAlertNotifiersStats(t *testing.T) {
assert.EqualValues(t, 2, metrics["stats.alert_notifiers.webhook.count"])
}
func mockSystemStats(sqlStore *mockstore.SQLStoreMock) {
sqlStore.ExpectedSystemStats = &models.SystemStats{
func mockSystemStats(statsService *statstest.FakeService) {
statsService.ExpectedSystemStats = &models.SystemStats{
Dashboards: 1,
Datasources: 2,
Users: 3,
@@ -437,7 +446,7 @@ func setupSomeDataSourcePlugins(t *testing.T, s *Service) {
}
}
func createService(t testing.TB, cfg *setting.Cfg, store sqlstore.Store, opts ...func(*serviceOptions)) *Service {
func createService(t testing.TB, cfg *setting.Cfg, store sqlstore.Store, statsService stats.Service, opts ...func(*serviceOptions)) *Service {
t.Helper()
o := &serviceOptions{datasources: mockDatasourceService{}}
@@ -448,6 +457,7 @@ func createService(t testing.TB, cfg *setting.Cfg, store sqlstore.Store, opts ..
return ProvideService(
&usagestats.UsageStatsMock{},
statsService,
cfg,
store,
&mockSocial{},