From 6294c57704801ee350af28620c9b2e1775f7d443 Mon Sep 17 00:00:00 2001 From: kolaente Date: Sat, 10 Oct 2020 13:17:20 +0200 Subject: [PATCH] Use keyvalue for metrics --- pkg/metrics/active_users.go | 28 +++++----------------------- pkg/metrics/metrics.go | 25 ++++++++++++------------- pkg/modules/keyvalue/keyvalue.go | 10 ++++++++++ pkg/routes/metrics.go | 4 ---- 4 files changed, 27 insertions(+), 40 deletions(-) diff --git a/pkg/metrics/active_users.go b/pkg/metrics/active_users.go index af3c72821..328be356d 100644 --- a/pkg/metrics/active_users.go +++ b/pkg/metrics/active_users.go @@ -17,10 +17,9 @@ package metrics import ( - "bytes" "code.vikunja.io/api/pkg/log" + "code.vikunja.io/api/pkg/modules/keyvalue" "code.vikunja.io/web" - "encoding/gob" "github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus/promauto" "sync" @@ -91,36 +90,19 @@ func SetUserActive(a web.Auth) (err error) { // getActiveUsers returns the active users from redis func getActiveUsers() (users activeUsersMap, err error) { - - activeUsersR, err := r.Get(ActiveUsersKey).Bytes() - if err != nil { - if err.Error() == "redis: nil" { - return users, nil - } - return - } - - var b bytes.Buffer - _, err = b.Write(activeUsersR) + u, err := keyvalue.Get(ActiveUsersKey) if err != nil { return nil, err } - d := gob.NewDecoder(&b) - if err := d.Decode(&users); err != nil { - return nil, err - } + + users = u.(activeUsersMap) return } // PushActiveUsers pushed the content of the activeUsers map to redis func PushActiveUsers() (err error) { - var b bytes.Buffer - e := gob.NewEncoder(&b) activeUsers.mutex.Lock() defer activeUsers.mutex.Unlock() - if err := e.Encode(activeUsers.users); err != nil { - return err - } - return r.Set(ActiveUsersKey, b.Bytes(), 0).Err() + return keyvalue.Put(ActiveUsersKey, activeUsers.users) } diff --git a/pkg/metrics/metrics.go b/pkg/metrics/metrics.go index 715543ef8..0d1a953d9 100644 --- a/pkg/metrics/metrics.go +++ b/pkg/metrics/metrics.go @@ -19,14 +19,12 @@ package metrics import ( "code.vikunja.io/api/pkg/config" "code.vikunja.io/api/pkg/log" - "code.vikunja.io/api/pkg/red" - "github.com/go-redis/redis/v7" + "code.vikunja.io/api/pkg/modules/keyvalue" + e "code.vikunja.io/api/pkg/modules/keyvalue/error" "github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus/promauto" ) -var r *redis.Client - const ( // ListCountKey is the name of the key in which we save the list count ListCountKey = `listcount` @@ -46,8 +44,6 @@ const ( // InitMetrics Initializes the metrics func InitMetrics() { - r = red.GetRedis() - // init active users, sometimes we'll have garbage from previous runs in redis instead if err := PushActiveUsers(); err != nil { log.Fatalf("Could not set initial count for active users, error was %s", err) @@ -101,18 +97,21 @@ func InitMetrics() { // GetCount returns the current count from redis func GetCount(key string) (count int64, err error) { - count, err = r.Get(key).Int64() - if err != nil && err.Error() != "redis: nil" { - return + cnt, err := keyvalue.Get(key) + if err != nil { + if e.IsErrValueNotFoundForKey(err) { + return 0, nil + } + return 0, err } - err = nil + count = cnt.(int64) return } // SetCount sets the list count to a given value func SetCount(count int64, key string) error { - return r.Set(key, count, 0).Err() + return keyvalue.Put(key, count) } // UpdateCount updates a count with a given amount @@ -121,13 +120,13 @@ func UpdateCount(update int64, key string) { return } if update > 0 { - err := r.IncrBy(key, update).Err() + err := keyvalue.IncrBy(key, update) if err != nil { log.Error(err.Error()) } } if update < 0 { - err := r.DecrBy(key, update).Err() + err := keyvalue.DecrBy(key, update) if err != nil { log.Error(err.Error()) } diff --git a/pkg/modules/keyvalue/keyvalue.go b/pkg/modules/keyvalue/keyvalue.go index b2371c9ea..d27f2db51 100644 --- a/pkg/modules/keyvalue/keyvalue.go +++ b/pkg/modules/keyvalue/keyvalue.go @@ -59,3 +59,13 @@ func Get(key string) (value interface{}, err error) { func Del(key string) (err error) { return store.Del(key) } + +// IncrBy increases a value at key by the amount in update +func IncrBy(key string, update int64) (err error) { + return store.IncrBy(key, update) +} + +// DecrBy increases a value at key by the amount in update +func DecrBy(key string, update int64) (err error) { + return store.DecrBy(key, update) +} diff --git a/pkg/routes/metrics.go b/pkg/routes/metrics.go index a0a9031c7..61722f069 100644 --- a/pkg/routes/metrics.go +++ b/pkg/routes/metrics.go @@ -33,10 +33,6 @@ func setupMetrics(a *echo.Group) { return } - if !config.RedisEnabled.GetBool() { - log.Fatal("You have to enable redis in order to use metrics") - } - metrics.InitMetrics() type countable struct {