dashboard history: refactor after review

This commit is contained in:
Alexander Zobnin 2017-11-15 13:36:36 +03:00
parent 08e2bbef83
commit a0a1f4aacd
4 changed files with 34 additions and 49 deletions

View File

@ -188,7 +188,7 @@ snapshot_remove_expired = true
snapshot_TTL_days = 90 snapshot_TTL_days = 90
#################################### Dashboards History ################## #################################### Dashboards History ##################
[dashboards.history] [dashboards]
# A setting of 20 (default) means only the last 20 versions will be stored and older versions removed. # A setting of 20 (default) means only the last 20 versions will be stored and older versions removed.
# To keep all dashboard versions you can set this value to 2147483647. # To keep all dashboard versions you can set this value to 2147483647.
versions_to_keep = 20 versions_to_keep = 20

View File

@ -163,6 +163,7 @@ log_queries =
# data source proxy whitelist (ip_or_domain:port separated by spaces) # data source proxy whitelist (ip_or_domain:port separated by spaces)
;data_source_proxy_whitelist = ;data_source_proxy_whitelist =
#################################### Snapshots ###########################
[snapshots] [snapshots]
# snapshot sharing options # snapshot sharing options
;external_enabled = true ;external_enabled = true
@ -175,7 +176,13 @@ log_queries =
# remove snapshots after 90 days # remove snapshots after 90 days
;snapshot_TTL_days = 90 ;snapshot_TTL_days = 90
#################################### Users #################################### #################################### Dashboards History ##################
[dashboards]
# A setting of 20 (default) means only the last 20 versions will be stored and older versions removed.
# To keep all dashboard versions you can set this value to 2147483647.
;versions_to_keep = 20
#################################### Users ###############################
[users] [users]
# disable user signup / registration # disable user signup / registration
;allow_sign_up = true ;allow_sign_up = true

View File

@ -3,8 +3,6 @@ package sqlstore
import ( import (
"fmt" "fmt"
"math" "math"
"sort"
"strconv"
"strings" "strings"
"github.com/grafana/grafana/pkg/bus" "github.com/grafana/grafana/pkg/bus"
@ -78,9 +76,10 @@ func DeleteExpiredVersions(cmd *m.DeleteExpiredVersionsCommand) error {
affectedDashboardsQuery := fmt.Sprintf(`SELECT dashboard_id FROM dashboard_version affectedDashboardsQuery := fmt.Sprintf(`SELECT dashboard_id FROM dashboard_version
GROUP BY dashboard_id HAVING COUNT(dashboard_version.id)>%d`, versionsToKeep) GROUP BY dashboard_id HAVING COUNT(dashboard_version.id)>%d`, versionsToKeep)
err := x.Table("dashboard_version"). err := sess.Table("dashboard_version").
Select("dashboard_version.id, dashboard_version.version, dashboard_version.dashboard_id"). Select("dashboard_version.id, dashboard_version.version, dashboard_version.dashboard_id").
Where(fmt.Sprintf("dashboard_id IN (%s)", affectedDashboardsQuery)). Where(fmt.Sprintf("dashboard_id IN (%s)", affectedDashboardsQuery)).
Desc("dashboard_version.dashboard_id", "dashboard_version.version").
Find(&versions) Find(&versions)
if err != nil { if err != nil {
@ -89,13 +88,14 @@ func DeleteExpiredVersions(cmd *m.DeleteExpiredVersionsCommand) error {
// Keep last versionsToKeep versions and delete other // Keep last versionsToKeep versions and delete other
versionIdsToDelete := getVersionIDsToDelete(versions, versionsToKeep) versionIdsToDelete := getVersionIDsToDelete(versions, versionsToKeep)
versionIdsToDeleteStr := getVersionIDsToDeleteStr(versionIdsToDelete) if len(versionIdsToDelete) > 0 {
deleteExpiredSql := fmt.Sprintf("DELETE FROM dashboard_version WHERE id IN (%v)", strings.Join(versionIdsToDeleteStr, ", ")) deleteExpiredSql := `DELETE FROM dashboard_version WHERE id IN (?` + strings.Repeat(",?", len(versionIdsToDelete)-1) + `)`
expiredResponse, err := x.Exec(deleteExpiredSql) expiredResponse, err := sess.Exec(deleteExpiredSql, versionIdsToDelete...)
if err != nil { if err != nil {
return err return err
}
expiredCount, _ = expiredResponse.RowsAffected()
} }
expiredCount, _ = expiredResponse.RowsAffected()
} }
sqlog.Debug("Deleted old/expired dashboard versions", "expired", expiredCount) sqlog.Debug("Deleted old/expired dashboard versions", "expired", expiredCount)
@ -110,48 +110,26 @@ type DashboardVersionExp struct {
Version int `json:"version"` Version int `json:"version"`
} }
// Implement sort.Interface for []DashboardVersionExp (sort by Version field) func getVersionIDsToDelete(versions []DashboardVersionExp, versionsToKeep int) []interface{} {
type ByVersion []DashboardVersionExp versionIds := make([]interface{}, 0)
func (v ByVersion) Len() int { if len(versions) == 0 {
return len(v) return versionIds
}
func (v ByVersion) Swap(i, j int) {
v[i], v[j] = v[j], v[i]
}
func (v ByVersion) Less(i, j int) bool {
return v[i].Version < v[j].Version
}
func getVersionIDsToDelete(versions []DashboardVersionExp, versionsToKeep int) []int64 {
dashboards := make(map[int64][]DashboardVersionExp)
for _, v := range versions {
elem, present := dashboards[v.DashboardId]
if present {
dashboards[v.DashboardId] = append(elem, v)
} else {
dashboards[v.DashboardId] = []DashboardVersionExp{v}
}
} }
versionIds := make([]int64, 0) currentDashboard := versions[0].DashboardId
for dashboard_id, versions := range dashboards { count := 0
sort.Sort(sort.Reverse(ByVersion(versions))) for _, v := range versions {
dashboards[dashboard_id] = versions[versionsToKeep:] if v.DashboardId == currentDashboard {
for _, ver := range dashboards[dashboard_id] { count++
versionIds = append(versionIds, ver.Id) } else {
count = 1
currentDashboard = v.DashboardId
}
if count > versionsToKeep {
versionIds = append(versionIds, v.Id)
} }
} }
return versionIds return versionIds
} }
func getVersionIDsToDeleteStr(versionIds []int64) []string {
var versionIdsToDeleteStr []string
for _, versionId := range versionIds {
versionIdsToDeleteStr = append(versionIdsToDeleteStr, strconv.FormatInt(versionId, 10))
}
return versionIdsToDeleteStr
}

View File

@ -523,7 +523,7 @@ func NewConfigContext(args *CommandLineArgs) error {
// read dashboard settings // read dashboard settings
dashboards := Cfg.Section("dashboards") dashboards := Cfg.Section("dashboards")
DashboardVersionsToKeep = dashboards.Key("snapshot_TTL_days").MustInt(20) DashboardVersionsToKeep = dashboards.Key("versions_to_keep").MustInt(20)
// read data source proxy white list // read data source proxy white list
DataProxyWhiteList = make(map[string]bool) DataProxyWhiteList = make(map[string]bool)