mirror of
https://github.com/grafana/grafana.git
synced 2025-02-25 18:55:37 -06:00
Chore: Add Usage stats providers registry (#48357)
* add usage stats providers * migrate thumbnails service to `registry.ProvidesUsageStats` * snake -> camel * lint fix * migrate accesscontrol to `registry.ProvidesUsageStats` * add accesscontrol to usage stats providers registry * fix test * added a note about errors
This commit is contained in:
@@ -6,6 +6,7 @@ import (
|
||||
"strings"
|
||||
|
||||
"github.com/grafana/grafana/pkg/models"
|
||||
"github.com/grafana/grafana/pkg/registry"
|
||||
)
|
||||
|
||||
type Options struct {
|
||||
@@ -13,6 +14,8 @@ type Options struct {
|
||||
}
|
||||
|
||||
type AccessControl interface {
|
||||
registry.ProvidesUsageStats
|
||||
|
||||
// Evaluate evaluates access to the given resources.
|
||||
Evaluate(ctx context.Context, user *models.SignedInUser, evaluator Evaluator) (bool, error)
|
||||
|
||||
|
||||
@@ -65,6 +65,10 @@ func New() *Mock {
|
||||
return mock
|
||||
}
|
||||
|
||||
func (m Mock) GetUsageStats(ctx context.Context) map[string]interface{} {
|
||||
return make(map[string]interface{})
|
||||
}
|
||||
|
||||
func (m Mock) WithPermissions(permissions []*accesscontrol.Permission) *Mock {
|
||||
m.permissions = permissions
|
||||
return &m
|
||||
|
||||
@@ -7,7 +7,6 @@ import (
|
||||
"github.com/grafana/grafana/pkg/api/routing"
|
||||
"github.com/grafana/grafana/pkg/infra/log"
|
||||
"github.com/grafana/grafana/pkg/infra/metrics"
|
||||
"github.com/grafana/grafana/pkg/infra/usagestats"
|
||||
"github.com/grafana/grafana/pkg/models"
|
||||
"github.com/grafana/grafana/pkg/services/accesscontrol"
|
||||
"github.com/grafana/grafana/pkg/services/accesscontrol/api"
|
||||
@@ -15,11 +14,10 @@ import (
|
||||
"github.com/prometheus/client_golang/prometheus"
|
||||
)
|
||||
|
||||
func ProvideService(features featuremgmt.FeatureToggles, usageStats usagestats.Service,
|
||||
func ProvideService(features featuremgmt.FeatureToggles,
|
||||
provider accesscontrol.PermissionsProvider, routeRegister routing.RouteRegister) (*OSSAccessControlService, error) {
|
||||
var errDeclareRoles error
|
||||
s := ProvideOSSAccessControl(features, provider)
|
||||
s.registerUsageMetrics(usageStats)
|
||||
if !s.IsDisabled() {
|
||||
api := api.AccessControlAPI{
|
||||
RouteRegister: routeRegister,
|
||||
@@ -33,7 +31,6 @@ func ProvideService(features featuremgmt.FeatureToggles, usageStats usagestats.S
|
||||
return s, errDeclareRoles
|
||||
}
|
||||
|
||||
// ProvideOSSAccessControl creates an oss implementation of access control without usage stats registration
|
||||
func ProvideOSSAccessControl(features featuremgmt.FeatureToggles, provider accesscontrol.PermissionsProvider) *OSSAccessControlService {
|
||||
s := &OSSAccessControlService{
|
||||
features: features,
|
||||
@@ -63,12 +60,10 @@ func (ac *OSSAccessControlService) IsDisabled() bool {
|
||||
return !ac.features.IsEnabled(featuremgmt.FlagAccesscontrol)
|
||||
}
|
||||
|
||||
func (ac *OSSAccessControlService) registerUsageMetrics(usageStats usagestats.Service) {
|
||||
usageStats.RegisterMetricsFunc(func(context.Context) (map[string]interface{}, error) {
|
||||
return map[string]interface{}{
|
||||
"stats.oss.accesscontrol.enabled.count": ac.getUsageMetrics(),
|
||||
}, nil
|
||||
})
|
||||
func (ac *OSSAccessControlService) GetUsageStats(_ context.Context) map[string]interface{} {
|
||||
return map[string]interface{}{
|
||||
"stats.oss.accesscontrol.enabled.count": ac.getUsageMetrics(),
|
||||
}
|
||||
}
|
||||
|
||||
func (ac *OSSAccessControlService) getUsageMetrics() interface{} {
|
||||
|
||||
@@ -9,7 +9,6 @@ import (
|
||||
|
||||
"github.com/grafana/grafana/pkg/api/routing"
|
||||
"github.com/grafana/grafana/pkg/infra/log"
|
||||
"github.com/grafana/grafana/pkg/infra/usagestats"
|
||||
"github.com/grafana/grafana/pkg/models"
|
||||
"github.com/grafana/grafana/pkg/services/accesscontrol"
|
||||
"github.com/grafana/grafana/pkg/services/accesscontrol/database"
|
||||
@@ -134,19 +133,13 @@ func TestUsageMetrics(t *testing.T) {
|
||||
|
||||
for _, tt := range tests {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
usagestatsmock := &usagestats.UsageStatsMock{T: t}
|
||||
|
||||
_, errInitAc := ProvideService(
|
||||
s, errInitAc := ProvideService(
|
||||
featuremgmt.WithFeatures("accesscontrol", tt.enabled),
|
||||
usagestatsmock,
|
||||
database.ProvideService(sqlstore.InitTestDB(t)),
|
||||
routing.NewRouteRegister(),
|
||||
)
|
||||
require.NoError(t, errInitAc)
|
||||
report, err := usagestatsmock.GetUsageReport(context.Background())
|
||||
assert.Nil(t, err)
|
||||
|
||||
assert.Equal(t, tt.expectedValue, report.Metrics["stats.oss.accesscontrol.enabled.count"])
|
||||
assert.Equal(t, tt.expectedValue, s.GetUsageStats(context.Background())["stats.oss.accesscontrol.enabled.count"])
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
@@ -11,6 +11,10 @@ import (
|
||||
// When the feature flag is not enabled we just implement a dummy service
|
||||
type dummyService struct{}
|
||||
|
||||
func (ds *dummyService) GetUsageStats(ctx context.Context) map[string]interface{} {
|
||||
return make(map[string]interface{})
|
||||
}
|
||||
|
||||
func (ds *dummyService) GetImage(c *models.ReqContext) {
|
||||
c.JSON(400, map[string]string{"error": "invalid size"})
|
||||
}
|
||||
|
||||
@@ -12,8 +12,8 @@ import (
|
||||
"github.com/grafana/grafana/pkg/api/response"
|
||||
"github.com/grafana/grafana/pkg/infra/log"
|
||||
"github.com/grafana/grafana/pkg/infra/serverlock"
|
||||
"github.com/grafana/grafana/pkg/infra/usagestats"
|
||||
"github.com/grafana/grafana/pkg/models"
|
||||
"github.com/grafana/grafana/pkg/registry"
|
||||
"github.com/grafana/grafana/pkg/services/featuremgmt"
|
||||
"github.com/grafana/grafana/pkg/services/guardian"
|
||||
"github.com/grafana/grafana/pkg/services/live"
|
||||
@@ -25,6 +25,7 @@ import (
|
||||
)
|
||||
|
||||
type Service interface {
|
||||
registry.ProvidesUsageStats
|
||||
Run(ctx context.Context) error
|
||||
Enabled() bool
|
||||
GetImage(c *models.ReqContext)
|
||||
@@ -50,7 +51,6 @@ type thumbService struct {
|
||||
store sqlstore.Store
|
||||
crawlLockServiceActionName string
|
||||
log log.Logger
|
||||
usageStatsService usagestats.Service
|
||||
canRunCrawler bool
|
||||
settings setting.DashboardPreviewsSettings
|
||||
}
|
||||
@@ -65,7 +65,7 @@ type crawlerScheduleOptions struct {
|
||||
auth CrawlerAuth
|
||||
}
|
||||
|
||||
func ProvideService(cfg *setting.Cfg, features featuremgmt.FeatureToggles, lockService *serverlock.ServerLockService, renderService rendering.Service, gl *live.GrafanaLive, store *sqlstore.SQLStore, authSetupService CrawlerAuthSetupService, usageStatsService usagestats.Service) Service {
|
||||
func ProvideService(cfg *setting.Cfg, features featuremgmt.FeatureToggles, lockService *serverlock.ServerLockService, renderService rendering.Service, gl *live.GrafanaLive, store *sqlstore.SQLStore, authSetupService CrawlerAuthSetupService) Service {
|
||||
if !features.IsEnabled(featuremgmt.FlagDashboardPreviews) {
|
||||
return &dummyService{}
|
||||
}
|
||||
@@ -81,7 +81,6 @@ func ProvideService(cfg *setting.Cfg, features featuremgmt.FeatureToggles, lockS
|
||||
canRunCrawler = false
|
||||
}
|
||||
t := &thumbService{
|
||||
usageStatsService: usageStatsService,
|
||||
renderingService: renderService,
|
||||
renderer: newSimpleCrawler(renderService, gl, thumbnailRepo, cfg, cfg.DashboardPreviews),
|
||||
thumbnailRepo: thumbnailRepo,
|
||||
@@ -104,26 +103,23 @@ func ProvideService(cfg *setting.Cfg, features featuremgmt.FeatureToggles, lockS
|
||||
},
|
||||
}
|
||||
|
||||
t.registerUsageStats()
|
||||
return t
|
||||
}
|
||||
|
||||
func (hs *thumbService) registerUsageStats() {
|
||||
hs.usageStatsService.RegisterMetricsFunc(func(ctx context.Context) (map[string]interface{}, error) {
|
||||
s := hs.getDashboardPreviewsSetupSettings(ctx)
|
||||
func (hs *thumbService) GetUsageStats(ctx context.Context) map[string]interface{} {
|
||||
s := hs.getDashboardPreviewsSetupSettings(ctx)
|
||||
|
||||
stats := make(map[string]interface{})
|
||||
stats := make(map[string]interface{})
|
||||
|
||||
if s.SystemRequirements.Met {
|
||||
stats["stats.dashboard_previews.system_req_met.count"] = 1
|
||||
}
|
||||
if s.SystemRequirements.Met {
|
||||
stats["stats.dashboard_previews.system_req_met.count"] = 1
|
||||
}
|
||||
|
||||
if s.ThumbnailsExist {
|
||||
stats["stats.dashboard_previews.thumbnails_exist.count"] = 1
|
||||
}
|
||||
if s.ThumbnailsExist {
|
||||
stats["stats.dashboard_previews.thumbnails_exist.count"] = 1
|
||||
}
|
||||
|
||||
return stats, nil
|
||||
})
|
||||
return stats
|
||||
}
|
||||
|
||||
func (hs *thumbService) Enabled() bool {
|
||||
|
||||
Reference in New Issue
Block a user