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:
@@ -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,
|
||||
|
||||
@@ -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{},
|
||||
|
||||
Reference in New Issue
Block a user