From 5afaf8930c3f695d062eaa71a0ab251f7e639ab5 Mon Sep 17 00:00:00 2001 From: Guilherme Caulada Date: Wed, 3 Nov 2021 18:59:05 -0300 Subject: [PATCH] Add monthlyActiveUsers to stats API and usage report (#41289) Closes grafana/grafana-enterprise-partnerships-team#7 --- pkg/infra/usagestats/service/usage_stats.go | 1 + pkg/models/stats.go | 2 ++ pkg/services/sqlstore/stats.go | 20 +++++++++++++++----- 3 files changed, 18 insertions(+), 5 deletions(-) diff --git a/pkg/infra/usagestats/service/usage_stats.go b/pkg/infra/usagestats/service/usage_stats.go index 6ad9716148a..4f9fbedfdca 100644 --- a/pkg/infra/usagestats/service/usage_stats.go +++ b/pkg/infra/usagestats/service/usage_stats.go @@ -60,6 +60,7 @@ func (uss *UsageStats) GetUsageReport(ctx context.Context) (usagestats.Report, e metrics["stats.active_editors.count"] = statsQuery.Result.ActiveEditors metrics["stats.active_viewers.count"] = statsQuery.Result.ActiveViewers metrics["stats.active_sessions.count"] = statsQuery.Result.ActiveSessions + metrics["stats.monthly_active_users.count"] = statsQuery.Result.MonthlyActiveUsers metrics["stats.daily_active_users.count"] = statsQuery.Result.DailyActiveUsers metrics["stats.daily_active_admins.count"] = statsQuery.Result.DailyActiveAdmins metrics["stats.daily_active_editors.count"] = statsQuery.Result.DailyActiveEditors diff --git a/pkg/models/stats.go b/pkg/models/stats.go index 43bb80bdeec..d042d02753b 100644 --- a/pkg/models/stats.go +++ b/pkg/models/stats.go @@ -6,6 +6,7 @@ type SystemStats struct { Users int64 ActiveUsers int64 DailyActiveUsers int64 + MonthlyActiveUsers int64 Orgs int64 Playlists int64 Alerts int64 @@ -94,6 +95,7 @@ type AdminStats struct { DailyActiveEditors int64 `json:"dailyActiveEditors"` DailyActiveViewers int64 `json:"dailyActiveViewers"` DailyActiveSessions int64 `json:"dailyActiveSessions"` + MonthlyActiveUsers int64 `json:"monthlyActiveUsers"` } type GetAdminStatsQuery struct { diff --git a/pkg/services/sqlstore/stats.go b/pkg/services/sqlstore/stats.go index bf61f893ec2..f9d505d4795 100644 --- a/pkg/services/sqlstore/stats.go +++ b/pkg/services/sqlstore/stats.go @@ -52,12 +52,16 @@ func GetSystemStats(ctx context.Context, query *models.GetSystemStatsQuery) erro sb.Write(`(SELECT COUNT(*) FROM ` + dialect.Quote("playlist") + `) AS playlists,`) sb.Write(`(SELECT COUNT(*) FROM ` + dialect.Quote("alert") + `) AS alerts,`) - activeUserDeadlineDate := time.Now().Add(-activeUserTimeLimit) + now := time.Now() + activeUserDeadlineDate := now.Add(-activeUserTimeLimit) sb.Write(`(SELECT COUNT(*) FROM `+dialect.Quote("user")+` WHERE last_seen_at > ?) AS active_users,`, activeUserDeadlineDate) - dailyActiveUserDeadlineDate := time.Now().Add(-dailyActiveUserTimeLimit) + dailyActiveUserDeadlineDate := now.Add(-dailyActiveUserTimeLimit) sb.Write(`(SELECT COUNT(*) FROM `+dialect.Quote("user")+` WHERE last_seen_at > ?) AS daily_active_users,`, dailyActiveUserDeadlineDate) + monthlyActiveUserDeadlineDate := time.Date(now.Year(), now.Month(), 1, 0, 0, 0, 0, now.Location()) + sb.Write(`(SELECT COUNT(*) FROM `+dialect.Quote("user")+` WHERE last_seen_at > ?) AS monthly_active_users,`, monthlyActiveUserDeadlineDate) + sb.Write(`(SELECT COUNT(id) FROM `+dialect.Quote("dashboard")+` WHERE is_folder = ?) AS dashboards,`, dialect.BooleanStr(false)) sb.Write(`(SELECT COUNT(id) FROM `+dialect.Quote("dashboard")+` WHERE is_folder = ?) AS folders,`, dialect.BooleanStr(true)) @@ -137,8 +141,10 @@ func viewersPermissionsCounterSQL(statName string, isFolder bool, permission mod } func GetAdminStats(ctx context.Context, query *models.GetAdminStatsQuery) error { - activeEndDate := time.Now().Add(-activeUserTimeLimit) - dailyActiveEndDate := time.Now().Add(-dailyActiveUserTimeLimit) + now := time.Now() + activeEndDate := now.Add(-activeUserTimeLimit) + dailyActiveEndDate := now.Add(-dailyActiveUserTimeLimit) + monthlyActiveEndDate := time.Date(now.Year(), now.Month(), 1, 0, 0, 0, 0, now.Location()) var rawSQL = `SELECT ( @@ -185,6 +191,10 @@ func GetAdminStats(ctx context.Context, query *models.GetAdminStatsQuery) error SELECT COUNT(*) FROM ` + dialect.Quote("user") + ` WHERE last_seen_at > ? ) AS daily_active_users, + ( + SELECT COUNT(*) + FROM ` + dialect.Quote("user") + ` WHERE last_seen_at > ? + ) AS monthly_active_users, ` + roleCounterSQL(ctx) + `, ( SELECT COUNT(*) @@ -196,7 +206,7 @@ func GetAdminStats(ctx context.Context, query *models.GetAdminStatsQuery) error ) AS daily_active_sessions` var stats models.AdminStats - _, err := x.SQL(rawSQL, activeEndDate, dailyActiveEndDate, activeEndDate.Unix(), dailyActiveEndDate.Unix()).Get(&stats) + _, err := x.SQL(rawSQL, activeEndDate, dailyActiveEndDate, monthlyActiveEndDate, activeEndDate.Unix(), dailyActiveEndDate.Unix()).Get(&stats) if err != nil { return err }