stats.go 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165
  1. package sqlstore
  2. import (
  3. "context"
  4. "time"
  5. "github.com/grafana/grafana/pkg/bus"
  6. m "github.com/grafana/grafana/pkg/models"
  7. )
  8. func init() {
  9. bus.AddHandler("sql", GetSystemStats)
  10. bus.AddHandler("sql", GetDataSourceStats)
  11. bus.AddHandler("sql", GetDataSourceAccessStats)
  12. bus.AddHandler("sql", GetAdminStats)
  13. bus.AddHandler("sql", GetSystemUserCountStats)
  14. bus.AddCtxHandler("sql", GetSystemUserCountStatsCtx)
  15. }
  16. var activeUserTimeLimit = time.Hour * 24 * 30
  17. func GetDataSourceStats(query *m.GetDataSourceStatsQuery) error {
  18. var rawSql = `SELECT COUNT(*) as count, type FROM data_source GROUP BY type`
  19. query.Result = make([]*m.DataSourceStats, 0)
  20. err := x.SQL(rawSql).Find(&query.Result)
  21. return err
  22. }
  23. func GetDataSourceAccessStats(query *m.GetDataSourceAccessStatsQuery) error {
  24. var rawSql = `SELECT COUNT(*) as count, type, access FROM data_source GROUP BY type, access`
  25. query.Result = make([]*m.DataSourceAccessStats, 0)
  26. err := x.SQL(rawSql).Find(&query.Result)
  27. return err
  28. }
  29. func GetSystemStats(query *m.GetSystemStatsQuery) error {
  30. sb := &SqlBuilder{}
  31. sb.Write("SELECT ")
  32. sb.Write(`(SELECT COUNT(*) FROM ` + dialect.Quote("user") + `) AS users,`)
  33. sb.Write(`(SELECT COUNT(*) FROM ` + dialect.Quote("org") + `) AS orgs,`)
  34. sb.Write(`(SELECT COUNT(*) FROM ` + dialect.Quote("dashboard") + `) AS dashboards,`)
  35. sb.Write(`(SELECT COUNT(*) FROM ` + dialect.Quote("data_source") + `) AS datasources,`)
  36. sb.Write(`(SELECT COUNT(*) FROM ` + dialect.Quote("star") + `) AS stars,`)
  37. sb.Write(`(SELECT COUNT(*) FROM ` + dialect.Quote("playlist") + `) AS playlists,`)
  38. sb.Write(`(SELECT COUNT(*) FROM ` + dialect.Quote("alert") + `) AS alerts,`)
  39. activeUserDeadlineDate := time.Now().Add(-activeUserTimeLimit)
  40. sb.Write(`(SELECT COUNT(*) FROM `+dialect.Quote("user")+` where last_seen_at > ?) AS active_users,`, activeUserDeadlineDate)
  41. sb.Write(`(SELECT COUNT(id) FROM `+dialect.Quote("dashboard")+` where is_folder = ?) AS folders,`, dialect.BooleanStr(true))
  42. sb.Write(`(
  43. SELECT COUNT(acl.id)
  44. FROM `+dialect.Quote("dashboard_acl")+` as acl
  45. inner join `+dialect.Quote("dashboard")+` as d
  46. on d.id = acl.dashboard_id
  47. WHERE d.is_folder = ?
  48. ) AS dashboard_permissions,`, dialect.BooleanStr(false))
  49. sb.Write(`(
  50. SELECT COUNT(acl.id)
  51. FROM `+dialect.Quote("dashboard_acl")+` as acl
  52. inner join `+dialect.Quote("dashboard")+` as d
  53. on d.id = acl.dashboard_id
  54. WHERE d.is_folder = ?
  55. ) AS folder_permissions,`, dialect.BooleanStr(true))
  56. sb.Write(`(SELECT COUNT(id) FROM ` + dialect.Quote("dashboard_provisioning") + `) AS provisioned_dashboards,`)
  57. sb.Write(`(SELECT COUNT(id) FROM ` + dialect.Quote("dashboard_snapshot") + `) AS snapshots,`)
  58. sb.Write(`(SELECT COUNT(id) FROM ` + dialect.Quote("team") + `) AS teams`)
  59. var stats m.SystemStats
  60. _, err := x.SQL(sb.GetSqlString(), sb.params...).Get(&stats)
  61. if err != nil {
  62. return err
  63. }
  64. query.Result = &stats
  65. return err
  66. }
  67. func GetAdminStats(query *m.GetAdminStatsQuery) error {
  68. var rawSql = `SELECT
  69. (
  70. SELECT COUNT(*)
  71. FROM ` + dialect.Quote("user") + `
  72. ) AS users,
  73. (
  74. SELECT COUNT(*)
  75. FROM ` + dialect.Quote("org") + `
  76. ) AS orgs,
  77. (
  78. SELECT COUNT(*)
  79. FROM ` + dialect.Quote("dashboard") + `
  80. ) AS dashboards,
  81. (
  82. SELECT COUNT(*)
  83. FROM ` + dialect.Quote("dashboard_snapshot") + `
  84. ) AS snapshots,
  85. (
  86. SELECT COUNT( DISTINCT ( ` + dialect.Quote("term") + ` ))
  87. FROM ` + dialect.Quote("dashboard_tag") + `
  88. ) AS tags,
  89. (
  90. SELECT COUNT(*)
  91. FROM ` + dialect.Quote("data_source") + `
  92. ) AS datasources,
  93. (
  94. SELECT COUNT(*)
  95. FROM ` + dialect.Quote("playlist") + `
  96. ) AS playlists,
  97. (
  98. SELECT COUNT(*) FROM ` + dialect.Quote("star") + `
  99. ) AS stars,
  100. (
  101. SELECT COUNT(*)
  102. FROM ` + dialect.Quote("alert") + `
  103. ) AS alerts,
  104. (
  105. SELECT COUNT(*)
  106. from ` + dialect.Quote("user") + ` where last_seen_at > ?
  107. ) as active_users
  108. `
  109. activeUserDeadlineDate := time.Now().Add(-activeUserTimeLimit)
  110. var stats m.AdminStats
  111. _, err := x.SQL(rawSql, activeUserDeadlineDate).Get(&stats)
  112. if err != nil {
  113. return err
  114. }
  115. query.Result = &stats
  116. return err
  117. }
  118. func GetSystemUserCountStatsCtx(ctx context.Context, query *m.GetSystemUserCountStatsQuery) error {
  119. return withDbSession(ctx, func(sess *DBSession) error {
  120. var rawSql = `SELECT COUNT(id) AS Count FROM ` + dialect.Quote("user")
  121. var stats m.SystemUserCountStats
  122. _, err := sess.SQL(rawSql).Get(&stats)
  123. if err != nil {
  124. return err
  125. }
  126. query.Result = &stats
  127. return err
  128. })
  129. }
  130. func GetSystemUserCountStats(query *m.GetSystemUserCountStatsQuery) error {
  131. var rawSql = `SELECT COUNT(id) AS Count FROM ` + dialect.Quote("user")
  132. var stats m.SystemUserCountStats
  133. _, err := x.SQL(rawSql).Get(&stats)
  134. if err != nil {
  135. return err
  136. }
  137. query.Result = &stats
  138. return err
  139. }